这是我参与「第四届青训营 」笔记创作活动的第21天
本次笔记重点内容
- 什么是一致性协议
- Raft 详解
分布式系统面临的挑战
各种各样的错误:
- 网络
- 磁盘
- CPU
一致性
一致性是一种模型(或语义)来约定一个分布式系统如何向外界提供服务。
分类
- 最终一致性:读取可能暂时读不到但是总会读到
- 线性一致性:最严格、最易用、最清晰,线性执行
复制协议——失效发生
两台机器状态保持一致,一旦一台失效了,另一台仍然能提供服务,那么如何同步两个副本的状态呢?
如何复制?
- 定期拷贝全量数据到从副本
- 每个RPC包装成一个operation,主副本拷贝操作到从副本
当主副本失效
- 手动切换
- 容错?× 服务还是停了
- 高可用?取决于我们从发现到切换的过程的快慢
- 正确?√ 操作只从一台机器上发起,所有操作返回前已经复制到另一台机器了
共识算法
若干进程中,一个值一旦确定,所有人都认同
共识协议≠一致性
- 应用层面不同的一致性,都可以用共识协议来实现
- 简单的复制协议也可以提供线性一致性,弱一致性可以使用相对简单的复制算法实现
共识算法案例
Paxos
抽象形式,难以理解,但是是正确的
Raft
把易于理解作为算法的设计目标之一
复制状态机(RSM)
Client把Log提供给Raft,Raft确定这个Log commit后提供给用户的状态机。一旦Raft更新Commited Index,意味着这个index前所有Log都可以提交给状态机了。
Raft角色
- Leader:所有操作的发起者
- Follower:不接受用户的请求,发现没有Leader的时候会想成为Leader
- Candidate:收Follower的消息然后发起投票是否自己能成为Leader,投票通过那么Candidate就是新的Leader
流程
S2是这个集群的Leader,其他S是Follower
- 有客户端
- 无客户端
向其他人发送心跳,表明Leader还活着
- 如果Leader挂了:
S3即成为新的Leader
日志复制
从节点失效
S2可以直接把S3后面没有的节点全部给它
Raft Term
- 每个Leader服务于一个term
- 每个term至多有一个Leader
- 每个节点存储当前的term
- 每个节点term从一开始只增不减
- 只commit本term内的Log
安全性
- 同Term:对于Term内,在任何<term,index>位置上至多只有一条Log
- 跨Term:如果一个Log被标记commited,那这个Log一定会在未来所有的Leader中出现Leader completeness