小编DRo*_*elt的帖子

次要成员在 MongoDB 的副本集中确认什么?

我试图更好地理解MongoDB 副本功能的机制和行为。我希望从熟悉 mongo 内部和行为的人那里得到一些有见地的信息。我的目标是了解 Mongo 在高可用性设置中的持久性保证。我想要维护的数据将具有唯一约束(通过使用两个唯一索引),通过在一个文档中具有两个唯一值来维护 1:1 关系。不一致或仅部分持久性对我的 1:1 关系来说是致命的,一旦发生就很难解决,尤其是未被发现。

我的问题:

辅助节点在副本集设置中确认并使用 writeconcern:"majority" 究竟是什么?

仅在次要语句中确认并应用该语句,还是应用整个 oplog 直到应用新语句?

解释我到底在寻找什么:

根据他们自己的文档和其他一些来源(例如 Aphyr 尝试模拟网络分区及其后续),使用写关注“多数”将确保,即使在分区场景等中也不会丢失任何写入。(因为我不能发布两个以上的链接,我将无法引用 mongodb 的文档)。在我的用例中,陈旧的读取是可以接受的。

但是我从他们的文档中无法弄清楚的一件事是,复制品上究竟承认了什么。

副本集通过异步分发使用 oplog(修改数据的语句集合)进行复制。为了避免在失败的主尝试通​​过写入加入集群时回滚,这些写入不是分布式的(由于异步性质),他们建议使用多数写入关注(Doc->Replica->Replica Concepts->High Availbilty->回滚)。据我了解,在某些情况下,这无法实现,这取决于确切承认的内容。

假设我们有三个实例,(1)、(2)、(3)。一个是主要的 (1,P),另外两个是次要的 (2,S), (3,S)。

我们现在正在尝试插入两个新行/文档 {1} 和 {2}。并且由于网络不稳定,有时实例之间将不可用。

假设副本集确认来自主节点的单个语句,那么可能会发生以下情况:

  1. 实例 (3,S) 不可用,但插入记录 {1} 会成功,因为 3 个中有 2 个可用(达到多数)。

当前状态:

(1,P):{{1}}

(2,S):{{1}}

(3,S):{{}}不可达

  1. 实例 (2,S) 变得不可用,并且实例 (3,S) 恰好在线(未重新启动,只是对其他人在线)。同时,主节点没有启动异步复制。插入记录{2}。再次获得多数票(3 人中有 2 人)

当前状态:

(1,P):{{1},{2}}

(2,S):{{1}}不可达

(3,S):{{2}}

如果 (1,P) 下降,就会发生选举。(2) 或 (3) 将成为主要的。但这会使数据库不一致,因为新的主数据库不知道其他丢失的文档/行。现在,当原始主数据库上线(从而丢失数据)时,必然会发生某种回滚。

如果通过应用所有最新的 oplog 条目进行确认,则不应发生这种情况。(2,S) 在确认 …

nosql replication mongodb

5
推荐指数
1
解决办法
556
查看次数

标签 统计

mongodb ×1

nosql ×1

replication ×1