raft 简介

2 篇文章 0 订阅
1 篇文章 0 订阅

分布式一致性算法(Distributed Consensus)

  1. 首先我们有一个单点系统

你可以认为这个系统是一个database server 并且只存储一个value

  • 我们有一个client 可以send value to this server

  • 对于一个节点,达成协议 or 保证一致性是很容易的

但是如果我们有多个节点,那么应该如何达成一致性? 这就是分布性一致性算法

raft是一个实现分布式一致性算法的协议

让我们整体看看它是如何定义的(overview)

一个node 可以有三种状态.

  • follower
  • candidate
  • leader

一开始我们的所有node 都是 follower state, 如果 followers 没有 收到leader发来的心跳检查,
那么这个node 可以变成一个 candidate.

candidate 可以管其他节点要投票, 其他的节点会返回他们的投票

candidate 如果从集群节点中得到了大多数的投票,那么它就可以成为一个leader

以上这个过程称作leader选举, 所有的更改都会通过这个leader来进行。每一次变更都会往leader的log
里面加一个entry, 这个log entry 暂时是未提交的,所以它并不会改变这个节点的value。

为了提交这个entry,这个节点将会复制它的值到 follower nodes,leader 会等待直到大多数节点把
entry写入自己的log, 等到 followers 返回了写入成功, leader 的节点进行提交, node 的值变成了新值, leader 写入新值
之后,notify followers 进行更新

最终这个系统达成了一致(come to consensus), 这个过程叫做 log replication

leader 选举 (leader election)

在raft中,有两种超时设置, 第一个是 election timeout

  1. election timeout 是一个follower 成为一个candidate 所用的时间, 这个时间在 150ms - 300ms 随机取

在到了时间后, follower 会变成candidate 并且开始一个新的选举周期(选举自己)

  1. 往剩余节点send request vote message

  2. 如果剩余节点在这个周期还没有投票(依旧在election timeout 倒计时中), 那么它将投票给candidate,并且投票完成之后重置超时时间

  3. 一旦candidate 获得集群里大多数实例的投票,那么就会立即成为leader

  4. leader 开始发送 Append entrys 消息给 followers, 这个 Append entrys 是每隔一段时间发送的, 这个时间我们称作 heartbeat timeout

  5. followers 会对每一个 append entrys 进行回复。

  6. 这个选举周期将会一直持续,直到followers 没有在 election timeout 结束之前 收到 Append entrys(主节点发来的心跳检查), 接着,followers 将会成为一个新的 candidate

这时候 stop leader 然后观察 re-election 的发生

需要集群中大多数节点的投票是因为在一个选举周期内只能选出一个节点

  • 如果两个node 同时变成candidate,这样一来 split vote 这个现象就出现了
split vote
  1. A & B two nodes 在一个选举周期内同时start了一个 election

  2. A 的request vote 到达了 C(B的还未到), B 的request vote 到达了 D(A的还未到)

  3. 这样,A 收到了 B 和 C 的vote, B 收到了 A 和 D 的vote,并且在这个选举周期内不会有新的投票产生

  4. 这时, A, 和 B 都无法成为leader, 只能等待 election timeout 自动结束

  5. 比如D 的timeout 先结束了,D send 了一个 request vote, 得到三张vote, 成为了新的leader

log replication

一旦我们选举出来一个 leader, 那么我们就要将我们系统中所有的变动复制到集群内的所有节点,
我们通过使用我们用做 heartbeats 的 Append entrys 来进行变动的同步, 我们来走一遍这个流程

  1. client sends a change to the leader

  2. change append to the leaders log

  3. the change is send to the follower in the next heartbeat

  4. An entry is committed once a majority of followers acknowledge it

  5. leader response is send to client, the followers commited in received nexted heartbeat

  6. client send command to increment the value by “2”

  7. same as up process

raft 甚至可以在网络分区的时候保持一致性

假设有 A, B, C, D, E 五个节点, A & B 一个分区, C, D, E 一个分区

  1. 未有网络分区时, A 是 leader, term 1
  2. 分区后, A 保持和B 的 heartbeat
  3. C, D, E 无法与主节点保持联系,重新选举新的leader term 2 or term3 , 假设 c变成新的leader
  4. 这时存在两个leader,但是 leader A 无法进行commit ,因为只有B 一个follower,无法做到 majority nodes, C 可以正常进行commit
  5. 当网络分区回复时, A 将会发现 higher term 2/3,
  6. A & B rollback uncommit logs 并从C 节点同步数据,来保证一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值