分布式系统学习(一)—— Raft算法

CAP定理

一致性

对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。

可用性

非故障的节点在合理的时间内返回合理的响应。

分区容忍性

当出现网络分区后,系统能够继续“履行职责”。

CAP关注的粒度是数据,而不是整个系统。

Raft算法

一、拜占庭将军问题

在很久很久以前,拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息。

在打仗的时候,拜占庭军队内所有将军必需达成一致的共识,才能更好地赢得胜利。但是,在军队内有可能存有叛徒,扰乱将军们的决定。

这时候,在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒或间谍的影响下达成一致的协议。

拜占庭将军问题是计算机科学家莱斯利·兰伯特提出的有关计算机网络中所存在的一致性问题的问题。

二、Raft算法流程

Raft算法依靠状态机主从同步的方式,在各个节点之间实现数据的一致性。

Raft算法的两个核心要点:

  • 选举主节点
    • 多个节点之间投票竞争
  • 同步数据(Log Replication)

选举主节点

三种角色、状态:

  • Leader 主节点
  • Follower 从节点
  • Candidate 参与投票竞争的节点

选举流程:

  1. 所有节点的初始状态都是Follower,如果Follower超过一段时间没有接收到Leader的心跳,就会成为Candidate 。
  2. Candidate 会向Follower发起投票,让Follower将票投给自己
  3. Follower将会投出它们的票(如果有3个Candidate,那这个Follower要投给谁?)
  4. 得到票数最多的Candidate 成为主节点

同步数据

所有的修改操作都要经过Leader,Leader会等待,直到majority(大多数)节点都被修改,Leader会commit这个修改。

三、Raft算法细节

两个超时时间:

  • 选举超时
  • 心跳超时

选举超时

  1. Follower等待,直到成为Candidate的时间,选举超时为150ms-300ms之间的任意值
  2. Follower超时之后,成为Candidate,开始选举流程,给它自己投票,并发送投票请求给其他节点
  3. 其他节点投票给Candidate,并reset自己的选举超时时间
  4. 当Candidate有majority(大多数)选票,就成为Leader

心跳超时

  1. Leader会发送Append Entries(追加条目)给Follower
  2. 这些Append Entries(追加条目)信息会按特定的时间间隔发送给Follower,这个时间间隔叫心跳超时
  3. Follower也会响应Append Entries(追加条目),Follower每次接收到Leader的Append Entries(追加条目),都会reset自己的选举超时时间
  4. 直到Follower没有接收到Leader的心跳,然后开始选举过程,成为Candidate
posted @ 2019-05-27 14:42  清泉白石  阅读(391)  评论(0编辑  收藏  举报