Oceanbase数据库版本:5.7.25-OceanBase_CE-v4.3.5.3
部署方式:三台服务器,分布式部署,分为zone1、zone2、zone3
zone1:192.168.0.158
zone2:192.168.2.221
zone3:192.168.3.2
创建租户语句:
CREATE RESOURCE UNIT myunit_1
MEMORY_SIZE = '32000M',
MAX_CPU = 10, MIN_CPU = 10,
LOG_DISK_SIZE = '70G';
CREATE RESOURCE POOL mq_pool_01
UNIT='myunit_1',
UNIT_NUM=1,
ZONE_LIST=('zone1','zone2','zone3');
CREATE TENANT IF NOT EXISTS mytenant PRIMARY_ZONE='zone1,zone2,zone3', RESOURCE_POOL_LIST=('mq_pool_01') set OB_TCP_INVITED_NODES='%';
导入1384张表后,表的分布如下:
查看所有表的Leader分布:
192.168.0.158(462张表)
192.168.2.221(461张表)
192.168.3.2(461张表)
其中三张表的Leader分布:
possalegood:192.168.2.221
possaleorder:192.168.3.2
possalepay:192.168.0.158
测试非事务插入表语句:
insert into possalegood values -- 值列表
insert into possaleorder values -- 值列表
insert into possalepay values -- 值列表
查看GV$OB_SQL_AUDIT审计
SVR_IP | PLAN_ID | QUERY_SQL | PLAN_TYPE | TX_ID |
---|---|---|---|---|
192.168.0.158 | 12636 | INSERT INTO damingfu .possalepay
|
1 | 31064 |
192.168.2.221 | 627 | INSERT INTO damingfu .possalegood
|
1 | 83289 |
192.168.3.2 | 443 | INSERT INTO damingfu .possaleorder
|
1 | 43167 |
测试事务插入表语句:
begin;
insert into possalegood values -- 值列表
insert into possaleorder values -- 值列表
insert into possalepay values -- 值列表
end
查看GV$OB_SQL_AUDIT审计
SVR_IP | PLAN_ID | QUERY_SQL | PLAN_TYPE | TX_ID |
---|---|---|---|---|
192.168.0.158 | 12636 | INSERT INTO damingfu .possalepay
|
1 | 29932 |
192.168.2.221 | 12598 | INSERT INTO damingfu .possalegood
|
1 | 29932 |
192.168.3.2 | 420 | INSERT INTO damingfu .possaleorder
|
1 | 29932 |
客户端连接方式,通过OBProxy的2883端口连接集群执行SQL语句
我的疑问:
1.按照这三张表的Leader分布,他们分别在三个不同的zone,做事务插入的时候为什么没有产生分布式事务(根据audit查询,PLAN_TYPE 是1,文档说明1、2、3 分别表示 Local 、Remote 、Distribute 执行计划)
2.为什么三个insert语句的SVR_IP不同,但是PLAN_TYPE却又是1(表示Local本地事务)呢
3.事务是如何完成的,三次插入是在同一台机器上完成的?如果是的话,Leader的作用的含义我自己的理解就比较模糊了。分布式事务到底是什么情况下会触发。
4.既然采用多Zone的话会不可避免的产生分布式事务(我们是ERP系统,一个修改或插入事务涉及到的表关系错综复杂),而分布式事务的性能又低于本地事务,那有什么方法规避这个问题麽?还是我们这样的业务和这样的部署方式并不是Oceanbase说提倡的最优方式?
注:经过各种查询,了解到的信息是Audit中的PLAN_TYPE指的是语句执行所在机器上是否是本地执行,而不代表整个事务是不是本地执行,这样倒也能解释的通,ODP把语句发送到各自Leader所在的机器上,他们只在所在机器上单机执行力,所以为显示未1
5.那么到底什么样的部署环境,什么样的数据会导致Audit表中的PLAN_TYPE 为2或3
6.如何在语句执行后查看一个事务整体到底是不是分布式事务,Audit中的PLAN_TYPE 只能代表事务中的单条语句的类型
7.分布式事务到底相对于本机事务损耗多少,有什么规则和计算方法麽,或者感知是不是明显?