关于etcd集群写入确认时机及异常场景的技术咨询
问题1:客户端是在所有follower完成数据复制后收到leader的确认,还是在N/2+1个节点完成复制后收到?
客户端会在N/2+1个节点(多数派)完成复制后收到leader的确认。这是Raft共识的核心逻辑:只要包含leader在内的多数节点成功写入日志,leader就会提交该日志并向客户端返回成功,无需等待所有follower完成同步。问题2:以3节点集群为例,客户端是在leader+1个follower(共2个节点)完成复制后收到确认,还是所有3个节点都完成后?
3节点集群的多数派是2个节点(3/2+1=2),所以只要leader加上1个follower完成日志复制,客户端就能收到确认,不用等第三个节点同步完成。问题3:若为后者,是否集群节点越多写入延迟越高?
首先Raft并非采用“等待所有节点”的机制,而是多数派确认。但假设真的用全节点同步,那节点越多延迟肯定越高。回到Raft的实际逻辑:节点数增加时,需要等待的多数派节点数量也会增加(比如5节点要等3个,7节点要等4个),延迟会略有上升,但不会像全节点同步那样线性增长,因为只需要等半数节点完成即可,不用等全部。问题4:若某follower复制超时或失败,会发生什么?
leader会持续重试向该follower同步日志。如果该follower长时间无法恢复,leader会将其标记为不可用状态;待该follower恢复后,会自动通过日志追赶机制同步leader的最新日志,重新加入集群。只要集群中多数节点正常运行,整个集群的写入服务不受影响,客户端依然能正常收到响应。
内容的提问来源于stack exchange,提问作者Jayground

