官网中有如下描述:当租户有扩容操作,获得更多服务器资源时,均衡层会将租户内已有的日志流进行分裂,并选择合适数量的Tablet一同分裂到新的日志流中,再将新日志流迁移到新增的服务器上。一个partition中可能包含一个或者多个tablet,包含tablet的个数主要取决于局部索引的数量以及表中是否包含lob
(1)日志流如何分裂?
(2)选择合适数量的Tablet——怎么判断数量是否合适?
(3)tablet不是固定大小的吗?
(4)如果一个表是哈希分布,那增加节点的话,岂不是所有数据都要重新分布?
举个例子:集群是3-3-3架构,租户是1-1-1,把3个zone的该租户的unit_num增大为2,进行扩容,扩容后是2-2-2。
(1)日志流如何分裂: 租户扩容后,以分区为单位进行迁移到扩容后的observer中,分区的迁移在存储级别是以tablet为单元并发迁移的。分区迁移完成后,日志流会从原来的observer迁移到扩容的observer的unit单元内(每个observer写自己的clog)。 原来1-1-1架构的日志流,由于分区迁移到扩容observer的unit中,那么扩容的observer也就有了该租户的redo日志流和相关的tablet,这就是分裂。
(2)选择合适数量的Tablet——怎么判断数量是否合适?
oceabase根据每个资源单元(unit)的 CPU、磁盘使用量、内存使用量以及 IOPS 使用情况,进行负载均衡,分区的数据量不同,对应的tablet数量也不同,所以OB会选择合适数据的Tablet。
(3)tablet的大小不固定。根据分区内行数据的变化,tablet也会变化。比如新建一张空表,tablet_size的大小会有一个初始化,tablet的数量是一个,随着分区内数量的增加,tablet_size和tablet的数量都会变化
(4)如果一个表是哈希分布,那增加节点的话,岂不是所有数据都要重新分布?
数据不会重新分布。增加了节点,是unit单元迁移,不是哈希分区的行迁移。如果1-1-1时有一个64个分区的hash table,扩容到2-2-2,64个分区就会根据各种负载,分布到不同的observer中,不考虑副本,拿单zone来说就是 ,单zone中2个observer可能各存放32个分区。
以上是个人理解,可以参考,如有不对,请批评指出
可以贴一下对应官方文档的链接吗? 这是基于哪个版本的。日志流的分裂逻辑目前没有对外发布,你这边是在哪里看到的
tablet的大小不固定——那岂不是有些tablet有些会很大?导致迁移慢?
tablet 过于庞大 就的考虑分区了。
(1)所以数据均衡的单位是partition,而不是tablet?partition有大小限制吗?
(2)为了避免扩容迁移数据太多,需要人为有意识的控制partition的大小?这么不智能吗?
tablet的大小,是根据每日合并时,增量数据占总数据的百分比变化的。 这个tablet的大小会影响到 检索和合并。太小检索基线数据会慢,太大每日合并的数据就会很大。
分布式存储引擎的大致结构如下:分区(逻辑)–> tablet(sstable的分片)–>宏块 → 微块