image.png
在多机房数据迁移中,整个过程分为三个阶段:历史数据迁移阶段、redolog迁移阶段、实时复制阶段。
历史数据的迁移使用一个队列完成,这个队列由多个线程消费。迁移模块保存一个本dataserver的主桶有序序列,存储引擎顺序按桶扫描所有数据(对ldb引擎来讲,是扫描memtable、immutable memtable和所有的SSTable),并将扫描到的数据放到队列里。主线程会同步等待每个桶的数据同步完成,然后在从机房上打上标签,每次同步前都会判断这个标签,避免重启后历史数据重迁。
由于在历史数据同步时,client又会有新的写入,新写入的key可能已经被扫描过,所以如果不记录这些操作,这部分数据可能会被丢失。
对历史数据迁移来讲,桶有三种状态:已迁移、正在迁移、未迁移 。
redolog只记录“正在迁移”的桶的新写入请求。对于已迁移的桶的新写入请求,把它放到实时迁移队列,对于未迁移的桶的新写入请求,不做特殊处理,因为等到迁移这些桶时,数据已经落到ldb上。
image.png
当一个桶的ldb数据迁移完成时,立即开始迁移新产生的log。迁移log时,也可能会有新的写入,当剩余log很大时,新的写入会追加到log;当剩余log小于一定阈值后,会锁定log,新的写入会被阻塞,直到log迁移完毕后,再将被阻塞的请求放到实时复制队列里。 redolog的迁移使用多个队列,根据请求key的hash值放到不同的队列里,每个队列只有一个消费线程,这样来保证相同key的时序性。
实时复制也使用多个队列,根据请求key的hash值放到不同的队列里,每个队列只有一个消费线程,来保证相同key的时序性。
如上所述,当一个桶的历史数据、redolog迁移完毕后,新的请求就会放到实时队列里。
个人介绍: 高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能互联网架构。