9.4.5 定期合并&数据分发
RootServer将UpdateServer上的版本变化信息通知ChunkServer后,ChunkServer将执行定期合并或者数据分发。
如果UpdateServer执行了大版本冻结,ChunkServer将执行定期合并。ChunkServer唤醒若干个定期合并线程(比如10个),每个线程执行如下流程:
1)加锁获取下一个需要定期合并的子表;
2)根据子表的主键范围读取UpdateServer中的修改操作;
3)将每行数据的基线数据和增量数据合并后,产生新的基线数据,并写入到新的SSTable中;
4)更改子表索引信息,指向新的SSTable。
等到ChunkServer上所有的子表定期合并都执行完成后,ChunkServer会向RootServer汇报,RootServer会更新RootTable中记录的子表版本信息。定期合并一般安排在每天凌晨业务低峰期(凌晨1:00开始)执行一次,因此也称为每日合并。另外,定期合并过程中ChunkServer的压力比较大,需要控制合并速度,否则可能影响正常的读取服务。
如果UpdateServer执行了小版本冻结,ChunkServer将执行数据分发。与定期合并不同的是,数据分发只是将UpdateServer冻结的数据缓存到ChunkServer,并不会生成新的SSTable文件。因此,数据分发对ChunkServer造成的压力不大。
数据分发由外部读取请求驱动,当请求ChunkServer上的某个子表时,除了返回使用者需要的数据外,还会在后台生成这个子表的数据分发任务,这个任务会获取UpdateServer中冻结的小版本数据,并缓存在ChunkServer的内存中。如果内存用完,数据分发任务将不再进行。当然,这里可以做一些改进,比如除了将UpdateServer分发的数据存放到ChunkServer的内存中,还可以存储到SSD磁盘中。
例9-6 假设某台ChunkServer上有一个子表t1,t1的主键范围为(1,10],只有一行数据:rowkey=8=>(<2,update,20>,<3,update,30>,<4,update,40>)。UpdateServer的冻结版本有两行更新操作:rowkey=8=>(<2,update,30>,<3,up-date,38>)和rowkey=20=>(<4,update,50>)。
●如果是大版本冻结,那么,ChunkServer上的子表t1执行定期合并后结果为: ro-wkey=8=>(<2,update,30>,<3,update,38>,<4,update,40>);
●如果是小版本冻结,那么,ChunkServer上的子表t1执行数据分发后的结果为: rowkey=8=>(<2,update,20>,<3,update,30>,<4,update,40>,<2,update,30>,<3,update,38>)。