我正在试验mongo sharding
。该集合的分片键为{policyId,startTime}
。
policyId - java UUID (limited values,lets say 50)
startTime - monotonically increasing time.
在集合中插入30M(32 GB)
个文档后:以下是数据分发:
shard key: { "policyId" : 1, "startDate" : 1 }
unique: false
balancing: true
chunks:
sharda 63
shardb 138
在插入过程中sh.isBalancerRunning()
提供了错误的'结果。当我停止插入更多文档时,平衡器开始移动块。之后,我得到了均匀的数据分发。
以下是我对平衡器的疑虑/问题:
1.如果停止在db中插入,则只有平衡器处于活动状态并开始移动块。如果我在更长的时间内插入更多数据,这将创建更多的块,数据将更加倾斜。块迁移本身需要更多时间来平衡分片。那么mongo如何决定何时migrate chunks
?
2.如果在write latency
文档之后插入数据,我可以注意20M
中的峰值。这是否意味着平衡器间歇性地移动一些块?
3.计数API在块迁移期间给出不一致的结果,因为平衡器将块从一个碎片复制到另一个碎片并删除旧块。我们是否应该期望Find API
也会提供错误的结果(重复的文档)?
如果可能,任何人都可以共享mongo balancer的任何文档/博客,以便更好地理解。
答案 0 :(得分:0)
假设是错误的(即如果在db中插入停止,则只有平衡器处于活动状态并开始移动块)。当分片中分片集合的块分布不均匀时,平衡器进程会自动迁移块。
迁移不是一个持续或稳定的过程。需要时自动迁移。有关详细信息,请参阅https://docs.mongodb.com/v3.0/core/sharding-balancing/#sharding-migration-thresholds
迁移时读取不会产生错误的结果。不应通过find API获得重复记录。
有关平衡器的更多信息,请参阅https://docs.mongodb.com/manual/core/sharding-balancer-administration/
关于迁移,请参阅https://docs.mongodb.com/v3.0/core/sharding-chunk-migration/