DB分片:将数据迁移到另一台计算机

时间:2018-12-18 04:24:33

标签: database database-migration sharding data-migration

我有一些数据被分片并保存在DB1上托管的DB2DB3Machine1中。现在,要扩展系统,我需要将分片DB1Machine1移到Machine2。移动完成后,所有分片DB1的请求都将路由到Machine2

假设我们一直在读取,写入和更新DB1。我该如何进行迁移而又没有停机时间来进行读/写/更新?

我们可以在迁移窗口期间将DB1设为只读,然后将数据复制到Machine2。复制完成后,我们可以将流量路由到Machine2并允许写操作。

但是,如果我们想在写操作同时进行同样的操作怎么办?

1 个答案:

答案 0 :(得分:0)

经过一番研究,我发现了几种方法。

解决方案1 ​​

出于将分片复制到另一台物理计算机的目的,请将其分成几个小段。触发脚本以逐段从M1复制到M2。复制期间,将传入的写入复制到M1和M2。

  1. 所有新写入的行也将被写入新副本
  2. 将来将任何未复制的现有段复制到M2时,都将谨慎处理
  3. 对已复制的段的更新也将应用于M2,因为M2也具有该段
  4. 在复制段时阻止写入到特定段。复制完成后,写入即完成,并且与上面的#3相同。
  5. 所有段成功复制后,停止写入M1。此时,M1中的DB1已过时,可以安全地删除。

解决方案2

像以前一样,将碎片分成几个较小的部分。

  1. 安排脚本以逐段细分为M2
  2. 将来将任何未复制的现有段复制到M2时,都将谨慎处理
  3. 对已复制的段进行更新时,将该段标记为脏以再次复制。
  4. 新创建的细分默认情况下标记为脏
  5. 复制完成后,开始另一遍操作以再次复制所有脏块
  6. 重复通过,直到脏块的数量低于某个阈值。到那时,将传入的写入排队(增加写入等待时间),复制剩余的脏块,将排队的写入提交到新计算机,更改配置以写入到M2并开始接受写入。

我觉得解决方案2 更好,因为它不会写到两个地方,因此客户端写请求会更快。