副本分配问题

ob:4.2.1.8
三副本

PRIMARY_ZONE 分布如下:


mysql> select * from oceanbase.dba_ob_tenants \G
*************************** 1. row ***************************
                 TENANT_ID: 1008
               TENANT_NAME: tenant1_back
               TENANT_TYPE: USER
               CREATE_TIME: 2025-07-16 16:49:21.711633
               MODIFY_TIME: 2025-07-21 10:04:46.638542
              PRIMARY_ZONE: zone1,zone2;zone3
                  LOCALITY: FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3
         PREVIOUS_LOCALITY: NULL
        COMPATIBILITY_MODE: MYSQL
                    STATUS: NORMAL
             IN_RECYCLEBIN: NO
                    LOCKED: NO
               TENANT_ROLE: PRIMARY
         SWITCHOVER_STATUS: NORMAL
          SWITCHOVER_EPOCH: 1752660879490516
                  SYNC_SCN: 1753063964324060737
            REPLAYABLE_SCN: 1753063964324060737
              READABLE_SCN: 1753063964324060737
        RECOVERY_UNTIL_SCN: 4611686018427387903
                  LOG_MODE: ARCHIVELOG
ARBITRATION_SERVICE_STATUS: DISABLED
                  UNIT_NUM: 1
                COMPATIBLE: 4.2.1.8
                 MAX_LS_ID: 1003
1 row in set (0.01 sec)

表结构如下:

mysql> show create table t1 \G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `C1` int(11) DEFAULT NULL,
  `C2` int(11) DEFAULT NULL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
 partition by hash(c1)
(partition `p0`,
partition `p1`)
1 row in set (0.04 sec)

查看leader分布:


+---------------+------------+------------+----------------+-------+--------------+--------+
| DATABASE_NAME | TABLE_NAME | TABLE_TYPE | PARTITION_NAME | ZONE  | SVR_IP       | ROLE   |
+---------------+------------+------------+----------------+-------+--------------+--------+
| test          | t1         | USER TABLE | p0             | zone2 | 10.xx.xx.221 | LEADER |
| test          | t1         | USER TABLE | p1             | zone2 | 10.xx.xx.221 | LEADER |
+---------------+------------+------------+----------------+-------+--------------+--------+
2 rows in set (0.04 sec)

为什么t1的两个分区leader都分配到zone2上,而不是zone1、zone2上各1个呢?

:innocent:

知道了,原来之前enable_ob_protocol_v2和enable_transaction_internal_routing 这两个参数倍设置成了false,导致leader只能在一个zone上

修后改成true就正常

+---------------+------------+------------+----------------+-------+--------------+--------+
| DATABASE_NAME | TABLE_NAME | TABLE_TYPE | PARTITION_NAME | ZONE  | SVR_IP       | ROLE   |
+---------------+------------+------------+----------------+-------+--------------+--------+
| test          | t1         | USER TABLE | p0             | zone2 | 10.xx.xx.221 | LEADER |
| test          | t1         | USER TABLE | p1             | zone1 | 10.xx.xx.220 | LEADER |
+---------------+------------+------------+----------------+-------+--------------+--------+
2 rows in set (0.01 sec)

先查一下租户的zone优先级

这里有

但是把这个两个参数设置成false,还是分布到两个zone上,有点看不懂

mysql> show proxyconfig like 'enable_ob_protocol_v2' \G
*************************** 1. row ***************************
         name: enable_ob_protocol_v2
        value: False
         info: deprecated, Do not use and not work anymore, use server_protocol instead.
  need_reboot: false
visible_level: USER
        range: 
 config_level: LEVEL_GLOBAL
1 row in set (0.00 sec)

mysql> show proxyconfig like 'enable_transaction_internal_routing' \G
*************************** 1. row ***************************
         name: enable_transaction_internal_routing
        value: False
         info: if enabled, proxy will route the dml statement in a transaction to different servers
  need_reboot: false
visible_level: USER
        range: 
 config_level: LEVEL_GLOBAL
1 row in set (0.00 sec)

+---------------+------------+------------+----------------+-------+--------------+--------+
| DATABASE_NAME | TABLE_NAME | TABLE_TYPE | PARTITION_NAME | ZONE  | SVR_IP       | ROLE   |
+---------------+------------+------------+----------------+-------+--------------+--------+
| test          | t1         | USER TABLE | p0             | zone1 | 10.**.**.220 | LEADER |
| test          | t1         | USER TABLE | p1             | zone2 | 10.**.**.221 | LEADER |
+---------------+------------+------------+----------------+-------+--------------+--------+

查询下当前leader分区的分布,是否已经完全均衡了

学习总结经验 :+1: :+1: :+1:

mysql> select SVR_IP,count(*) from (select DATABASE_NAME,TABLE_NAME,TABLE_TYPE,PARTITION_NAME,ZONE,SVR_IP,ROLE from oceanbase.DBA_OB_TABLE_LOCATIONS where   role='leader'
and  TABLE_TYPE='user table' ) a group by svr_ip;
+--------------+----------+
| SVR_IP       | count(*) |
+--------------+----------+
| 10.**.**.220 |       25 |
| 10.**.**.221 |       22 |
+--------------+----------+
2 rows in set (0.17 sec)

obcp v4的PDF中有一部分试验 无法复现,不知道啥原因,集群环境都是一样的

分区均衡策略的优先级顺序如下:分区属性对齐(table group对齐) > 分区数量均衡 > 分区磁盘均衡
partition_balance_schedule_interval看一下这个参数,调小到10分钟观察一下。

1 个赞

明白,谢谢大佬解惑,我调整下试试,之前确实测试过tablegroup功能,可能不均衡会存在。