@toc:
- Raft协议简述(角色, 任期Term, 发起投票);
- Redis中是如何实现的Raft?
➤ Raft协议简介: Raft协议是用来解决分布式系统一致性的, 协议包括 选举leader/日志复制-提交机制等等,
除Raft外还有 Google的 Paxos协议, 但 Paxos协议难以理解, 更难以实现(仅仅有论文),但 Raft协议正好相反, 易于理解且有实际工程的代码实现 (Redis Sentinel的选举 就是通过Raft协议实现的)
- Raft协议中的角色: Leader, Follower, Candidate(候选者), 在系统正常状态下只有 Leader和 Follower两种角色,
- 当有 Follower角色发现 Leader下线(心跳异常), 这个 Follower会暂时变为 Candidate, 然后这个Candidate 向其他 Follower发起给自己的投票, 当有超过半数的Follower给这个Candidate投票, 这个Candidate即成为新的Leader.
- 在选举过程中, 还有一个需要解决的问题: 选举的时间有效性 (在选举过程中, 除了节点之间交换选举人的信息, 还需要表名这是在进行第几期选举), Raft协议使用 Term(任期)来表示这次选举, 在每次Term中, Follower只有一次投票机会. 当一次选举结束后, 所有节点保存的 Term将会更新, 当下一次某个 Candidate发起选举的时候, 会将 Term + 1
➤ Redis实现Raft协议:
- Redis实现的Raft协议中, 使用 configuration epoch (配置纪元)来表示 Term,
- 在Sentinel的配置文件中, 有
can-failover
参数, 这个参数表示该节点能否参与选举Leader, 也即是否有可能成为Candidate, 如果can-failover
是 false, 表示这个节点用于只能作为 Follower , 此外, Redis 配置中的quorum
不仅可以控制认为某个节点”SDOWN”时, 最少确认节点的个数, 也表示成为Leader所需的最小选票数.