【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OB
【 使用版本 】
【问题描述】oceabase的分区是资源调度的最小单位,那tablet的作用是什么呢,如果一个分区过大会不会在物理上进行分裂,分区、tablet以及sstable的关系是什么?
【复现路径】问题出现前后相关操作
【问题现象及影响】
【附件】
【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OB
【 使用版本 】
【问题描述】oceabase的分区是资源调度的最小单位,那tablet的作用是什么呢,如果一个分区过大会不会在物理上进行分裂,分区、tablet以及sstable的关系是什么?
【复现路径】问题出现前后相关操作
【问题现象及影响】
【附件】
tablet是分片,具备存储数据的能力,支持在机器之间迁移(transfer),是数据均衡的最小单位。
分区包括多个分片.
sstable是基线数据,会包含多个tablet.分区分裂和合并根据分区规则.
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000034087 可以参考下文档
就是一个分区在物理上会分为一个个128M的tablet吗
那tablet是调度单元还是分区是一个最基本的调度单元呢
tablet
官网文档解释的太少。从现有的文档和实测观察看 tablet 跟 分区是一一对应的。 这个跟那个 tablet_size 128MB 好像没有关系。
如果猜的不对,欢迎指出。
OB 表 的数据和索引在内部一直是两个 table_id
,表和索引有自己的独立的分区。如果表和索引还经过分区了,则有更多的分区。然后每个分区对应一个 tablet
。每个 tablet
直接跟一个 LS_ID
关联。
查看 表的 table_id
、tablet_id
跟 日志流 LS_ID
关系可以直接研究视图 oceanbase.CDB_OB_TABLE_LOCATIONS
。
通过下面 SQL 。
WITH table_locs AS (
SELECT
t.tenant_id,
t.database_name,
t.table_id,
t.table_name,
t.table_type tablet_type,
t.tablet_id,
REPLACE(concat(t.table_name,':',t.partition_name,':',t.subpartition_name),':NULL','') tablet_name,
t.tablegroup_name,
t.ls_id,
t.ZONE,
t.ROLE,
t.svr_ip
FROM
oceanbase.CDB_OB_TABLE_LOCATIONS t
WHERE
t.data_table_id IS NULL
UNION
SELECT
i.tenant_id,
i.database_name,
i.table_id,
t.table_name,
i.table_type tablet_type,
i.tablet_id,
REPLACE(
REPLACE(concat(i.table_name,':',i.partition_name,':',i.subpartition_name) ,concat('__idx_', i.data_table_id, '_'),'')
,':NULL',''
) tablet_name,
i.tablegroup_name,
i.ls_id,
i.ZONE,
i.ROLE,
i.svr_ip
FROM
oceanbase.CDB_OB_TABLE_LOCATIONS i
INNER JOIN oceanbase.__all_virtual_table t ON
( i.tenant_id = t.tenant_id
AND i.data_table_id = t.table_id )
WHERE i.data_table_id IS NOT NULL
)
SELECT
t.tenant_id,
t.database_name,
t.table_id,
t.table_name,
t.tablet_type,
t.tablet_id,
t.tablet_name,
t.tablegroup_name,
t.ls_id,
t.ZONE,
t.ROLE,
t.svr_ip
FROM
table_locs t
WHERE
t.tenant_id = 1004
AND t.database_name IN ('tpccdb')
AND t.table_name IN ('bmsql_oorder')
AND t.ROLE IN ('LEADER')
ORDER BY
t.tenant_id,
t.ls_id,
t.database_name,
t.table_id,
t.tablet_id,
t.ZONE
;
tenant_id | database_name | table_id | table_name | tablet_type | tablet_id | tablet_name | tablegroup_name | ls_id | ZONE | ROLE | svr_ip |
---|---|---|---|---|---|---|---|---|---|---|---|
1004 | tpccdb | 500025 | bmsql_oorder | USER TABLE | 200016 | bmsql_oorder:p0 | tpccdb | 1001 | zone1 | LEADER | 10.0.0.66 |
1004 | tpccdb | 500025 | bmsql_oorder | USER TABLE | 200017 | bmsql_oorder:p1 | tpccdb | 1001 | zone1 | LEADER | 10.0.0.66 |
1004 | tpccdb | 500049 | bmsql_oorder | INDEX | 1152921504606846977 | bmsql_oorder_idx1:p0 | 1001 | zone1 | LEADER | 10.0.0.66 | |
1004 | tpccdb | 500049 | bmsql_oorder | INDEX | 1152921504606846978 | bmsql_oorder_idx1:p1 | 1001 | zone1 | LEADER | 10.0.0.66 | |
1004 | tpccdb | 500025 | bmsql_oorder | USER TABLE | 200018 | bmsql_oorder:p2 | tpccdb | 1003 | zone2 | LEADER | 10.0.0.70 |
1004 | tpccdb | 500025 | bmsql_oorder | USER TABLE | 200019 | bmsql_oorder:p3 | tpccdb | 1003 | zone2 | LEADER | 10.0.0.70 |
1004 | tpccdb | 500049 | bmsql_oorder | INDEX | 1152921504606846979 | bmsql_oorder_idx1:p2 | 1003 | zone2 | LEADER | 10.0.0.70 | |
1004 | tpccdb | 500049 | bmsql_oorder | INDEX | 1152921504606846980 | bmsql_oorder_idx1:p3 | 1003 | zone2 | LEADER | 10.0.0.70 | |
1004 | tpccdb | 500051 | bmsql_oorder | INDEX | 1152921504606846981 | bmsql_oorder_idx2 | 1003 | zone2 | LEADER | 10.0.0.70 |
上面表结构定义是:
CREATE TABLE `bmsql_oorder` (
`o_w_id` int(11) NOT NULL,
`o_d_id` int(11) NOT NULL,
`o_id` int(11) NOT NULL,
`o_c_id` int(11) DEFAULT NULL,
`o_carrier_id` int(11) DEFAULT NULL,
`o_ol_cnt` int(11) DEFAULT NULL,
`o_all_local` int(11) DEFAULT NULL,
`o_entry_d` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`o_w_id`, `o_d_id`, `o_id`),
UNIQUE KEY `bmsql_oorder_idx1` (`o_w_id`, `o_d_id`, `o_carrier_id`, `o_id`) BLOCK_SIZE 16384 LOCAL,
KEY `bmsql_oorder_idx2` (`o_c_id`, `o_ol_cnt`) BLOCK_SIZE 16384 GLOBAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 2 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 TABLEGROUP = 'tpccdb'
partition by hash(o_w_id)
(partition p0,
partition p1,
partition p2,
partition p3)
;
OceanBase 数据库 V4.0.0 版本引入了 Tablet 概念来表示实际的数据存储对象。它具备存储数据的能力,支持在机器之间迁移(transfer),是数据均衡的最小单位。最简单的情况下,一个分区对应一个tablet。但是也有特殊情况:
至于 sstable,它是一个存储单位,同时它还分了很多种,比如 mini sstable、minor sstable、major sstable 等。
总结一下:最简单情况下,可以认为一个分区对应一个Tablet,一个 Tablet对应一个SSTable。更多复杂情况下,这都不一定,对应关系会比较复杂。