这是我参与「第四届青训营 」笔记创作活动的的第14天
一、分布式系统
分布式系统面临的挑战
- 数据规模越来越大
- 服务的可用性要求越来越高
- 快速迭代的业务 要求系统足够易用
理想中的分布式系统
- 高性能:可拓展、低时延、高吞吐
- 正确:一致性、易于理解
- 可靠:容错、高可用
二、一致性与共识算法
从复制开始
既然一台机器会挂,如果两个副本都能接受请求
如何复制
- 主副本定期拷贝全量数据到从副本
- 主副本拷贝操作到从副本
- 主副本把所有的操作打包成Log
- 所有的Log写入都是持久化的,保存在磁盘上
- 应用包装成状态机,只接收Log作为Input
- 主副本确认Log已经成功写入到副本机器上,当状态机apply后,返回客户端
关于读操作
- 读操作
- 方案一:直接读状态机,要求写操作进入状态机后再返回client
- 方案二:写操作复制完成后直接返回,读操作Block等待所有pending log进入状态机
什么是一致性
- 对于我们的KV
- 像操作一台机器一样
- 要读到最近写入的值
- 像操作一台机器一样
- 致性是一种模型(或语义)
- 来约定一个分布式系统如何向外界(应用)提供服务
- KV中常见的一致性模型
- 最终一致性: 读取可能暂时读不到但是总会读到
- 线性一致性:最严格,线性执行
复制协议
- 当主副本失效时,为了使得算法简单
- 我们人肉切换,只要足够快
- 我们还是可以保证较高的可用性。
- 我们人肉切换,只要足够快
- 但是如何保证三三副本是真的失效了呢?
- 在切换的过程中,主副本又开始接收client端的请求
- 两个主副本显然是不正确的,log 会被覆盖写掉
- 我们希望算法能在这种场景下仍然保持正确
- 要是增加到三个节点
- 每次都等其他节点操落盘性能较差
- 能不能允许少数节点挂了的情况下,仍然可以工作
- falut-tolerance
共识算法
共识协议不等于一致性
- 应用层面不同的一致性,都可以用共识协议来实现
- 比如可以故意返回旧的值
- 简单的复制协议也可以提供线性一致性
- 一般讨论共识协议时提到的一致性,都指线性一致性
- 因为弱一致性往往可以使用相对简单的复制算法实现