分布式一致性协议|青训营笔记

123 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第21天

本次笔记重点内容

  1. 什么是一致性协议
  2. Raft 详解

分布式系统面临的挑战

各种各样的错误:

  • 网络
  • 磁盘
  • CPU

一致性

一致性是一种模型(或语义)来约定一个分布式系统如何向外界提供服务。

分类
  • 最终一致性:读取可能暂时读不到但是总会读到
  • 线性一致性:最严格、最易用、最清晰,线性执行
复制协议——失效发生

两台机器状态保持一致,一旦一台失效了,另一台仍然能提供服务,那么如何同步两个副本的状态呢?

如何复制?

image.png

  • 定期拷贝全量数据到从副本
  • 每个RPC包装成一个operation,主副本拷贝操作到从副本

当主副本失效

  • 手动切换
  • 容错?× 服务还是停了
  • 高可用?取决于我们从发现到切换的过程的快慢
  • 正确?√ 操作只从一台机器上发起,所有操作返回前已经复制到另一台机器了

共识算法

若干进程中,一个值一旦确定,所有人都认同

共识协议≠一致性
  • 应用层面不同的一致性,都可以用共识协议来实现
  • 简单的复制协议也可以提供线性一致性,弱一致性可以使用相对简单的复制算法实现
共识算法案例

Paxos

抽象形式,难以理解,但是是正确的

Raft

把易于理解作为算法的设计目标之一

复制状态机(RSM)

image.png

Client把Log提供给Raft,Raft确定这个Log commit后提供给用户的状态机。一旦Raft更新Commited Index,意味着这个index前所有Log都可以提交给状态机了。

Raft角色

image.png

  • Leader:所有操作的发起者
  • Follower:不接受用户的请求,发现没有Leader的时候会想成为Leader
  • Candidate:收Follower的消息然后发起投票是否自己能成为Leader,投票通过那么Candidate就是新的Leader

流程

S2是这个集群的Leader,其他S是Follower

  • 有客户端

image.png

image.png

  • 无客户端

image.png

向其他人发送心跳,表明Leader还活着

  1. 如果Leader挂了:

image.png

S3即成为新的Leader

日志复制

image.png

从节点失效

image.png

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