MongoDB 执行大量插入时副本不同步
MongoDB replica out of sync when performing a lot of inserts
我有一个使用 MongoDB v3.2.4 的三成员副本集。每个成员都是一个具有 8 个内核和 8GB RAM 的 VM,在正常操作中,这些节点 运行 CPU 和内存消耗非常低。
我有一个 60GB 的数据库(3000 万个文档),每月一次完全由用 Pig 编写的 Map/Reduce 作业重新加载。在此作业期间,集群收到 30k insert/s,几分钟后辅助节点变得不同步。
当前的 oplog 大小为 20GB(已从默认值修改)但这并不能解决复制同步问题。
我不知道再次修改 oplog 大小是否有帮助。我担心的是复制似乎是在主数据库没有负载时完成的。由于我的插入作业持续 1 小时,这是否意味着我需要一个与我的数据库大小相同的 oplog?
有没有办法告诉 MongoDB 在复制上投入更多精力,并在接受插入和复制之间实现更平衡的工作负载?
Is there a way to tell mongo to put more effort on replication to have a more balanced workload between accepting inserts and replicatings these inserts?
为确保数据已复制到辅助节点(并限制您的插入),您应该将 write concern 增加到 w:majority
。默认的写入问题 (w:1
) 仅确认写入操作已被主节点接受,因此如果您的辅助节点无法跟上较长时间的插入,它们最终将不同步(正如您所经历的) .
您可以在 MongoDB Connection String URI 中将多数作为一个选项,例如:
STORE data INTO
'mongodb://user:pass@db1.example.net,db2.example.net/my_db.my_collection?replicaSet=replicaSetName&w=majority'
USING com.mongodb.hadoop.pig.MongoInsertStorage('', '');
我有一个使用 MongoDB v3.2.4 的三成员副本集。每个成员都是一个具有 8 个内核和 8GB RAM 的 VM,在正常操作中,这些节点 运行 CPU 和内存消耗非常低。
我有一个 60GB 的数据库(3000 万个文档),每月一次完全由用 Pig 编写的 Map/Reduce 作业重新加载。在此作业期间,集群收到 30k insert/s,几分钟后辅助节点变得不同步。
当前的 oplog 大小为 20GB(已从默认值修改)但这并不能解决复制同步问题。
我不知道再次修改 oplog 大小是否有帮助。我担心的是复制似乎是在主数据库没有负载时完成的。由于我的插入作业持续 1 小时,这是否意味着我需要一个与我的数据库大小相同的 oplog?
有没有办法告诉 MongoDB 在复制上投入更多精力,并在接受插入和复制之间实现更平衡的工作负载?
Is there a way to tell mongo to put more effort on replication to have a more balanced workload between accepting inserts and replicatings these inserts?
为确保数据已复制到辅助节点(并限制您的插入),您应该将 write concern 增加到 w:majority
。默认的写入问题 (w:1
) 仅确认写入操作已被主节点接受,因此如果您的辅助节点无法跟上较长时间的插入,它们最终将不同步(正如您所经历的) .
您可以在 MongoDB Connection String URI 中将多数作为一个选项,例如:
STORE data INTO
'mongodb://user:pass@db1.example.net,db2.example.net/my_db.my_collection?replicaSet=replicaSetName&w=majority'
USING com.mongodb.hadoop.pig.MongoInsertStorage('', '');