MongoDB';插入的安全模式是什么?

MongoDB';插入的安全模式是什么?,mongodb,batch-file,safe-mode,Mongodb,Batch File,Safe Mode,我正在做一个有一些重要数据的项目。这意味着,如果灯或服务器熄灭,我们不能失去任何一个。我们正在使用MongoDB作为数据库。我希望确保我的数据在插入后在数据库中,如果没有插入一个元素,则回滚整个批处理。我知道Mongo背后的理念是我们不需要交易,但我如何确保我的数据在插入后真正安全地存储,而不是发送到某个“黑洞” 我应该搜查一下吗 我应该使用一些特定的mongoDB命令吗 即使一台服务器足以满足需求,我是否应该使用分片 速度,顺便说一句,如果灯光 下降 最好的解决方案是什么?您最好的选择是使

我正在做一个有一些重要数据的项目。这意味着,如果灯或服务器熄灭,我们不能失去任何一个。我们正在使用MongoDB作为数据库。我希望确保我的数据在插入后在数据库中,如果没有插入一个元素,则回滚整个批处理。我知道Mongo背后的理念是我们不需要交易,但我如何确保我的数据在插入后真正安全地存储,而不是发送到某个“黑洞”

  • 我应该搜查一下吗

  • 我应该使用一些特定的mongoDB命令吗

  • 即使一台服务器足以满足需求,我是否应该使用分片 速度,顺便说一句,如果灯光 下降


最好的解决方案是什么?

您最好的选择是使用写关注点-这些关注点可以让您告诉MongoDB一段数据有多重要。最快的写入问题也是最不安全的-在下一次计划刷新之前,数据不会刷新到磁盘。最安全的方法是在返回之前确认数据已写入多台计算机上的磁盘

您正在寻找的写关注点是FSYNC_安全(至少从的角度来看,这就是所谓的FSYNC_安全)或replications_安全,它可以确认您的数据已被复制

请记住,MongoDB没有传统意义上的事务——您的回滚必须手动进行,因为您无法告诉Mongo数据库为您执行此操作

您需要做的另一件事是使用相对较新的
--journal
选项(使用预写日志),或者使用副本集在多台机器上共享数据,以便在发生崩溃/断电时最大限度地提高数据完整性

切分与其说是一种防止硬件故障的保护,不如说是一种在处理特别大的数据集时共享负载的方法——切分不应与副本集混淆,副本集是一种将数据写入多台机器上多个磁盘的方法

因此,如果您的数据足够有价值,那么您肯定应该使用副本集,甚至可以在其他数据中心/可用性区域/机架等中放置从属设备,以提供所需的恢复能力


有/将有(暂时记不起是否已经实现)一种方法来指定副本集中各个节点的优先级,这样,如果主节点发生故障,则所选的新主节点将位于同一数据中心(如果该机器可用)(即阻止另一个国家的奴隶成为主人,除非这真的是唯一的选择)。

我收到了一个非常好的答案,这个答案来自一个名为GVP的人,他在谷歌群组上说。我将引用它(基本上这就是里奇的答案):

我想确认我的数据在测试后是否在数据库中 如果未插入一个元素,则插入并回滚整个批处理

这是一个复杂的话题,你必须做出一些权衡 考虑一下,

我应该使用碎片吗

分片用于缩放写入。为了数据安全,您希望 副本集

我应该使用一些特定的mongoDB命令吗

首先要考虑的是“安全”模式或“GETLASTError()”。 由Andreas指示。如果您发出“安全”信函,您知道 数据库已接收插入并应用写入。但是, MongoDB仅每60秒刷新一次磁盘,因此服务器可能会出现故障 没有磁盘上的数据

第二件事要考虑的是“日志”。 (v1.8+)。打开日志记录后,数据将刷新到日志中 每100毫秒一次。因此,在失败之前,您有一个较小的时间窗口 驱动程序有一个“fsync”选项(选中该名称),只需一步 除了“安全”之外,它还等待确认数据已被删除 被刷新到磁盘(即日志文件)。但是,这仅限于 覆盖一台服务器。如果服务器上的硬盘驱动器 死了?你需要第二份

第三件事要考虑的是 复制。驱动程序支持一个表示“复制”的“W”参数 在返回之前,将此数据发送到N个节点。如果写入未达到 “N”节点在某个超时之前,则写入失败(异常 但是,您必须根据 副本集中的节点数。同样,由于硬盘驱动器 即使使用日志记录,也可能会失败,您需要查看复制。 然后是跨数据中心的复制,这太长了,无法实现 最后一件要考虑的是你的“卷”的要求。 根据我的理解,MongoDB没有这种“回滚” 容量。如果您正在进行批量插入,您将得到的最好结果是 指示哪些元件发生故障

这里有一个指向PHP驱动程序的链接:您必须检查关于复制和W参数的详细信息。我相信同样的限制也适用于这里


谢谢你给了我一个非常好的答复。我会等一段时间再给你答复。如果我没有发现任何新的,我会接受的,谢谢。博士:不管怎样,你都完蛋了!