caosiyang / py-mongo-sync

Oplog-based data sync tool that synchronizes data from a replica set to another deployment, e.g.: standalone, replica set, and sharded cluster.
http://caosiyang.github.io/py-mongo-sync/
MIT License
108 stars 46 forks source link

支持chunk粒度的数据迁移 #21

Closed heroWang closed 6 years ago

heroWang commented 6 years ago

考虑以下场景: 由于错误的shard key 引起数据分布不均匀.一些chunk非常的大,不能被balancer自动迁移, 而且不能够再split.

这种jumbo chunk是否可以通过同步到其他shard.然后修改chunk元数据,重载到mongos的方式迁移chunk?

现在有这个想法要实现一下.但对于修改元数据这个点有些疑惑.请大家给一点意见.非常感谢!!!

caosiyang commented 6 years ago

以前有过类似的需求,但没有实现,简单说下我的思路,不一定对。

  1. 关闭balancer
  2. 根据目标chunk信息,确定目标文档范围
  3. 创建新chunk,目标文档写入新chunk所在shard
  4. 回放oplog,确保新老chunk数据实时同步
  5. 锁定config并更改meta(期间最好禁止读取config,直至更改完毕,但我不知道怎么实现)
heroWang commented 6 years ago

锁定config是为了让写操作等待,从而避免op执行顺序错乱吧? 其实就算不锁定,在运维时间写操作少的时候,并且oplog已经跟上的情况下更新meta,顺序错乱的几率应该很小.

还有个问题,怎么让mongos去更新meta; 我知道可以强制每个mongos flush.有没有别的办法能达到同样的效果呢? 因为我们实在有太多mongos了.

caosiyang commented 6 years ago

是的,让写操作阻塞,直至config更新完成。 不然可能会有这种情况: 比如两个分片s1和s2,原来数据在s1,写入的数据转发至s1,如果在改config时候不阻塞写,在更新meta过程中,有可能一部分数据转发到s1(此时meta尚未更新成功),一部分数据转发到s2(meta更新成功),恰好有一条数据的update在两个阶段都有,然后写入s1的数据通过oplog回放后覆盖s2的update,导致数据不一致。

第二个问题我也不清楚,应该得看源码实现了。

heroWang commented 6 years ago

好的. 谢谢您的认真解答. 如果有需要我会去实现一下这个想法.