浅谈分布式系统一致性和共识算法

分布式系统和一致性

这篇文章我们谈及分布式系统的基本概念,分布式中一致性,还有共识算法

如果对网络编程,分布式系统已经有了解,会非常有助于理解一致性和共识算法的概念

分布式系统

在网络世界中,存在用户/服务器的连接,用户/用户的连接,服务器/服务器的连接

我们最常见也就是用户/服务器的方式了,如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