主页

索引

模块索引

搜索页面

分布式系统

备注

设计分布式系统的两大初衷:横向扩展(scalability)和高可用性(availability)。“横向扩展” 是为了解决单点瓶颈问题,进而保证高并发量下的「可用性」;“高可用性” 是为了解决单点故障(SPOF)问题,进而保证部分节点故障时的「可用性」。由此可以看出,分布式系统的核心诉求就是「可用性」。这个「可用性」正是 CAP 中的 A:用户访问系统时,可以在合理的时间内得到合理的响应。

分布式系统的核心问题

https://img.zhaoweiguo.com/uPic/2022/12/Ooe9yn.jpg

分布式系统的 8 个错误观念: https://architecturenotes.co/fallacies-of-distributed-systems/

主要内容:

一致性问题VS共识问题

分布式计算的8个谬论(通过网络进行分布式运算的八宗罪 (8 Fallacies of Distributed Computing)):

The network is reliable.
Latency is zero.
Bandwidth is infinite.
The network is secure.
Topology doesn't change.
There is one administrator.
Transport cost is zero.
The network is homogeneous.

网络是可靠的(The network is reliable)
延迟是不存在的(Latency is zero )
带宽是无限的(Bandwidth is infinite)
网络是安全的(The network is secure)
拓扑结构是一成不变的(Topology doesn't change)
总会有一个管理员(There is one administrator)
不考虑传输成本(Transport cost is zero)
网络是同质化的(The network is homogeneous)

一致性

分布式集群中多个服务节点,对给定的操作,根据给定的协议,对处理结果对外保持一致.
不在乎结果是否正确,而是保证对外呈现的状态一致.所有节点失败也是一种一致.

引起不一致的因素:

节点间网络通信的不可靠,消息延迟,消息乱序,内容错误.
节点处理时间无法保证: 结果可能错误,或者节点宕机.

满足一致性的要求:

1. 有限时间完成请求的处理
2. 不同节点完成的结果相同
3. 决策的结果必须是某个节点提出的提案.

强一致性需要:

顺序保证. 时钟

共识

对某一操作,达成一直的过程.
通常达成这个一过程需要集群中的节点进行广播投票.
但是由于分布式节点间的不稳定: 网络不可靠,节点宕机,假消息等.达成共识并不容易.

针对如上不稳定的情况,把故障分为:

非拜占庭错误(出现消息不响应,但是消息不会被篡改)
拜占庭错误(存在伪造消息的情况).

共识算法:

CFT类 针对非拜占庭错误有:
    PAXOS 算法.
    Raft算法.
    容错较好,处理快,保证不超过一半节点故障.
BFT类 针对拜占庭错误有:
    PBFT 确定性算法,
    POW 工作量证明的概率算法.

主要定义简介

FLP不可能原理:

异步系统,不存在任意场景下都能实现共识的算法.

分布式同步:

系统各个节点时钟误差存在上限,消息传递必须在规定时间内完成,否则认为失败.(传统的分布式中,统一时钟,超时失败等都是同步)

分布式异步:

系统各个节点时钟存在较大差距,消息传递时间任意长(无法判断节点故障还是网络延迟)

CAP 一致性:

分布式计算系统不可能同时保证 强一致性,高可用性,高分区容忍性.

折中选择:

弱化一致性:对结果不敏感的应用可以允许最终一致. CouchDB
弱化可用性:对结果一致性敏感,银行,当系统故障时会拒绝服务.MongoDB, Redis, MapReduce 为此设计.
    PAXOS 等共识算法主要处理这种情况. 可能存在无法提供可用结果的情况,同时允许部分节点离线.
弱化分区容忍性: 网络分区出现概率较小, 两阶段提交算法,关系型数据库,ZK主要考虑这种情况设计的.
    实践中网络可用是双通道,弱化网络不稳定因素.

分布式系统的设计目标一般包括:

扩展性 :增加机器不改变或极少改变系统行为,并能获得近似线性的性能提升;
性能 :指分布式系统进行服务时的延时和吞吐率是满足用户需要的;
可用性 :分布式系统的核心需求,表示分布式系统是否处于整体可服务并且一直可服务的状态;
容错性 :系统发生错误时,系统有对错误进行规避和恢复的能力。

一套分布式系统的主要物理要素包括节点的数目以及节点间的距离。仅这两点的更改就会引入以下限制:

节点数增加会导致系统整体出错概率增大
节点数增加会导致节点间通信量增加
节点间距离增加会导致系统最优(或部分)性能变差

抛开工程的视角,仅从理论层面看,分布式系统也存在着如下三类视角的系统划分:

1. 保持一致:
   系统中相关数据间的逻辑关系应当是正确和完整的。
   极端情况下,从系统中任意部分读取而获得的数据应当都为最近写入的数据;
2. 处理失效:
   分布式系统可能出现的失效状况有三类:节点失效、网络分区失效、拜占庭失效。
   极端情况下,系统的执行和操作不会受到任何系统内部失效的影响;
3. 时钟同步:
   分布式系统有两种模型:同步系统和异步系统。
   同步系统会确保所有执行过程的步调一致,且各执行过程有精确的时钟。
        即任意处理过程能够得到精确的执行流程的偏序关系,也就意味着每个处理过程和通信都在有限的时间内进行。
   异步系统则相反,没有任何时序性保证。
        即各处理过程是完全以自己的节拍在运行,不存在有效的同步时钟,也意味着过程间的通信延时可能会趋于无穷大。

备注

不幸的是,在实际应用中,理想的分布式系统实际是不可能实现的。

linearizable语义

线性化(linearizable)是分布式系统中比较重要的概念:

是对单对象上的单个操作的一种顺序保证,
它提供了对于「同一对象的一系列读写操作都是按照实时时间排序」的保证。

简单说,linearizability保证对于一个对象的写操作一旦完成,需要立即被后续读操作看到,
即读操作一定是读到该对象的最新的值。

从这个角度看,linearizability 与 atomic consistency是同义词
即CAP原则中的Consistency

收集

分布式系统的基本特性:

1. 网络传输的三态性:
    「三态」即: 成功、失败与超时
    如何使通信的代价降到用户可以忍耐的层次是分布式系统设计的重要目标
2. 异构性
    必须要考虑一种通用的服务集成和交互方式来屏蔽异构系统之间的差异
    异构系统之间的不同处理方式会对系统设计和开发带来难度和挑战
3. 负载均衡
    为了提高系统的整体效率和吞吐量,必须考虑最大程度发挥每个节点的作用
    负载均衡是保证系统运行效率的关键技术
4. 数据一致性
5. 服务的可用性

分布式系统的基本特性,无法避免,只能想办法进行利用和管理,这就给我们设计和实现分布式系统提出了挑战

参考

主页

索引

模块索引

搜索页面