2012-09-03 81 views
3

的情况:MongoDB的:添加新的碎片,以集群添加负载集群

以前,我有三台机器: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 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纪念品,150G磁盘空间,所述netio是光纤。

Shard3 datasize = 16g和Shard4 datasize 15g。

我使用1.8.2

回答

3

编辑:经过讨论聊天

预计会有一些开销增加新的碎片时,至少在最初阶段。这是因为块迁移需要发生,并且这些将使用CPU,磁盘和网络I/O。这会为您的环境增加一些额外的负载。

如果您的阅读首选项设置为从辅助阅读中读取,则10.6服务器可能会很快变得过载,因为它试图跟上两个副本集的复制(这会因块迁移而增加)以及来自应用本身。有可能通过增加更多的次级服务器来减少这种影响,但是您需要在严格模仿您的生产环境的环境中进行测试。

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

一些更普遍的注意事项:

  • 在生产上是不可取的只是一个单一的 配置服务器上运行。如果你失去了这个单一的配置服务器, 集群将变得不可用。查看更多详细信息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)。自从您正在使用该版本以来,已经对该产品进行了多次修复和改进,这将带来许多好处。

+0

追加一个小问题,你认为仲裁器neccesary我用命令:配置= {_ ID: 'shard3',成员:[{_ ID:0,主机: '服务器5:27019',优先:1},{_ id:1,host:'server6:27019'},{_ id:2,host:'server7:27019',arbiterOnly:true}]} server7拥有150g disckspace,所以如果我改变sever7如果更好地分担10.6的阅读压力,从仲裁者到中等。 – Jack

+0

您是否会将10.7上的所有仲裁进程转换为次级进程?如果这样会有很大的开销。如果将读取首选项设置为次级,则在该节点上拥有两个辅助节点可能会帮助读取压力。这是因为每个辅助可能是一个阅读目标,而不仅仅是你现在拥有的单一目标。 –

+0

亲爱的安德烈,我还在广告下添加​​了一条新评论,你看到了吗? 谢谢 – Jack