最好的选择是使用 Write Concerns - 这些允许您告诉 MongoDB 一条数据的重要性。最快的 Write Concern 也是最不安全的 - 在下一次计划的刷新之前,数据不会刷新到磁盘。最安全的方法是在返回之前确认数据已写入多台机器上的磁盘。
您正在寻找的写入问题是 FSYNC_SAFE (至少从Java 驱动程序的角度来看它是这样调用的)或 REPLICAS_SAFE 确认您的数据已被复制。
请记住,MongoDB 没有传统意义上的事务 - 您的回滚必须手动滚动,因为您无法告诉 Mongo 数据库为您执行此操作。
您需要做的另一件事是使用相对较新的--journal
选项(使用预写日志),或使用副本集在多台机器之间共享数据,以便在发生崩溃/断电时最大限度地提高数据完整性。
在处理特别大的数据集时,分片与其说是一种防止硬件故障的保护,不如说是一种分担负载的方法——分片不应与副本集相混淆,副本集是一种将数据写入多台机器上的多个磁盘的方法.
因此,如果您的数据足够有价值,您绝对应该使用副本集,甚至可能在其他数据中心/可用区/机架/等中设置从站,以提供您需要的弹性。
有/将(不记得副手是否已实现)来指定副本集中单个节点的优先级如果有这样的机器可用(即阻止该国另一端的奴隶成为主人,除非它确实是唯一的其他选择)。