Mongodb:向群集添加新分片会为群集增加负载

时间:2012-09-03 15:28:47

标签: mongodb sharding

情况:

以前,我有三台机器: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进程(这些是arbiters)

我的应用程序连接到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运行:

  • shard1(次要),shard2(主要)
  • mongoS

对于旧成员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

1 个答案:

答案 0 :(得分:3)

修改:在聊天讨论后

预计在添加新分片时会有一些开销,至少最初是这样。这是因为需要进行块迁移,这些迁移将使用CPU,磁盘和网络I / O.这将为您的环境增加一些额外的负载。

如果您的读取首选项设置为从辅助节点读取,则10.6服务器可能会很快变得过载,因为它尝试跟上两个副本集的复制(由于块迁移会增加)和来自应用程序的流量本身。可能通过添加更多辅助设备可以减少这种情况,但您需要在与您的生产环境非常相似的环境中对此进行测试。

添加更多分片也可能有所帮助,但您需要再次彻底测试。看来,当您之前添加分片时,块迁移没有完成,因此新分片并没有像应该完成的那样帮助加载。如果您将来要再次添加分片,请通过检查db.getSiblingDB("config").locks.find({"_id":'balancer'})db.printShardingStatus()的输出来确保分块已完成迁移,以查看所有分片中块的数量是否相等。

更一般的说明:

  • 在生产中,不建议只有一个 配置服务器运行。如果你丢失了这个单一的配置服务器,那么 群集将变得无法使用。查看详情[{3}}和here

  • 一般来说,不建议运行两个 同一台计算机上的mongod个实例。两个进程将争夺它们共享的资源,当使用内存映射文件时,尤其如MongoDB那样。

  • 您可以确定哪些查询和进程造成的影响最大 使用一些内置工具加载。 heremongostat 编辑:MongoTop在1.8.2中不可用是两个命令行实用程序,允许您 跟踪mongodb的使用情况。在控制台内部,您也可以运行 mongotop获取有关当前的更多信息 操作。你可以告诉平衡器在做什么(无论是否 它目前通过发行进行平衡 来自db.getSiblingDB("config").locks.find({"_id":'balancer'}) 控制台。

  • 您正在使用非常旧版本的MongoDB。您应该计划更新,如果不是最新的稳定(2.2.0)或最近的(2.0.7),然后更新到您所在分支的最后一个稳定(1.8.5)。自您目前使用的版本以来,对该产品进行了大量修复和改进,这将带来许多好处。