【问题标题】:DB Sharding: Data migration to another machineDB Sharding:数据迁移到另一台机器
【发布时间】:2019-05-18 11:28:45
【问题描述】:
我有一些数据被分片并保存在Machine1 上托管的DB1、DB2 和DB3。现在,为了扩展系统,我需要将分片DB1 从Machine1 移动到Machine2。移动完成后,所有对分片DB1 的请求都将路由到Machine2。
假设我们一直在向DB1 进行读取、写入和更新。如何在不停机读/写/更新的情况下进行迁移?
我们可以在迁移窗口期间将DB1设为只读,并将数据复制到Machine2。复制完成后,我们可以将流量路由到 Machine2 并允许写入。
但是如果我们想在写入同时发生时做同样的事情呢?
【问题讨论】:
标签:
database
database-migration
sharding
data-migration
【解决方案1】:
经过一些研究,我发现了几种方法。
解决方案 1
为了将分片复制到另一台物理机器,请将其分成几个小段。触发脚本从 M1 到 M2 逐段复制。在复制过程中,将传入的写入复制到 M1 和 M2。
- 所有新写入的行也将写入新副本
- 在将来将该段复制到 M2 时,将对尚未复制的现有段进行任何更新
- 对已复制段的更新也将应用于 M2,因为 M2 也有该段
- 在复制段时阻止写入特定段。复制完成后,写入就完成了,和上面的#3一样。
- 成功复制所有段后,停止对 M1 的写入。此时,M1 中的 DB1 已过时,可以安全删除。
解决方案 2
和以前一样,将分片分成几个更小的部分。
- 安排脚本分段到 M2
- 在将来将该段复制到 M2 时,将对尚未复制的现有段进行任何更新
- 当对已复制的段进行更新时,将该段标记为脏,以便再次复制。
- 新创建的段默认标记为脏
- 复制完成后,再次开始复制所有脏块
- 重复遍历,直到脏块数低于某个阈值。此时,将传入的写入排队(增加写入延迟),复制剩余的脏块,将排队的写入提交到新机器,将配置更改为写入 M2 并开始接受写入。
我觉得解决方案 2 更好,因为它不会写入两个位置,因此客户端写入请求会更快。