在 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打交道的主要是存储层。