情况:
之前,我有三台机器:10.10.10.5、10.10.10.6、10.10.10.7
10.10.10.5 运行:
- 配置数据库
- mongoS
- shard3、shard4 mongod 进程(这些在它们的分片中是主要的)
10.10.10.6 运行:
- mongoS
- shard3 shard4 mongod 进程(这些在它们的分片中是次要的)
10.10.10.7 运行:
- mongoS
- shard3、shard4 mongod 进程(这些是仲裁器)
我的应用程序连接到 10.10.10.6 mongoS。
在大约一年的时间里,一切都运行良好。然后,10.5 和 10.6 负载非常大,尤其是 10.6。 cpu 使用率和平均负载非常高,所以我计划向集群添加两台新机器。
我创建了两个分片:shard1 和 shard2。新机器10.10.10.8运行:
- shard1(主要),shard2(次要)
- mongoS
新机器10.10.10.9运行:
- 分片 1(次要)、分片 2(主要)
- mongoS
给老成员(member)10.10.10.7我也加了shard1,shard2 arbiters。
问题是,当我添加两台新机器时(使用addShard命令),大约5小时后他们完成了迁移(虽然我不能确定),然后10.10.10.6主机再次具有极高的负载,平均负载约为 90.5(4 个 CPU)。
同时应用程序对10.10.10.6 mongoS有很多读写请求,但很少有数据或没有数据写入新的两台机器。我用iostat发现两台新机器几乎没有io字节。
为什么 10.10.10.6 负载如此之高?
以前即使在高峰时段,最高负载也约为 30.5
那么你们能否请教如何解决负载问题并启动和运行新机器?
编辑:关于我的环境的更多信息
10.5、10.6、10.7、10.8、10.9资源相同:4CPU,6g Mem,150G diskspace,netio是光纤。
Shard3 datasize=16g,Shard4 datasize 15g。
我正在使用 1.8.2
最佳答案
编辑:聊天讨论后
预计在添加新分片时会有一些开销,至少在最初是这样。这是因为需要进行 block 迁移,这些将使用 CPU、磁盘和网络 I/O。这会给您的环境增加一些额外的负载。
如果您的读取首选项设置为从辅助读取,10.6 服务器可能会很快变得过载,因为它试图跟上两个副本集的复制(由于 block 迁移而增加)和来自应用程序的流量本身。通过添加更多辅助节点可能会减少这种情况,但您需要在与您的生产环境非常相似的环境中对此进行测试。
添加更多分片也可能有所帮助,但您需要再次对此进行彻底测试。看起来当您之前添加分片时, block 迁移没有完成,因此新分片并没有像他们应该做的那样帮助解决负载问题。如果您将来要再次添加分片,请通过检查 db.getSiblingDB("config").locks.find({"_id":'balancer'})
确保 block 已完成迁移以及 db.printShardingStatus()
的输出,以查看所有分片的 block 数相等。
一些更一般的注释:
在生产中,不建议只使用一个 配置服务器正在运行。如果你失去了这个单一的配置服务器, 集群将变得不可用。查看更多详情 here和 here
一般来说不建议跑两个
mongod
实例在同一台机器上。两个进程将竞争它们共享的资源,当像 MongoDB 那样使用内存映射文件时尤其如此。您可以确定哪些查询和进程造成的影响最大 使用一些内置工具加载。
mongostat
和mongotop
编辑:MongoTop 在 1.8.2 中不可用 是两个命令行实用程序,可让您 跟踪mongodb
的使用情况。在控制台内,您还可以运行db.currentOp()
获取更多关于当前的信息 手术。你可以知道平衡器在做什么(无论是否 它目前正在做一个平衡轮)通过发行db.getSiblingDB("config").locks.find({"_id":'balancer'})
来自 控制台。您正在运行非常旧版本的 MongoDB。您应该计划更新,如果不是更新到最新的稳定版 (2.2.0) 或最新的 (2.0.7),那么更新到您所在分支的最后一个稳定版 (1.8.5)。自您当前使用的版本以来,已对该产品进行了大量修复和改进,这将带来许多好处。
关于Mongodb:向集群添加新分片会增加集群的负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12250638/