这是我参与「第四届青训营 」笔记创作活动的第14天
分布式系统
分布式系统面临的挑战
- 数据规模越来越大
- 服务的可用性要求越来越高
- 快速迭代的业务要求系统足够易用
远程过程调用(RPC): 分布式系统中通常将不同组件,或者不同节点的交互使用 RPC 的方式进行封装,在调用方的视角一次远程过程调用不需要关心如何对请求和响应进行编码,也不用关心具体的网络传输。
理想中的分布式系统:
- 高性能:可拓展、低时延、高吞吐
- 正确:一致性、易于理解
- 可靠:容错(架构上的概念,一种高可用)、高可用
总结
- 背景:数据规模的不断增加,我们需要大规模分布式系统
- 维度:对于一个分布式系统,希望能有哪些特征
- 从KV入手,看看我们如何满足分布式系统的要求
一致性与共识算法
复制
由于一台机器可能会挂,所以需要副本。解决:一主一从复制
如何复制
- 主副本将所有的操作打包成Log 所有的Log雪茹都是持久化的,保存在磁盘上
- 应用包装成状态机,只接受Log最为Input
- 祝福本确认Log已经成功写入到副本机器上,当状态机apply后,返回client
复制操作:
-
主副本把所有的操作打包成Log,所有的Log写入都是持久化的,保存在磁盘上
-
应用包装成状态机,只接收Log作为Input
-
主副本确认Log已经成功写入到副本机器上,当状态机apply后,返回客户端
读操作
-
方案一:直接读状态机,要求写操作进入状态机后再返回client
-
方案二:写操作复制完成后直接返回,读操作Block等待所有pending log进入状态机
-
如果不遵循上述两周方案呢?可能存在刚刚写入的值读不到的情况(在 Log中)
一致性
对于KV,箱操作一台机器一样,读到最近写入的值
一致性是一种模型(或语义)
共识算法
共识协议不等于一致性
- 应用层面不同的一致性,都可以用公式协议来实现
-
- 比如故意返回旧的值
- 简单的赋值协议也可以提供线性一致性
小结
- 使用副本的方式设计了KV
- 了解了什么是一致性
- 了解了什么是共识算法
- 设计了一个正确且容错的一致性是一个难题