首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DB分片:将数据迁移到另一台机器

DB分片:将数据迁移到另一台机器
EN

Stack Overflow用户
提问于 2018-12-18 12:24:33
回答 1查看 45关注 0票数 0

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

假设我们一直有读、写和更新到DB1。如何才能在不中断读/写/更新的情况下进行迁移?

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

但是,如果我们想做同样的事情,同时写入也在发生,该怎么办呢?

EN

回答 1

Stack Overflow用户

发布于 2018-12-28 03:46:37

经过一些研究,我找到了几种方法来做到这一点。

解决方案1

为了将分片复制到另一台物理机,请将其拆分成几个小段。触发脚本将M1中的数据段一段一段地复制到M2中。在进行拷贝时,将传入的写入同时复制到M1和M2。

  1. 所有新写入的行也将写入新拷贝
  2. 将来将该数据段拷贝到M2时,将注意对尚未拷贝的现有数据段的任何更新
  3. 对已拷贝数据段的更新也将应用于M2,因为M2还具有该数据段
  4. 在拷贝特定数据段时阻止对该数据段的写入。复制完成后,写入也将完成,与上面的#3相同。
  5. 成功复制所有数据段后,停止写入M1。此时,M1中的DB1已过时,可以安全地删除。

解决方案2

如前所述,将碎片拆分为几个较小的分段。

  1. 调度脚本逐段复制到M2
  2. 在将来将该段复制到M2时,将注意对尚未复制的现有段的任何更新
  3. 如果已复制的段有更新,请将该段标记为脏以便再次复制。
  4. 新创建的段在默认情况下被标记为脏块H125>复制完成后,开始另一次遍历以再次复制所有脏块
  5. 重复上述步骤,直到脏块的数量低于某个阈值。此时,对传入的写入进行排队(增加写入延迟),拷贝剩余的脏数据块,将排队的写入提交到新计算机,将配置更改为写入到M2,然后开始接受写入。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53826376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档