副本集协议版本
从 4.0 版开始,MongoDB 仅支持副本集协议版本 1 ( pv1)。pv1是使用 MongoDB 3.2 或更高版本创建的所有新副本集的默认设置。
保存写入
w:1写
使用pv1,您可以 catchUpTimeoutMillis在更快的故障转移和w:1写入保存之间确定优先级。
w: "majority"写
pv1保证保存已确认的w: "majority"写入。
可用性
pv1在 MongoDB 3.2 或更高版本中可用,并且是使用 3.2 或更高版本创建的所有新副本集的默认设置。
仲裁者
对于以下 MongoDB 版本,与具有仲裁器的副本集相比 (MongoDB 4.0+ 不再支持)pv1增加了回滚的可能性:w:1pv0
- MongoDB 3.4.1
 - MongoDB 3.4.0
 - MongoDB 3.2.11 或更早版本
 
对于支持 的其他版本的 MongoDB pv1,pv1不会增加w:1带有仲裁者的副本集回滚的可能性。
优先事项
对于以下 MongoDB 版本,与具有不同设置的副本集相比 (MongoDB 4.0+ 不再支持) pv1增加了回滚的可能性:w:1pv0members[n\].priority
- MongoDB 3.4.1
 - MongoDB 3.4.0
 - MongoDB 3.2.11 或更早版本
 
对于支持的其支持pv1的 MongoDB版本,设置pv1不会增加具有不同设置w:1的副本集设置members[n].priority回滚的可能性。
否决权
pv1不使用否决权。个别节点可以在特定选举中投票支持或反对候选人,但不能单独否决(中止)选举。
同时初选的检测
在某些情况下,副本集中的两个节点可能会暂时认为它们是主节点,但至多,其中一个节点将能够完成具有{ w: "majority" }写入关注的写入。可以完成写入的节点 { w: "majority" }是当前主节点,另一个节点是尚未识别其降级的前主节点,通常是由于网络分区。发生这种情况时,连接到前一个主节点的客户端可能会观察到过时的数据,尽管已经请求了读取偏好 primary,并且对前一个主节点的新写入最终将回滚。
pv1使用术语的概念。这允许更快地检测同时进行的初选,并在短时间内进行多次成功的选举。
背靠背选举
pv1做出“最大努力”尝试让具有最高priority可用呼叫选举的次级。这可能导致背靠背选举,因为具有更高优先级的合格成员可以召集选举。
但是,在 MongoDB 3.6+(以及 MongoDB 3.4.2+ 和 3.2.12+)中,对于pv1:
- 优先级选举被限制为仅当优先级较高的节点与当前主节点的距离在 10 秒内时才会发生。
 - 如果仲裁者检测到与候选人同等或更高优先级的健康初选,他们将在选举中投反对票。
 
双重投票
pv1防止在一名成员的选举呼吁中进行双重投票。这是通过使用术语来实现的。
修改副本集协议版本
从 4.0 版开始,MongoDB 仅支持副本集协议版本 1 ( pv1)。
但是,MongoDB 3.2 到 MongoDB 3.6 支持副本集协议版本1和协议版本0。
在将 MongoDB 3.2 的协议版本更改为 MongoDB 3.6 之前,请确保至少有一个 oplog 条目(从当前协议版本生成)已从主节点复制到所有辅从节点。要检查,在每个从节点上,检查从optimes.lastCommittedOpTime.t返回的字段 rs.status()。例如,连接mongosh到每个从节点并运行:
rs.status().optimes.lastCommittedOpTime.t
- 如果当前副本集协议版本是
0,则t等于-1。 - 如果当前副本集协议版本为
1,t则大于-1。 
一旦您确认至少一个 oplog 条目(使用当前协议版本)已复制到所有从节点,您就可以更改协议版本。
要更改副本集协议版本,rs.reconfig()请使用新的 protocolVersion. 例如,升级到pv1,连接 mongosh到当前主节点并执行以下操作序列:
cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);
您可以catchUpTimeoutMillis在更快的故障转移和w:1写入保存之间确定优先级。
原文链接: https://docs.mongodb.com/manual/reference/replica-set-protocol-versions/
译者:陆文龙