3

情况:

之前我有三台机器: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 运行:

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

对于老成员 10.10.10.7,我还添加了 shard1、shard2 仲裁器。

问题是当我添加两台新机器时(使用 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都有相同的资源:4CPUS,6g Mem,150G diskspace,netio是光纤。

Shard3 数据大小=16g 和 Shard4 数据大小 15g。

我正在使用 1.8.2

4

1 回答 1

3

编辑:在聊天中讨论后

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

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

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

一些更一般的注释:

  • 在生产中,不建议只运行一个配置服务器。如果您丢失了这个单一的配置服务器,集群将变得不可用。在此处此处查看更多详细信息

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

  • 您可以使用一些内置工具来确定哪些查询和进程导致的负载最大。 mongostat编辑:MongoTop 在 1.8.2 中不可用是两个命令行实用程序,可让您跟踪. 在控制台内部,您还可以运行 以获取有关当前操作的更多信息。您可以通过从控制台发出来判断平衡器正在做什么(当前是否正在执行平衡器循环) 。mongotop mongodbdb.currentOp()db.getSiblingDB("config").locks.find({"_id":'balancer'})

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

于 2012-09-04T01:55:30.740 回答