【问题标题】:behaviour of balancer in mongodb shardingmongodb分片中平衡器的行为
【发布时间】:2018-01-23 06:14:21
【问题描述】:

我正在试验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. 如果在20M 文档之后插入数据,我能够注意到write latency 中的峰值。这是否意味着平衡器间歇性地移动一些块?
3. Count API 在块迁移期间给出不一致的结果,因为平衡器将块从一个分片复制到另一个分片并删除旧的块。我们是否应该期望Find API 也会给出不正确的结果(重复文档)?

如果可能的话,任何人都可以为 mongo balancer 分享任何文档/博客,以便更好地理解。

【问题讨论】:

    标签: mongodb sharding


    【解决方案1】:
    1. 假设错误(即如果停止插入 db,则只有平衡器处于活动状态并开始移动块)。当分片集合的块在分片中分布不均匀时,平衡器进程会自动迁移块。

    2. 迁移不是一个连续或稳定的过程。需要时自动迁移。更多详情请参考https://docs.mongodb.com/v3.0/core/sharding-balancing/#sharding-migration-thresholds

    3. 迁移时读取不会给出不正确的结果。不应该通过 find API 来重复记录。

    有关平衡器的更多信息,请参阅https://docs.mongodb.com/manual/core/sharding-balancer-administration/

    关于迁移请参考https://docs.mongodb.com/v3.0/core/sharding-chunk-migration/

    【讨论】:

    • 感谢@ramraj-patel 的回复。我不断地插入数据,直到我们插入大约 30M 的文档。在我的情况下,当我们停止插入更多文档时,只有平衡器开始迁移文档。最终实现了均匀的数据分布,但迁移所有数据需要大量时间。这背后的可能原因是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多