分布式系统中重要概念

一、先来一张图

二、一致性问题

1、定义:

在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致

2、面临挑战:

节点之间的网络通讯是不可靠的,包括任意延迟和内容故障

节点的处理可能是错误的,甚至节点自身随时可能宕机

同步调用会让系统变得不具备可扩展性

3、背后的解决思想:

将可能引发不一致的并行操作进行串行化

4、理想的分布式一致性应满足:

可终止性(Termination):一致的结果在有限时间内能完成

共识性(Consensus):不同节点最终完成决策的结果应该相同

合法性(Validity):决策的结果必须是其它进程提出的提案

5、带约束的一致性:

现状->绝对理想的强一致性(Strong Consistency)代价很大

强一致性包括:顺序一致性,线性一致性

三、共识算法

1、目标:

共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认为任何需要达成一致的信息都是一个提案

2、面临的挑战:

非拜占庭错误:(1)故障不响应 (2)针对非拜占庭错误的情况,一般包括paxos、raft及其变种

拜占庭错误:(1)恶意响应 (2)对于要能容忍拜占庭错误的情况,一般包括 PBFT 系列、PoW 系列算法等。从概率角度,PBFT 系列算法是确定的,一旦达成共识就不可逆转;而 PoW 系列算法则是不确定的,随着时间推移,被推翻的概率越来越小

3、理论界限:

即便在网络通信可靠情况下,一个可扩展的分布式系统的共识问题的下限是无解

四、FLP定理

1、定义:FLP 不可能原理:在网络可靠,存在节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性算法

2、意义:不要浪费时间去为异步分布式系统设计在任意场景下都能实现共识的算法

五、CAP定理

1、定义:分布式计算系统不可能同时确保一致性(Consistency)、可用性(Availablity)和分区容忍性(Partition),设计中往往需要弱化对某个特性的保证

一致性:任何操作应该都是原子的,发生在后面的事件能看到前面事件发生导致的结果,注意这里指的是强一致性

可用性:在有限时间内,任何非失败节点都能应答请求

分区容忍性:网络可能发生分区,即节点之间的通信不可保障

2、应用:

设计系统时必然要弱化对某个特性的支持

六、ACID原则

1、ACID 原则描述了对分布式数据库的一致性需求,同时付出了可用性的代价

Atomicity:每次操作是原子的,要么成功,要么不执行

Consistency:数据库的状态是一致的,无中间状态

Isolation:各种操作彼此互相不影响

Durability:状态的改变是持久的,不会失效

2、BASE

一个与之相对的原则是 BASE(Basic Availiability,Soft state,Eventually Consistency),牺牲掉对一致性的约束(最终一致性),来换取一定的可用性

七、Paxos算法与Raft算法

1、Paxos算法

Paxos要解决的问题是指分布式的系统中存在故障(fault),但不存在恶意(corrupt)节点场景(即可能消息丢失或重复,但无错误消息)下的共识达成(Consensus)问题。因为最早是 Leslie Lamport 用 Paxon 岛的故事模型来进行描述而命名

基于两阶段提交并扩展

如何理解Paxos算法(网上已经有过很多的讨论,基本的观点是这个算法学习与理解的成本很高,这才有了后面简化的实现Raft)

下图是尝试针对Paxos算法的梳理:

2、Raft算法

Raft 算法是Paxos 算法的一种简化实现

三种角色:leader、candidate、follower

基本过程:(1)Leader 选举:每个 candidate 随机经过一定时间都会提出选举方案,最近阶段中得票最多者被选为 leader (2)同步 log:leader 会找到系统中 log 最新的记录,并强制所有的 follower 来刷新到这个记录(注:此处 log 并非是指日志消息,而是各种事件的发生记录)

参考资料:http://www.infoq.com/cn/articles/raft-paper

八、拜占庭问题和算法

1、拜占庭问题Byzantine Generals Problem

拜占庭问题更为广泛,讨论的是允许存在少数节点作恶(消息可能被伪造)场景下的一致性达成问题。拜占庭算法讨论的是最坏情况下的保障

对于拜占庭问题来说,假如节点总数为 N,叛变将军数为 F,则当  时,问题才有解,即 Byzantine Fault Tolerant (BFT) 算法

2、Byzantine Fault Tolerant 算法

面向拜占庭问题的容错算法,解决的是网络通信可靠,但节点可能故障情况下的一致性达成

最早由 Castro 和 Liskov 在 1999 年提出的 Practical Byzantine Fault Tolerant(PBFT)是第一个得到广泛应用的 BFT 算法。只要系统中有  的节点是正常工作的,则可以保证一致性。

PBFT 算法包括三个阶段来达成共识:Pre-Prepare、Prepare 和 Commit

3、新的解决思路

限制一段时间内整个网络中出现提案的个数(增加提案成本)

放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在

应用场景:区块链技术中应用Pox算法

九、可靠性指标

1、数据上看是能达到几个9的能力

2、基本思路:(1)让系统中的单点变得更可靠 (2)消灭单点

你可能感兴趣的:(分布式系统中重要概念)