孤立文档对分片集群数据同步的影响
目录
迁移一个分片集群,同步工具是py-mongo-sync,支持复制集同步,趁机安利一下。
跑多个sync进程,源端各shard数据同时写往目标端mongos,全量同步过程使用insert写数据。
有一个分片集合,片键是{ _id: "hashed" }
,全量同步过程中抛出DuplicateKeyError,也就是_id重复。连接源端mongos,查询目标_id文档,读到一条数据,然后依次查询各个shard,发现在两个shard同时存在目标_id文档。
正常来讲,问题不会出在数据写入端,因为片键保证_id唯一,那么只可能是在balance过程中chunk迁移失败导致产生了孤立文档。
所以从shards->mongos的同步方式,发生DuplicateKeyError时,要判断对于同一_id的多个文档,哪条是有效数据,哪条是孤立文档,如果目标端已有的是有效数据,那么忽略,否则要替换为有效数据。要做到这点,需要了解哈希索引所采用的分片规则,通过目标_id的哈希值,定位到目标shard,然后提取有效文档。当然不可忽略的一点是,数据同步前关闭源端的balancer。
还想到一个方法,从源端mongos遍历集合进行全量同步,然后再从源端各个shard去增量同步,这样可以避开孤立文档,但有一个潜在的问题,在于遍历分片集合的内部实现,如果是逐个shard遍历,那么会导致同步效率大幅下降,正所谓鱼和熊掌不可兼得。