MongoDB:出现新分片,但不显示内容。这是预期的吗?

标签 mongodb sharding

我有一个带有 2 个分片 RS1 和 RS2 的 Mongo 集群。 RS1 约 600G (*),RS2 约 460G。几分钟前,我添加了一个新的分片 RS3。当我连接到 mongos 并检查状态时,我看到的是:

mongos> db.printShardingStatus()
--- Sharding Status --- 
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
        {  "_id" : "RS1",  "host" : "RS1/dbs1d1:27018" }
        {  "_id" : "RS2",  "host" : "RS2/dbs1d2:27018" }
        {  "_id" : "RS3",  "host" : "RS3/dbs3a:27018" }
  databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
        {  "_id" : "demo",  "partitioned" : false,  "primary" : "RS1" }
        {  "_id" : "cm_prod",  "partitioned" : true,  "primary" : "RS1" }
                cm_prod.profile_daily_stats chunks:
                                RS2     16
                                RS1     16
                        too many chunks to print, use verbose if you want to force print
                cm_prod.profile_raw_stats chunks:
                                RS2     157
                                RS1     157
                        too many chunks to print, use verbose if you want to force print
                cm_prod.video_latest_stats chunks:
                                RS1     152
                                RS2     153
                        too many chunks to print, use verbose if you want to force print
                cm_prod.video_raw_stats chunks:
                                RS1     3257
                                RS2     3257
                        too many chunks to print, use verbose if you want to force print
          [ ...various unpartitioned DBs snipped...]

所以,新的 RS3 分片出现在分片列表中,但不在“每个分片有多少 block ”的列表中。我本来希望它出现在该列表中,所有分片集合的计数为 0。

如果我想要一点,这种预期的行为会自行解决吗?

最佳答案

它将开始将 block 移动到它上面,是的,事实上,在可预见的将来,它将成为每个 block 移动的默认目标(基本选择是从具有最多 block 的分片移动到具有最少 block 的分片)。每个分片主分片一次只能参与一次迁移,因此要移动这么多 block 需要一些时间,尤其是在其他两个很忙的情况下。

我见过人们关闭平衡器并忘记它的情况。鉴于您的其他 2 个碎片平衡得很好,我认为这里不是这种情况,但以防万一......

您可以通过连接到mongos然后执行以下操作来检查平衡器的状态:

use config;
db.settings.find( { _id : "balancer" } )

确保“已停止”未设置为 true。

查看是什么持有锁,并因此在当时保持平衡:

use config;
db.locks.find({ _id : "balancer" });

最后,要检查平衡器实际在做什么,请查看该机器上的 mongos 日志。平衡器将行输出到以 [Balancer] 为前缀的日志。您还可以在日志中的主要 mongod 实例的日志中查找迁移消息。

编辑:这可能是由 SERVER-7003 引起的- 在 2.2.0 发布后发现的一个错误。如果从源分片迁移的范围( block )中有删除,它有时会导致这种瘫痪,其中所有 block 迁移都被中止并且目标分片似乎总是参与迁移,而实际上它是不是。

由于此问题已在 2.2.1 中得到修复,因此建议通过升级来解决此问题。虽然它可以通过重新启动和/或当目标分片上的错误状态自行解决时解决,如下面的评论中似乎就是这种情况。

关于MongoDB:出现新分片,但不显示内容。这是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207059/

相关文章:

node.js - Mongoose $pull 正在删除嵌套的整个数组而不是数组中的单个值

mysql - NewSQL 与传统优化/分片

MongoDB 复合分片键

mysql - 自动分片 MySQL?

java - 使用 mongo-java-driver 使用 x509 证书对 MongoDB v2.6 进行身份验证时遇到问题

c# - 从文档中获取子元素

MongoDB 使用链接对象聚合管道

postgresql - 使用具有相同 Flask-SQLAlchemy 模型的多个 POSTGRES 数据库和模式

redis - 如何搭建一个简化的redis集群(支持数据分片、负载均衡)?

javascript - 显示存储在 MongoDb 中的图像