9.2.2 子表复制与负载均衡
RootServer中有两种操作都可能触发子表迁移:子表复制(rereplication)以及负载均衡(rebalance)。当某些ChunkServer下线超过一段时间后,为了防止数据丢失,需要拷贝副本数小于阀值的子表,另外,系统也需要定期执行负载均衡,将子表从负载较高的机器迁移到负载较低的机器。
每台ChunkServer记录了子表迁移相关信息,包括:ChunkServer上子表的个数以及所有子表的大小总和,正在迁入的子表个数、正在迁出的子表个数以及子表迁移任务列表。RootServer包含一个专门的线程定期执行子表复制与负载均衡任务,步骤如下:
1)子表复制:扫描RootTable中的子表,如果某个子表的副本数小于阀值,选取某台包含子表副本的ChunkServer为迁移源,另外一台符合要求的ChunkServer为迁移目的地,生成子表迁移任务。迁移目的地需要符合一些条件,比如,不包含待迁移子表,服务的子表个数小于平均个数减去可容忍个数(默认值为10),正在进行的迁移任务不超过阀值等。
2)负载均衡:扫描RootTable中的子表,如果某台ChunkServer包含的某个表格的子表个数超过平均个数以及可容忍个数(默认值为10)之和,以这台ChunkServer为迁移源,并选择一台符合要求的ChunkServer,生成子表迁移任务。
子表复制以及负载均衡生成的子表迁移任务并不会立即执行,而是会加入到迁移源的迁移任务列表中,RootServer还有一个后台线程会扫描所有的ChunkServer,接着执行每台ChunkServer的迁移任务列表中保存的迁移任务。子表迁移时限制了每台ChunkServer同时进行的最大迁入和迁出任务数,从而防止一台新的ChunkServer刚上线时,迁入大量子表而负载过高。
例9-1 某OceanBase集群包含4台ChunkServer:ChunkServer1(包含子表A1、A2、A3),ChunkServer2(包含子表A3、A4),ChunkServer3(包含子表A2),ChunkServer4(包含子表A4)。
假设子表副本数配置为2,最多能够容忍的不均衡子表的个数为0。RootServer后台线程首先执行子表复制,发现子表A1只有一个副本,于是,将ChunkServer1作为迁移源,选择某台ChunkServer(假设为ChunkServer3)作为迁移目的,生成迁移任务<ChunkServer1,ChunkServer3,A1>。接着,执行负载均衡,发现ChunkServer1包含3个子表,超过平均值(平均值为2),而ChunkServer4包含的子表个数小于平均值,于是,将ChunkServer1作为迁移源,ChunkServer4作为迁移目的,选择某个子表(假设为A2),生成迁移任务<ChunkServer1,ChunkServer4,A2>。如果迁移成功,A2将包含3个副本,可以通知ChunkServer1删除上面的A2副本。最后,tablet分布情况为:ChunkServer1(包含tablet A1、A3),ChunkServer2(包含tablet A3、A4),ChunkServer3(包含tablet A1、A2),ChunkServer4(包含tablet A2、A4),每个tablet包含2个副本,且平均分布在4台ChunkServer上。