这是我参与「第四届青训营 」笔记创作活动的的第16天
一、本课堂重点内容
- 分布式系统
- 一致性与共识算法
- 从Raft入手
- 实现细节以及未来
二、详细知识点介绍
01.分布式系统面临的挑战
- 分布式系统位于基础架构的最下层,若失效对上层的影响很大。
- 各种各样的错误
- 网络
- 磁盘
- CPU
1.1 理想的分布式系统
高性能:可拓展、低延时、高吞吐
正确:一致性、易于理解
可靠:容错、高可用
02.一致性与共识算法
2.1 什么是一致性?
-
对于我们的KV
- 像操作一台机器一样
- 要读到最近写入的值
-
一致性是一种模型(或语义)
- 来约定一个分布式系统如何向外界(应用)提供服务
- KV中常见的一致性模型
- 最终一致性:读取可能暂时读不到但是总会读到
- 线性一致性:最严格,线性执行
线性一致性--用户最常用
2.2复制节点
- 当主副本失效时,为了使得算法简单
·我们人肉切换,只要足够快
·我们还是可以保证较高的可用性。 - 但是如何保证主副本是真的失效了呢?
·在切换的过程中,主副本又开始接收client端的请求·两个主副本显然是不正确的,log会被覆盖写掉·我们希望算法能在这种场景下仍然保持正确 - 要是增加到三个节点呢?
·能不能允许少数节点挂了的情况下,仍然可以工作
. falut-tolerance
2.3 共识算法
含义:一个值一旦确定,所有人都认可
缺点:错误总是发生、错误类型很多、容错(有文章证明是一个不可能的任务)
- 共识协议不等于一致性
- 应用层面不同的一致性,都可以用共识协议来实现。比如可以故意返回旧的值
- 简单的复制协议也可以提供线性一致性
- 一般讨论共识协议时提到的一致性,都指线性一致性
- 因为弱一致性往往可以使用相对简单的复制算法实现
03.共识算法案例:Raft
3.1 Paxos
Paxos算法可以说是一致性领域最著名的算法之一了
Paxos算法解决的问题正是分布式一致性问题,即一个分布式系统中的各个进程如何就某个值(决议)达成一致。
Paxos将系统中的角色分为提议者 (Proposer),决策者 (Acceptor),和最终决策学习者 (Learner)。
3.2 Raft
Raft是一种共识算法,旨在替代Paxos。 它通过逻辑分离比Paxos更容易理解,但它也被正式证明是安全的,并提供了一些额外的功能。[1] Raft提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都同意一系列相同的状态转换。 它有许多开源参考实现,具有Go,C ++,Java和Scala中的完整规范实现。
-
Raft 是在 paxos 的基础上的基础上,着重于易于理解
- 协议接口直接暴露 Log 给用户
- 强 Leader 简化 Paxos 中的二阶段
- 使用随机事件简化选主逻辑
-
Raft 的基本工作原理
- 各个节点的角色
- Log 同步
- 失效节点如何恢复 Log
- 如何选举新 Leader
- Term 以及安全性的保证
-
Raft 在工程中的优化
- Prevote 的应用,防止离群 Leader 重加入时引发的切主
Raft角色
3.3 Raft安全性-同Term
- 对于Term内的安全性
- 目标:
- 对于所有已经的commited的<term, index>位置上至多只有一条log
- 由于Raft的多数派选举,我们可以保证在一个term中只有一个leader
- 目标:
- 我们可以证明一条更严格的声明:在任何<term,index>位置上,至多只有一条log
3.4 Raft安全性–跨Term
- 对于跨Term的安全性
- 目标:
- ·如果一个log 被标记commited,那这个log一定会在未来所有的leader中出现Leader completeness
- 目标:
- 可以证明这个property
- Raft选举时会检查Log的是否outdated,只有最新的才能当选Leader
- 选举需要多数派投票,而commited log 也已经在多数派中(必有overlap )
- 新Leader一定持有commited log,且 Leader永远不会overwrite log
04.KV
4.1 一致性读写的定义
- Raft 不保证一直有一个 leader
- 只保证一个term至多有一个leader
- 可能存在多个term的leader
- Split-brain
多个副本只有单个副本可以提供服务 服务无法水平拓展 ·增加更多Raft 组 ·如果操作跨Raft 组
4.2 回到共识算法
Raft :关于Log
- 论文中就给出的方案,当过多的Log占用后,启动snapshot,替换掉Log。如果对于持久化的状态机,如何快速的产生Snapshot
- 多组Raft的应用中,Log 如何合流
- 关于configuration change
- 论文中给出的joint-consensus以及单一节点变更两种方案
·Raft是正确的,但是在工程世界呢?
·真实世界中不是所有的错误都是完美fail-stop的
. cloudflare的case,etcd在partial network 下, outage 了6个小时[1]
4.3 共识算法的未来
高性能
- 数据中心网络100G,时延约为几个us
- RDMA网卡以及programable switch的应用
- 我们想要的是:us级别的共识,以及us 级别的容错
- HovercRaft
- P4 programable switch : IPmulticast
- Mu
- Use one-sided RDMA
- pull based heartbeat instead of push-based.
- 多节点提交(Leaderless)
- 节点跨地域,导致节点间的RTT(Round Trip Time)很大
- EPaxos[1]
- 使用了冲突图的方式来允许并行Commit
- 不冲突的情况下1RTT提交时间
三、个人总结:
1.了解了分布式一致性协议相关问题以及共识协议中的Paxos和Raft。
2.算法共识的未来
四、参考文献
juejin.cn/post/713013… 作者:青训营官方账号
[1] Wang, Zhaoguo, et al. "On the Parallels between Paxos and Raft, and how to Port Optimizations." Proceedings ofthe 2019 ACM Symposium on Principles of Distributed Computing. 2019.
[2]Howard,Heidi, and Richard Mortier. "Paxos vs Raft: Have we reached consensus on distributed consensus?."Proceedings of the 7th Workshop on Principles and Practice of Consistency for Distributed Data.2020
《ApacheHadoop YARN: Yet Another Resource Negotiator》