这是我参与「第四届青训营 」笔记创作活动的的第13天
一致性
-
数据在多个副本之间是否能够保持一致的特性
- 通俗的说就是能将分布式系统看起来只有一个数据副本
- 读写操作都是原子的,这样应用层就可以忽略系统底层多个数据副本间的同步问题。
-
有很多模型,实际只有强一致性和弱一致性,其他均为弱一致性的特殊情况
- 强一致性(线性一致性):最理想即复制是同步的
- 弱一致性,即复制是异步的。
- 最终一致性:经过一段时间的同步后,最终能够达到一个一致的状态
共识算法
"The consensus problem requires agreement among a number of processes(or agents) for a single data value. Some of the processes(agents) may fail or be unreliable in other ways, so consensus protocols must be fault tolerant or resilient"
即一个值一旦确定,所有人都认同。
本身是不关心乱序的,实际上值是以log存储的,而log是有顺序的
在不考虑Byzantune fault时在纯异步系统中仍是不可能实现的
- Byzantune fault是节点故意不按照指点的方案执行
错误类型很多
- 网络断开,分区,缓慢,重传,乱序,CPU、IO可能停住
实现:
- paxos 《Paxos Made Simple》 --Lamport。
- raft raft.github.io/ (开源实现etcd、braft)
共识算法和一致性的区别
前者强调共识,即在一个范围内的所有节点,如何在一个确定的提案上达成一个统一的结论。强调过程
后者强调多副本(或者叫多节点)上的数据一致。强调结果
Raft
Raft is a consensus algorithm for managing a replicated log. It produces a result equivalent to (multi-)Paxos, and it is as efficient as Paxos, but its structure is different from Paxos; this makes Raft more understandable than Paxos and also provides a better foundation for building practical systems.
--《In Search of an Understandable Consensus Algorithm》 基础概念: 提案:Raft 集群的操作
Raft 将一致性问题分解为 3 个独立的子问题:
- Leader 选举
Election
:Leader 进程失效后能够自动选举出一个新的 Leader - 日志复制
Replication
:Leader 保证其他节点的日志与其保持一致 - 安全性
Safety
:Leader 保证状态机执行指令的顺序与内容完全一致
Leader 选举
节点切换
-
Follower
- 请求的被动更新者,从 leader 接收更新请求,写入本地文件。如果客户端的操作请求发送给了 follower,会首先由 follower 重定向给 leader。
-
leader
- 所有请求的处理者,接收客户端发起的操作请求,写入本地日志后同步至集群其它节点。
-
Candidate
- 如果 follower 在一定时间内没有收到 leader 的心跳,则判断 leader 可能已经故障,此时启动 leader election 过程,本节点切换为 candidate 直到选主结束。
日志复制
通过Raft动画展示
所有 log 都必须交给 leader 节点处理,并由 leader 节点复制给其它节点。
-
Leader 为客户端提供服务,客户端的每个请求都包含一条即将被状态复制机执行的指令。
-
Leader 把该指令作为一条新的日志附加到自身的日志集合,然后向其它节点发起附加条目请求(AppendEntries RPC) ,来要求它们将这条日志附加到各自本地的日志集合。
-
当这条日志已经确保被安全的复制,即大多数(N/2+1)节点都已经复制后,leader 会将该日志 apply 到它本地的状态机中,然后把操作成功的结果返回给客户端。
安全性
需要对“选主+日志复制”这套机制加上一些额外的限制,来保证状态机的安全性
- 对选主的限制
- 每个 candidate 必须在 RequestVote RPC 中携带自己本地日志的最新 (term, index),如果 follower 发现这个 candidate 的日志还没有自己的新,则拒绝投票给该 candidate。
- 对提交的限制
- Leader 只允许 commit 包含当前 term 的日志。