共识算法
concensus algorithm是指在分布式系统中,多个节点对某个值达成一致,各个节点总是返回一致对结果,并且只要大于一半对节点还存活,就能正常工作,超过一半节点挂掉会停止工作但绝不会返回不一致但值,一旦达成一致,这个消息就不会丢失
状态机和日志
raft集群中,每个node都是一个状态极,日志就是一系列但命令,初始时候状态机处于empty状态,每读取一条日志状态机就更改自身但状态,所以只要保证node但日志序列相同,那么他们的状态就一定是相同的。在etcd这种情况下,状态其实就是kv map, 日志就类似于set a = b这样的命令,每条日志都应该有自己的***,所有node在消费到n条日志的时候,它的kv map就一定是一致的。
中心化
所有的读写默认都是通过leader进行的,每次读写leader都要通过raft算法确定当前key的最新value,保证大多数节点都对这个值达成一致。由leader负责复制日志。所以raft要解决的两个核心问题就是
- leader 选举
- 日志复制
node状态
在状态转换过程中term, epoch至关重要
选举过程
1,leader heart beat 超时
2,成为candidate, 本地term +1, 投自己一票
3,发送request vote至所有节点,带上两个关键信息:term和log offset
4,如果收到大部分赞成,就成为leader,发送leader heartbeat,如果收到更搞的term或者leader heartbeat,成为follower
对于收到request vote请求的节点,如果是leader,直接忽略,如果是follwer,那么查看log offset,必须大于自己的offset才会投赞成票,并且每个任期只能投一次
日志复制过程
leader append log entry
leader issue AppendEntries RPC in parallel
leader wait for majority response
leader apply entry to state machine
leader reply to client
leader notify follower apply log