在分布式环境中,要做到failover,必要的问题是选出一个候选者。那如何保证候选者和lead保持一致呢
静态列表机制
假如一个集群中有2n+1个节点,当master更新时,会将更新发送到所有节点。当有n+1个节点也确认更新完成,那这次更新才算真正完成
整个过程的延迟取决于整个节点中最快的n+1个节点
该方案需要2n+1个节点,允许n个节点失败
动态列表机制
动态维护一个“in-sync” list,“in-sync” list中所有的节点都是和lead保持一致的。
一条消息只有被“in sync” list里的所有follower都从leader复制过去才会被认为已提交。
或者:
一条消息只要被“in sync” list里的一个follower都从leader复制过去才会被认为已提交。
这样就避免了部分数据被写进了leader,还没来得及被任何 follower复制就宕机了,而造成数据丢失
如果“in-sync” list中的一个节点宕机,或者落后太多,leader将把它从”in sync” list中移除。
这里所描述的“落后太多”指follower复制的消息落后于leader后的条数超过预定值(一般有个参数指定该值)
这样“in-sync” list中只要保证有一个follower就可以保证数据部丢失
kafka中partition的HA