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

58 阅读3分钟

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

浅谈分布式一致性协议

分布式系统

分布式系统面临的挑战

  • 数据规模越来越大
  • 服务的可用性要求越来越高
  • 快速迭代的业务要求系统足够易用

理想中的分布式系统

  • 高性能:可拓展、低时延、高吞吐
  • 正确:一致性、易于理解
  • 可靠:容错、高可用

从HDFS开始

image.png

简单KV机

image.png

  • 接口Get,BatchPut
  • 第一次实现RPC,DB Engine

什么是一致性协议

KV中常见的一致性模型

  • 最终一致性:读取可能暂时读不到但是总会读到
  • 线性一致性:最严格,线性执行

复制协议

  • 主副本定期拷贝全量数据到从副本
  • 主副本拷贝操作到从副本

主副本把所有的操作打成Log包

所有的Log写入都是持久化的,保存在硬盘上

应用包装成状态机,只接受Log作为Input

主副本确定Log已经成功写入到副本机器上,当状态机apply之后,返回客户端

image.png

共识算法

简而言之一个值一旦确认,所有人都认同

共识是个不可能的任务,因为

  • 错误总是会发生
  • 错误的类型有很多,比如网络断开,分区,缓慢,重传,乱序,cpu停滞
  • 容错

共识算法不等于一致性,应用层面不同的一致性都可以用共识协议来实现。简单的复制协议也可以提供线性一致性。

弱一致性能够使用简单的复制算法实现,共识协议提到的一致性是线性一致性

以 Raft 为例子了解一致性协议是如何工作的

Raft是一个分布式共识算法

  • Raft于2014年发表
  • 以易于理解作为算法的设计目标
    • 使用了RSM、Log、RPC的概念
    • 直接使用RPC对算法进行了描述
    • Strong Leader-based
    • 使用了随机的方法减少约束
  • 正确性
    • 形式化验证
    • 拥有大量成熟系统

Raft角色

image.png

  • 假设在集群有A、B、C三个节点。初始状态下,所有的服务器都是跟随者(Follower)的状态,而没有领导者状态(Leader)
  • 集群中每个节点都有一个选举超时时间(election timeout),每个节点的选举超时时间都是150ms~300ms的一个随机数,每当节点的选举超时时间到了就会触发它成为候选者。假设A节点的等待超时时间最小(150ms),它会最先因为没有等到领导者的心跳信息,发生超时。此时A节点的状态会由Follower转换成为Candidate状态。
  • A转换了自己的状态为Candidate,它会立即开始如下动作进行选举:
  1. 增加了自己的term
  2. 先给自己投上一票
  3. 重置选举超时时间
  4. 然后向其他节点发送请求投票RPC消息,请它们选举自己为领导者。如果候选人在选举超时时间内赢得了大多数选票,它将成为本届任期内新的领导者

Raft整体流程

image.png

Raft的Term

  • 每个Leader服务于一个term
  • 每个term至多只有一个leader
  • 每个节点存储当前的term
  • 每个节点term从一开始,只增不减
  • 所有rpc的request reponse都携带term
  • 只commit本term内的log

Raft的安全性

  • 对于Term内的安全性

    • 目标:如果一个log被标记commited,那这个log一定会在未来所有的leader中出现Leader completeness
  • 可以证明这个property

    • Raft选举时会检查Log是否outdated,只有最新的才能当选Leader
    • 选举需要多数派投票,而commited log也已经在多数派中(必有overlap)
    • 新Leader一定持有commited log,且Leader永远不会overwrite log