【发布时间】:2014-02-28 13:23:52
【问题描述】:
我对这种情况感到困惑,并试图解决这个问题几天。我在三个 3 成员副本集(rs0、rs1 和 rs2)之上运行 3 个分片。到目前为止一切正常。数据分布在 3 个分片上,并在副本集中克隆。
但是:将数据导入其中一个副本集可以正常处理 40k 文档/秒,但启用分片会使整个过程减慢到仅 1.5k 文档/秒。
我已经通过不同的方法填充了数据:
- 在 mongo shell 中生成了一些随机数据(在我的 mongos 中运行)
- 通过 mongoimport 导入 JSON 数据
- 通过 mongorestore 从另一台服务器恢复 MongoDB 转储
所有这些都只产生 1.5k 文档/秒,这令人失望。 mongod 是每个 32GB 的物理 Xeon 盒子,3 个配置服务器是虚拟服务器(40 GB HDD,2 GB RAM,如果重要的话),mongos 在我的应用服务器上运行。顺便说一句,1.5k inserts/s 的值不取决于分片键,专用分片键(单字段键和复合键)以及 _id 字段上的散列分片键的行为相同。
我尝试了很多,甚至两次重新安装了整个集群。问题是:这个设置的瓶颈是什么:
- 在虚拟服务器上运行的配置服务器? -> 由于配置服务器的资源消耗低,应该不会有问题
- 蒙古人? -> 在 HAproxy 后面的专用盒子上运行多个 Mongos 可能是一种替代方案,尚未测试过
【问题讨论】:
-
尝试在此大规模批量更新期间停止平衡器,看看是否会加快速度。此外,如果可以并且数据允许,请尝试使用有针对性的分片技术,例如
Tag Aware Sharding -
当您将数据加载到单个服务器时,您可能正在使用大批量来分摊锁定、日志、网络开销等的成本。当您通过 mongos 加载时,mongos 需要将您的批次分解成更小的批次,然后进入每个分片。它这样做的方式是低效的(github.com/Tokutek/mongo/issues/912 解释更多)。如果这是您的问题,解决此问题的方法是确保应用程序中的每批文档都具有相同的分片键。
-
好的,令人困惑的是:未通过 sh.shardCollection() 注册分片的集合默认存储在主分片中。因此它们不需要路由、负载平衡等。所以我创建了一个虚拟集合,没有将其指定为共享并将其填充到 mongos mongo shell 中。结果:与共享集合中相同的慢速数据插入。将相同数据导入其中一个副本集时速度仍然是 1/25。
标签: performance mongodb replication sharding