这是我参与「第四届青训营 」笔记创作活动的第10天,学习了一致性的相关算法熟悉了raft等相关框架,并且完善了相关概念。
主从复制
raft协议中,一个节点任意时刻处于以下三个状态:
- leader
- follower
- candidate
可以看出所有节点启动时都是follower状态;在一段时间内如果没有收到来自leader的心跳,从follower切换到candidate,发起选举;如果收到majority的造成票(含自己的一票)则切换到leader状态;如果发现其他节点比自己更新,则主动切换到follower。
总之,系统中最多只有一个leader,如果在一段时间里发现没有leader,则大家通过选举-投票选出leader。leader会不停的给follower发心跳消息,表明自己的存活状态。如果leader故障,那么follower会转换成candidate,重新选出leader。
每个节点上都有一个倒计时器 (Election Timeout),时间随机在 150ms 到 300ms 之间。有几种情况会重设 Timeout:
- 收到选举的请求
- 收到 Leader 的 Heartbeat (后面会讲到)
在 Raft 运行过程中,最主要进行两个活动:
- 选主 Leader Election
- 复制日志 Log Replication
复制协议
- 当主副本失效时为了使算法简单可以人肉切换
- 如何保证主副本真的失效了
- 如果节点增加到三个
共识算法
共识算法(consensus A7M),即达成共识的过程,而非一致性算法。一致性(consistency)是终态,共识算法是达成一致性的一种实现手段和过程。典型的分布式三节点场景N1,N2,N3,刚启动触发 leader election,节点状态分leader,candidate,follower,选主采用抢注机制,完成选主后为了保证leader是靠谱的,需要有keepalive机制,若leader保活超时会触发新一轮选举。
leader节点会负责资源分配,负载均衡(LB),同时会负责log同步,状态机对齐等共识决策,以此来达成数据一致性。
- 共识协议不等于一致性
- 一般讨论公式协议提到的一致性,都指线性一致性