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

标签 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 进程(这些是仲裁器)

我的应用程序连接到 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 数相等。

一些更一般的注释:

  • 在生产中,不建议只使用一个 配置服务器正在运行。如果你失去了这个单一的配置服务器, 集群将变得不可用。查看更多详情 herehere

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

  • 您可以确定哪些查询和进程造成的影响最大 使用一些内置工具加载。 mongostatmongotop 编辑: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/

相关文章:

mongodb - 如何在mgo框架中使用mongodb 3.6的数组过滤器?

sorting - 您如何实现对分布式数据的排序和分页?

javascript - Meteor 你的应用程序崩溃了

mongodb - 覆盖 Labix mgo 中的默认 writeConcern

MongoDB addshard : failed to add 2nd shard

elasticsearch - 启动 Sonar Webservice 失败

mongodb - 断开 MongoDB 节点并自行运行

mongodb - 如何验证分片?

node.js - 如何修复和防止 mongodb 中的重复键错误

node.js - SailsJS 安装 MongoDB 时出错(windows 8 x64)