【问题标题】:DB Sharding: Data migration to another machineDB Sharding:数据迁移到另一台机器
【发布时间】:2019-05-18 11:28:45
【问题描述】:

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

假设我们一直在向DB1 进行读取、写入和更新。如何在不停机读/写/更新的情况下进行迁移?

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

但是如果我们想在写入同时发生时做同样的事情呢?

【问题讨论】:

    标签: database database-migration sharding data-migration


    【解决方案1】:

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

    解决方案 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 更好,因为它不会写入两个位置,因此客户端写入请求会更快。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多