OceanBase4.0 中的 tablet 指的是什么?为什么要有tablet这个概念?

在 OceanBase4. 0 中引入了 tablet 的概念,那么 tablet 具体指的是什么呢?

其实tablet这个东西对于熟悉存储或者数据库的同学,应该并不陌生。早在Google发表BigTable的那个年代就已经出现了tablet的身影,就简单指一张表中的一部分数据行,这个含义到今天为止也依然如此。如果大家翻开OceanBase早期0.4版本的开源代码,其实也有tablet这个对象,在OceanBase0.4的版本,是支持数据表自动分裂的,一张表可以被自动分裂成多个tablet,思想和BigTable如出一辙。但是在OceanBase的后期版本,为了和传统数据库兼容,通过用户自定义partition来做数据分割,这个时候tablet的概念就显得有些多余,因此大家在OceanBase3.1的开源版本上,是找不到tablet对象的,能找到的只有partition。

那么为什么在4.0上要重新引入tablet这个概念呢?

主要目的还是希望将partition的概念与tablet的概念做分割,以达到更好的灵活度。在OceanBase看来,partition是对用户可见的一个逻辑概念,比如对一张表做hash分区还是range分区,具体分多少个分区,都是用户需要感知的;而tablet是对用户不可见的一个物理概念。通常来说,对于一张不带任何索引的非分区表,只会有一个独立的partition,而这个partition也会对应到一个独立的tablet。partition会通过表内唯一的partition id进行标识,而tablet也会通过租户内唯一的tablet id进行标识。从partition id到tablet id会有一个映射关系,来方便SQL做路由。但这个映射关系是可能发生变化的,比如说在发生分区交换的时候,就会对partition id到tablet id的映射关系进行修改。(不过目前分区交换这个功能还未实现)

partition和tablet的对应关系是怎样的?

一个partition中可能包含一个或者多个tablet,包含tablet的个数主要取决于局部索引的数量以及表中是否包含lob。对于每个partition,每增加一个局部索引,就会增加一个tablet。如果表中还包含lob对象,那么还会再多两个tablet。

总结

partition是用户感知的逻辑单位,是OceanBase做负载均衡的最小单位,和partition打交道的主要是SQL层。tablet是用户不感知的物理概念,是OceanBase做compaction的最小单位,和tablet打交道的主要是存储层。

3 个赞

提个问题,在我理解中tablet是兼容了数据表水平拆分的能力。但看oceanbase中的设计一个partition中的tablet数量和局部索引数量有关,对于每个partition,每增加一个局部索引,就会增加一个tablet,那岂不是一个tablet还是一个partition完整的数据集吗?

不这逻辑错误了吧。
那这个tablet是心中的局部索引数据,那这就不是完整数据集。
如果是没有任何局部索引,那应该是一个tablet是一个partition完整的数据集

在oceanbase里面是这样,一个tablet里面包含了一套完整的LSM Tree,一套LSM Tree中包含基线sstable、转储sstable、memtable这些。如果一张表没有分区,也没有任何索引,也不包含lob字段,那么这张表就只会有一个tablet。
但如果构建了索引,那么索引表也是一套完整的LSM Tree,所以索引表也会是一个单独的tablet。