MongoDB中的复制行为

MongoDB中的复制行为,mongodb,Mongodb,我有一个mongod实例,它有两个副本(第二个mongod实例),还有一个java代码,它插入了100万个简单对象,WriteConcern=JOURNAL\u SAFE。 当java代码在执行时,我们杀死主实例,java代码抛出一个异常服务器不可用。然后我关闭其他两个辅助节点,并将每个节点作为独立节点单独启动,然后检查记录计数。我们观察到,两个辅助mongod实例中的记录计数相同,而在主mongod实例中,一条记录丢失,丢失的记录是作业失败的记录(mongod实例被终止)。 有人能解释一下这种

我有一个mongod实例,它有两个副本(第二个mongod实例),还有一个java代码,它插入了100万个简单对象,WriteConcern=JOURNAL\u SAFE。 当java代码在执行时,我们杀死主实例,java代码抛出一个异常服务器不可用。然后我关闭其他两个辅助节点,并将每个节点作为独立节点单独启动,然后检查记录计数。我们观察到,两个辅助mongod实例中的记录计数相同,而在主mongod实例中,一条记录丢失,丢失的记录是作业失败的记录(mongod实例被终止)。 有人能解释一下这种行为吗?如果记录不存在,那么记录怎么可能存在于次要记录中呢

问候,,
Bhagwant Bhobe

这一点也不出乎意料-事实上,我希望是这样,因为MongoDB中的复制是异步的,并且“尽可能快”-只要主记录内存中的写操作,就可以通过oplog看到将其应用于自身的辅助记录


因为您在主服务器有机会刷新从内存到磁盘的写入之前就杀死了它,所以当您检查该节点时,该节点没有插入的记录,但辅助节点有插入的记录,因为它已被复制,并且通常复制所需的时间比刷新数据到磁盘所需的时间要短(尽管这取决于磁盘速度、网络速度和事件的相对时间).

但是我已经启用了日志选项,所以每当我再次启动主节点时,它应该已经恢复了辅助节点中存在的丢失数据。而且当用户看到java代码在哪个记录上失败时,他将尝试再次插入该记录,但该记录已经在mongodb中。@Asya这不应该发生。mongodb first应在主服务器和以后的服务器上保存新记录。如果主服务器上不存在新文档,则不应复制它。您可以认为MongoDB存储和复制的工作方式应该不同(有些人不同意)但我所描述的方式就是它的实际工作方式。@BhagwantBhobe您应该使用replica_acknowered而不是journal_safe-这样,如果主服务器发生故障,并且辅助服务器接管了已确认的数据,那么肯定会在那里。嗯,您崩溃的不是主服务器,对吗?这符合您的预期。由于您使用的writeConcern只关心从本地到主的转换,我不理解为什么这与您的期望不符。如果此事件序列有问题,您可能应该调整Java代码中的逻辑。