MongoDB以比独立节点更慢的方式对群集25进行分片

ctp*_*ctp 5 performance replication sharding mongodb

我对这种情况感到困惑,并试图解决这个问题几天了.我在三个3成员副本集(rs0,rs1和rs2)之上运行了3个碎片.到目前为止一切正常.数据分布在3个分片上,并克隆在副本集中.

但是:将数据导入到其中一个副本集中可以正常使用40k docs/s但是通过启用分片可以将整个过程减慢到仅1.5k docs/s.

我通过不同的方法填充数据:

  • 在mongo shell中生成一些随机数据(在我的mongos中运行)
  • 通过mongoimport导入JSON数据
  • 通过mongorestore从另一台服务器恢复MongoDB转储

所有这些都只有1.5k doc/s,令人失望.mongod是物理Xeon盒子,每个32GB,3个配置服务器是虚拟服务器(40 GB HDD,2 GB RAM,如果这很重要),mongos在我的app服务器上运行.顺便说一下,1.5k insert/s的值不依赖于分片键,专用分片键(单字段键和复合键)的相同行为以及_id字段上的散列分片键.

我尝试了很多,甚至重新安装了整个集群两次.问题是:此设置的瓶颈是什么:

  • 配置服务器在虚拟服务器上运行 - >由于配置服务器的资源消耗低,所以不应该有问题
  • mongos? - >在HAproxy后面的专用盒子上运行多个Mongos可能是另一种选择,还没有测试过

Mar*_*erg 4

让我们先计算一下:您的文档有多大?请记住,根据您的写入问题,它们必须通过网络多次传输。

您可能会因为必须建立索引而遇到这种情况。

请尝试这个:

  1. 禁用除for之外的所有索引(无论如何这是不可能的,iirc)_id
  2. 加载您的数据
  3. 重新启用索引。
  4. 启用分片和平衡(如果尚未完成)

无论如何,这是将数据导入共享集群的建议方法,并且应该会大大加快导入速度。一些(谨慎的!)摆弄storage.syncPeriodSecsstorage.journal.commitIntervalMs也可能有帮助。

即使将数据存储在主分片上,也可能会发生延迟。根据索引的大小,它们可能会大大减慢批量操作的速度。您可能还想查看replication.secondaryIndexPrefetch配置选项。

另一件事可能是你的 oplog 被填充的速度比复制发生的速度快。这里的问题是:一旦创建,您就无法增加它的大小。我不确定在独立模式下删除并重新创建它然后重新共享副本集是否安全,但我对此表示怀疑。因此,安全的选择是让实例实际离开副本集,使用更合适的 oplog 大小重新安装它,并将实例添加到副本集,就像第一次一样。如果您不关心数据,只需关闭副本集,调整配置文件中的oplog大小,删除数据目录并重新启动并重新初始化副本集即可。两次思考你的问题,这对我来说听起来是最好的选择,因为 opllog 不涉及独立模式,iirc。

如果您仍然遇到相同的性能问题,我的赌注是磁盘或网络 IO 问题。

您有一个相当标准的设置,您的mongos实例运行在与您不同的机器上mongod(无论是独立的还是副本集的主实例)。您可能需要检查一些事项:

  1. 从运行实例的计算机解析主分片和辅助分片名称的名称解析延迟mongos。我无法计算安装 nscd 提高各种操作性能的次数。
  2. 从您的实例到主分片的网络延迟mongos。假设您的 AppServer 和集群之间有防火墙,您可能需要与相应的管理员联系。
  3. 如果您使用外部身份验证,请尝试测量需要多长时间。
  4. 当使用某种隧道(例如隧道或 SSL/TLS 等加密)时,请确保禁用名称解析。请记住,加密和解密可能需要相对较长的时间。
  5. 测量mongod实例上的随机磁盘 IO