分布式系统
✔分布式系统面临的挑战
- 数据规模越来越大
- 服务的可用性要求越来越高
- 快速迭代的业务要求系统足够易用
✔理想中的分布式系统
- 高性能:可拓展、低时延、高吞吐
- 正确:一致性、易于理解
- 可靠:容错、高可用
🎈从HDFS开始
分布式系统就是让终端用户把一组工作在一起的计算机当做一个单独的机器来使用
数据规模的不断增加,我们需要大规模分布式系统
分布式系统最大的好处就是能够让开发者横向地扩展系统。
一致性与共识算法
什么是一致性
一致性是一种模型(或语义)来约定一个分布式系统如何向外界 (应用)提供服务。
对于我们的KV像操作一台机器一样要读到最近写入的值。
KV中常见的一致性模型:
- 最终一致性: 读取可能暂时读不到但是总会读到
- 线性一致性:最严格,线性执行
复制协议
- 当主副本失效时,为了使得算法简单,我们人肉切换,只要足够快我们还是可以保证较高的可用性。
- 但是如何保证主副本是真的失效了呢?
- 在切换的过程中,主副本又开始接收client端的请求
- 两个主副本显然是不正确的,log 会被覆盖写掉
- 我们希望算法能在这种场景下仍然保持正确
- 要是增加到三个节点呢?
- 每次都等其他节点操落盘性能较差
- falut-tolerance能允许少数节点挂了的情况下,仍然可以工作
共识算法
✔概念
协商一致问题需要多个进程(或代理)达成一致。一个单一的数据值。有些过程(代理)可能在其他方面失败或不可靠,因此,协商一致的协议必须具有容错性或弹性。
简而言之一个值一旦确定,所有人都认同,
- 共识协议不等于一致性
- 应用层面不同的一致性,都可以用共识协议来实现
- 简单的复制协议也可以提供线性一致性
- 一般讨论共识协议时提到的一致性,都指线性一致性
- 因为弱一致性往往可以使用相对简单的复制算法实现
一致性往往指分布式系统中多个副本对外呈现的数据的状态。
共识则描述了分布式系统中多个节点之间,彼此对某个状态达成一致结果的过程。系统中多个节点最关键的是对多个事件的顺序进行共识(排序)。
一致性协议案例:Raft
Raft是一个分布式共识算法,分布式共识算法还有Paxos,不过Paxos很难理解。
Raft与2014年发表,以易于理解作为算法的设计目标,使用了
- 使用了RSM、Log、RPC的概念
- 直接使用RPC对算法进行了描述
- Strong Leader-based
- 使用了随机的方法减少约束
Raft角色
Raft Term
- 每个Leader服务于一个term
- 每个term至多只有一个leader
- 每个节点存储当前的term
- 每个节点term从一开始,只增不减
- 所有rpc的request reponse都携带term
- 只commit本term内的log
Raft的安全性
- 对于Term内的安全性
- 对于所有已经的commited的<term, index>位置上至多只有一条log(目标)
- 由于Raft的多数派选举,我们可以保证在一个term 中只有一个leader
- 对于跨Term的安全性:
- 目标:如果一个log被标记commited,那这个log一定会在未来所有的leader中出现Leader completeness