架构师分享:RocksDB使用技巧之分布式存储扩容演进( 二 )


另外,Compaction过多、过重造成level 0层的文件无法快速沉淀到level 1,而同时数据迁移使得新节点RocksDB的写入速度又很快,这就导致level 0中的文件个数很容易就超过阈值level0_stop_writes_trigger,这时则会发生write stall,也就是停写,这时就会严重影响写服务 。
5. 扩容方式演进
根据前面的问题描述,我们深入分析了RocksDB Compaction的特点,提出了两点改进思路:
1. 扩容过程中,所有待迁移Slot的全量数据和增量数据要分开传输 。
当大量的有序数据写入RocksDB时,由于多个sst文件之间,完全不会出现Key存在交集的情况,所以其进行的Compaction只是move到下一个level,这个速度很快,而且占用IO极少 。所以我们利用这一点,选择把所有Slot的全量数据放在一起迁移,这期间不会有增量数据的打扰,在整体上可以看做是有序的数据 。这就使得在迁移速度很快的时候,也不会占用大量的IO 。而增量数据毕竟是少数,这个过程可以在全量数据传输完成后,以较慢的速度来传输 。
2. 考虑到大量数据传输可能会影响线上的服务质量,所以我们决定不再采取每一个Slot数据传输完成后就使其提供线上服务的方案,而是等所有Slot数据都迁移完成之后,再统一提供服务 。
根据以上分析,我们最终将扩容分为了3个大的阶段:
1. 全量数据迁移;
2. 增量数据迁移;
3. 路由信息统一切换 。
整体流程如下图所示:
 

架构师分享:RocksDB使用技巧之分布式存储扩容演进

文章插图
 
 
经过上述扩容方式的改进,目前线上WTable集群已经可以进行较高速的扩容,比如50~100MB/s,并且在整个流程中不会对线上服务有任何影响 。
6. 其他
在制定方案之初,我们也调研过其他的方案,比如老节点传输sst文件给新节点,后者通过IngestExternalFile的方式将sst文件导入RocksDB 。
但是WTable的主备同步是通过Binlog进行的,而当主机通过IngestExternalFile的方式导入数据时,并不会有Binlog产生,也就无法通过正常流程同步数据给备机 。因此如果以此方式实现数据迁移,需要增加新的主备同步方式,这对原有流程是一个破坏,另外也需要比较大的工作量,效率方面也无法保证 。
因此我们最终利用RocksDB Compaction的特点设计了适合WTable的快速扩容方案,解决了这个痛点 。

【架构师分享:RocksDB使用技巧之分布式存储扩容演进】


推荐阅读