我想设置一个实验来评估 Mongo 使用各种支持快照的技术的性能。
- ext3 上的 R1Soft HotCopy
- xfs 上的 R1Soft HotCopy
- 带有 ext3 的 LVM
- 带有 xfs 的 LVM
- btrfs
它需要受磁盘 IO 限制,因此我需要确保所有写入本质上是同步的 - 否则我将需要创建一个将违反 RAM 和交换约束的数据集,但我相信在每次插入时启用文件系统刷新将确保每个操作在下一个操作之前刷新。
> db.runCommand({getlasterror:1,j:true})
我还能做些什么来真正发挥 MongoDB 进程的 IO 性质?
- 我可以交错读取和写入。
我将测试恒定插入率之类的东西,并观察该过程在以下时期的行为
- 没有与快照相关的事件或状态。
- 拍摄并提交快照时。
- 当备份脚本读取快照时。
- 当快照冗余但处于事件状态时。
- 当快照停用时。
我希望确保在事件和硬件保持不变的同时,能够达到相对的性能基准。
感谢您的任何提示。
最佳答案
罗布,这太棒了。其结果应该使每个人受益。
我想指出一些在您测试 MongoDB 生产部署的典型快照操作时可能会有所帮助的事项。
拍摄快照
正如您所指出的,在实时服务器上拍摄快照的主要问题是 IO 争用。为了避免这种情况,大多数人会部署一个包含 3 个以上成员的副本集。
通常,在这种情况下,辅助节点之一要么在快照期间进行 fsync 并锁定,要么配置为隐藏成员,要么只是脱机。这允许在热备份(另一个辅助备份)仍然可用于自动故障转移的同时拍摄快照。
这还确保了另外两件事。首先,快照可以及时完成(生产负载不影响备份时间),其次,拍摄快照所需的负载不会影响生产读取(在允许从辅助节点读取的情况下 - 从属Ok)。
备份机制
上述关于快照策略的观点很重要,因为大多数人忽视了辅助节点与主节点具有相同写入负载的事实。
MongoDB 没有多主复制。在给定时间只有一台服务器(在集合/分片中)处于事件状态以进行写入(主服务器或主服务器)。
但是,当主节点接收写入和读取时,辅助节点会尾随该主节点的 oplog(上限集合)。辅助节点定期发出请求,以查看是否有更多数据等待从此可尾游标读取。如果存在,这些 oplog 条目将从主数据库读取并写入(是的 - 这需要一个写锁)到辅助数据库。
然后,辅助节点将 oplog 中的新条目应用到它们自己的数据副本(是的 - 这需要一个写锁)。
您可能知道这一切,但在进行这项出色的研究时请记住这一点。
祝你好运!
关于linux - 如何在使用各种快照技术时测试 MongoDB 的相对性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10337979/