我正在开发一个项目,其中包含一些重要数据。这意味着如果灯或服务器出现故障,我们不会丢失任何数据。我们使用 MongoDB 作为数据库。我想确保插入后我的数据位于数据库中,如果未插入一个元素,则回滚整个批次。我知道 Mongo 背后的理念是我们不需要事务,但是我如何确保我的数据在插入后真正安全地存储而不是发送到某个“黑洞”。
最好的解决方案是什么?
最好的选择是使用 Write Concerns - 这些可以让您告诉 MongoDB 一条数据的重要性。最快的写入关注也是最不安全的 - 数据不会刷新到磁盘,直到下一次计划刷新。最安全的方法是在返回之前确认数据已写入多台机器上的磁盘。
您正在寻找的写入关注点是 FSYNC_SAFE (至少从Java驱动程序 http://api.mongodb.org/java/2.6.3/com/mongodb/WriteConcern.html) 或 REPLICAS_SAFE 确认您的数据已被复制。
请记住,MongoDB 没有传统意义上的事务 - 您必须手动进行回滚,因为您无法告诉 Mongo 数据库为您执行此操作。
您需要做的另一件事是使用相对较新的--journal
选项(使用预写日志),或使用副本集在多台计算机之间共享数据,以便在发生崩溃/断电时最大限度地提高数据完整性。
分片与其说是一种针对硬件故障的保护,不如说是一种在处理特别大的数据集时共享负载的方法 - 分片不应与副本集混淆,副本集是一种将数据写入多台计算机上的多个磁盘的方法。
因此,如果您的数据足够有价值,您绝对应该使用副本集,甚至可能将从站放置在其他数据中心/可用区/机架/等中,以提供您所需的弹性。
存在/将会存在(不记得是否已实现)一种指定副本集中各个节点的优先级的方法,这样,如果主节点宕机,则选出的新主节点是相同数据中的节点如果有这样的机器可用,则中心(即阻止国家另一边的奴隶成为主人,除非它确实是唯一的其他选择)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)