如果一张表没建分区,那么这张表的leader 只分布在一台 observer上吗?

【 使用环境 】生产环境
【 OB 】
【 使用版本 】4.0
【问题描述】如果一张表没建分区,那么这张表的leader 只分布在一台 observer上吗?
比如以下这张表test.sbtest1的主,只在172.16.11.136吗?

obclient [oceanbase]> show create table test.sbtest1 \G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` int(11) NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`) BLOCK_SIZE 16384 LOCAL
) AUTO_INCREMENT = 1000001 AUTO_INCREMENT_MODE = 'ORDER' 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
1 row in set (0.014 sec)

obclient [oceanbase]> select * from DBA_OB_TABLE_LOCATIONS where DATABASE_NAME='test'and ROLE<>'FOLLOWER' and TABLE_NAME like '%sbtest1'\G
*************************** 1. row ***************************
    DATABASE_NAME: test
       TABLE_NAME: sbtest1
         TABLE_ID: 500007
       TABLE_TYPE: USER TABLE
   PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
       INDEX_NAME: NULL
    DATA_TABLE_ID: NULL
        TABLET_ID: 200006
            LS_ID: 1003
             ZONE: zone3
           SVR_IP: 172.16.11.136
         SVR_PORT: 2882
             ROLE: LEADER
     REPLICA_TYPE: FULL
1 row in set (0.010 sec)

另外2个节点会存储这个表的副本,这个节点离线了,副本会切主,继续提供服务。

老师,也就是说表不分区,主数据不会分片,只存在于一台机器上吧?

三副本,那就是3台机器都有,只是主副本提供服务。
主副本节点下线了,会自动切主副本到其他节点,提供服务

1 个赞

表不分区,主数据不会自动分片的,表示该表只有一个分区,leader数据只在一个机器上。可以从系统表查看主副本具体的分布信息(1:leader,2:follower):

mysql> select svr_ip, svr_port, c.database_name,a.table_name,b.table_id, b.partition_id,role from __all_virtual_table a, __all_virtual_meta_table b, __all_virtual_database c where a.table_id = b.table_id and a.database_id = c.database_id and a.table_name = 'test_table' and c.database_name = 'db_test';
+---------------+----------+---------------+------------+------------------+--------------+------+
| svr_ip        | svr_port | database_name | table_name | table_id         | partition_id | role |
+---------------+----------+---------------+------------+------------------+--------------+------+
| 192.168.1.150 |     2882 | db_test     | test_table   | 1102810162710028 |            0 |    2 |
| 192.168.1.151 |     2882 | db_test     | test_table   | 1102810162710028 |            0 |    1 |
| 192.168.1.152 |     2882 | db_test     | test_table   | 1102810162710028 |            0 |    2 |
+---------------+----------+---------------+------------+------------------+--------------+------+
3 rows in set (0.10 sec)

老师,如果数据 leader 在 192.168.1.150 上, 若应用直连访问 observer 192.168.1.151 而不是 obproxy,这时observer内部会把请求转发到 192.168.1.150 吗?

可以的,你可以建一个表试下