在分布式环境中,要做到failover,必要的问题是选出一个候选者。那如何保证候选者和lead保持一致呢 ===== 静态列表机制 ===== * 假如一个集群中有2n+1个节点,当master更新时,会将更新发送到所有节点。当有n+1个节点也确认更新完成,那这次更新才算真正完成 * 整个过程的延迟取决于整个节点中最快的n+1个节点 * 该方案需要2n+1个节点,允许n个节点失败 **案例** * **hdfs的HA** ===== 动态列表机制 ===== * 动态维护一个"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