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