持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
1. ETCD-Raft 模块如何实现分布式一致性
1.1 Raft介绍以及接口
在分布式环境中,常用数据复制来避免单点故障,实现多副本,提高服务的高可用性以及系统的吞吐量。
ETCD-Raft对外提供的接口有
- Tick:时钟,触发选举或者发送心跳
- Propose:通过channel向raft StateMachine提交一个Op,提交的是本地MsgProp类型的消息
- Step:节点收到Peer节点发送的Msg时,会通过该接口提供给raft状态机,Step接口通过 recvc channel 向 raft StateMachine 传递Msg
1.2 节点状态
- Candidate:候选人状态,该状态意味着将进行一次新的选举
- Follower:跟随者状态,该状态意味着选举结束
- Leader:领导者状态,选举出来的节点,所有数据必须先提交到Leader上
raft一致性算法实现的关键有Leader选举、日志复制和安全性限制
1.3 选举
第一步是选举Leader,只有在Candidate或是Follower状态下的节点才有可能发起一个选举流程。
- 节点启动时,都以Follower启动,同时随机生成自己的选举超时时间。
- 在Follower的tickElection函数中,当选举超时,节点向自己发送MsgHup消息。就是这次选举并没有产生Leader。
- 在状态机函数raft.Step函数中,收到MsgHup消息之后,节点首先判断当前有没有apply的配置变成消息,如果有就忽略该消息。
- 否则进入campaign函数中进行选举:首先将任期号增加1,然后广播给其他节点选举消息,带上其他字段,包括:节点当前的最后一条日志索引,最后一条日志对应的任期号,选举任期号,Context字段。
- 如果在一个选举超时期间内,发起新的选举流程的节点,得到了超过半数的节点投票,那么状态就切换到Leader状态。