我们需要将一个特定的数据位写入mongo副本集,并且确实确保它是安全的(这是法律要求)。是否有标准的WriteConcern封装了大多数节点上的磁盘写入?类似于MAJORITY_FSYNCED。
我提出的最好的是以下 - 这是有效的吗?
WriteConcern replicaSetFsyscToMajority = new WriteConcern.Majority(0, true, false);
在Java驱动程序的WriteConcern类中查看预定义的级别,就我所知,现有的级别似乎都不是我所追求的:
FSYNCED表示仅在主数据库上安全写入磁盘。 (因此主节点上的崩溃可能导致写入丢失)
REPLICAS_SAFE似乎表示写入已被至少2个副本确认,并写入内存,不一定写入磁盘(因此对整个mongo副本集的断电可能会丢失写入)。 MAJORITY类似 - 但是((n / 2)+ 1)个复制品。
补充说明/评论
*对于给定的更好的定义!
我们尝试过使用:
new WriteConcern.Majority(0, true, false)
我可以说它不会抛出任何错误,(我们可以读写,并且我们所有的测试都通过了),我不知道它是否在很大程度上验证了写入,而且我没有表现描述它。
答案 0 :(得分:1)
你是对的,与次要有关的写入问题只能确认,而不是数据已写入磁盘。
我不熟悉Java驱动程序,但您应该能够单独设置Journaling和WriteConcern。但请记住,即使J = 1且W =多数,也有可能回滚,如本SO问题所述:Can rollback still occur on a MongoDB replica set with J=1 and W=Majority?
J = 1将确保数据在主节点上是安全的,辅助节点也将以复制的形式提供一些保护。
为了增加额外的信心,请考虑在主硬盘上使用RAID或类似功能。
答案 1 :(得分:0)
来自WriteConcern中的javadoc:
/**
* Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
*/
public final static WriteConcern REPLICA_ACKNOWLEDGED= new WriteConcern(2);
/**
* Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
* <p>
* This field has been superseded by {@code WriteConcern.REPLICA_ACKNOWLEDGED}, and may be deprecated in a future release.
* @see WriteConcern#REPLICA_ACKNOWLEDGED
*/
public final static WriteConcern REPLICAS_SAFE = new WriteConcern(2);
所以我认为你需要REPLICAS_SAFE或REPLICA_ACKNOWLEDGED。