分布式系统和一致性
这篇文章我们谈及分布式系统
的基本概念,分布式中一致性
,还有共识算法
如果对网络编程,分布式系统已经有了解,会非常有助于理解一致性和共识算法的概念
分布式系统
在网络世界中,存在用户/服务器的连接,用户/用户的连接,服务器/服务器的连接
我们最常见也就是用户/服务器的方式了,如web服务器
网络的设计结构
- 第一层:用户表示层,浏览器页面的显示,涉及:html,xml
- 第二层:应用层,客户端,服务器的代码,称为应用服务层,如web服务(HTTP)
- 第三层:中间层,转换应用层代码,程序员在设计程序时,不用担心不同的操作系统和接口,代码跨平台。标准化的接口和协议
- 第四层:通信协议,规定了传送数据的接口和方式。如:TCP/IP
- 第五层:操作系统
- 第六层:硬件平台
在C/S的服务架构中,Srever一直是中心化的设置,在储存、性能上马上遇到了瓶颈。随后有了分布式的系统架构。有两种常用设计:
- 提高系统容量,垂直增大容量或者拆分业务,构建分布式架构
- 提高可用性,防止单点故障。所有的服务器保持高一致性,区块链就是这种设计
优点:模块化,允许服务重用度高
一致性
大前提:网络基本可靠,在网络不可靠的情况下,很难达成一致。
在分布式系统中,最难解决的就是一致性的问题。其实衡量分布式系统有三个指标,在Eric Brewer等大佬提出了,CAP理论。
一致性(Consistency):所有节点在同一时刻能够看到同样的数据,也即“强一致性”;
可用性(Availability):确保每个请求都可以收到确定其是否成功的响应;
分区容忍性(Partition tolerance):因为网络故障导致的系统分区不影响系统正常运行。
一个分布式只能同时满足两个,不可能同时满足,这里我们讨论的是同步分布式系统。
因为有个叫做FLP定理,描述异步分布式系统,不存在达成一致性的共识算法,这里我也就不提了。
这三个属性用来衡量一个分布式系统的性能指标:
弱化一致性:
常常用于实时性要求不高的场景,不要求随时同步,具有高可用性,也就是速度块,如:静态页面;实时性不高的数据库
弱化可用性:保持高一致性,使用场景如银行ATM取钱,相关算法:Paxos,Raft
弱化分区容忍性:通过双通道,是网络稳定。
共识算法
为了解决一致性问题,科学家们想了很多方法
在几个世纪以前,虽然没有计算机,不存在分布式系统一致性的问题,但是城邦之间通信,为了达成一致,也是什么困难的一件,所以我们可以认为城邦之间达成一致,就是一致性问题的现实版
如果说真要解决实际问题,不光要考虑用什么方法传送数据达成共识。还要考虑通信中断,节点作恶,更可怕的是作恶节点还达成一致。遇到这样的情况,有什么算法在节点作恶的情况下,依然能达成一致么?
答案是肯定的,所谓的PBFT拜占庭容错算法,就是解决这类问题。如今,中本聪在吸收了PBFT后,创造了POW工作量证明算法。
共识算法分分类
- 拜占庭问题解决方案:PBFT POW DBFT
- 非拜占庭问题解决方案:RAFT PAXOS