Oceanbase tablet的作用

【 使用环境 】生产环境 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 关联。

  1. 查看 表的 table_idtablet_id 跟 日志流 LS_ID 关系可以直接研究视图 oceanbase.CDB_OB_TABLE_LOCATIONS

  2. 通过下面 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)
;
2 个赞

OceanBase 数据库 V4.0.0 版本引入了 Tablet 概念来表示实际的数据存储对象。它具备存储数据的能力,支持在机器之间迁移(transfer),是数据均衡的最小单位。最简单的情况下,一个分区对应一个tablet。但是也有特殊情况:

  1. 比如 lob tablet,就是一个分区对应多个 tablet。
  2. 在一个分区( Partition) 中可能包含一个或者多个 Tablet,例如分区的主表对应一个 Tablet,分区的一个局部索引又会对应另一个 Tablet。同一个分区 的所有 Tablet 会强制绑定在一起,保证它们存储在一台机器上。

至于 sstable,它是一个存储单位,同时它还分了很多种,比如 mini sstable、minor sstable、major sstable 等。

  1. 同一行的修改可能存在于不同的 SSTable 中,所以一个分区肯定不是只对应一个 sstable,i.e. 一个分区可以对应多个 SSTable。
  2. 那么一个 SSTable 里是不是只包含一个分区的数据呢?概念上来说,是这样
    • 但内部实现可能会有一些 trick,比如,4.x 里为了解决小分区空间浪费的问题,实现了将多个小 SSTable 放在了一个 SSTable 宏块中的算法。
    • 从物理数据层面看,这就成了多个分区放在了一个SSTable 中了。
    • 但是,我们把这个当做一个空间优化,概念上依然认为“一个 SSTable 里只包含一个分区的数据”,这样会比较清晰。

总结一下:最简单情况下,可以认为一个分区对应一个Tablet,一个 Tablet对应一个SSTable。更多复杂情况下,这都不一定,对应关系会比较复杂。

4 个赞