1、分布式系统的经典基础理论
分布式系统是由多个独立的计算机节点组成的系统,这些节点通过网络相互连接并协同工作,以完成特定的任务。
分布式系统中3个常见的概念: 分布式系统设计理念 、 CAP定理 、 BASE理论 ,关于分布式系统的还有很多东西。
2、分布式系统设计理念
2.1 可靠性
分布式系统需要保证高可靠性,就是在节点故障或网络故障的情况下,也能够保持系统的正常运行。为了实现这个目标,分布式系统通常采用冗余设计和容错技术,例如备份节点、数据复制和负载均衡等。
2.2 可扩展性
分布式系统需要能够支持横向扩展,就是能够通过增加节点来扩展系统的处理能力。为了实现这个目标,分布式系统通常采用分布式数据存储和分布式计算等技术,以便将负载平均分配到各个节点上。
2.3 可维护性
分布式系统需要能够方便地进行维护和管理。为了实现这个目标,分布式系统通常采用自动化运维和监控技术,例如自动部署、自动扩缩容和实时监控等。
2.4 可移植性
分布式系统需要能够在不同的硬件和软件平台上运行。为了实现这个目标,分布式系统通常采用标准化的接口和协议,以便在不同平台上实现互操作性。
2.5 安全性
分布式系统需要能够保证数据和系统的安全。为了实现这个目标,分布式系统通常采用安全传输协议和数据加密技术,以及访问控制和身份认证等安全机制。
强烈推荐《分布式架构原理与实践》,它是一本非常好的分布式架构原理与实践学习教程,内容全面详细,清晰易懂,很有实战意义,非常适合开发人员学习,希望对大家有所帮助!
3、CAP定理
3.1 什么是CAP
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)
、 Availability(可用性)
、Partition tolerance(分区容错性)
这三个基本需求,最多只能同时满足其中的2个。
-
一致性:数据在多个副本之间能够保持一致的特性。
-
可用性:系统提供的服务一直处于可用的状态,每次请求都能获得正确的响应。
-
分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
3.2 什么是分区
在分布式系统中,不同的节点分布在不同的子网络中,由于一些特殊的原因,这些子节点之间出现了网络不通的状态,但他们的内部子网络是正常的。从而导致了整个系统的环境被切分成了若干个孤立的区域,这就是分区。
3.3 为什么三者不可得兼
首先,我们得知道,分布式系统,是避免不了分区的,分区容错性是一定要满足的,我们看看在满足分区容错的基础上,能不能同时满足一致性
和可用性
?
假如现在有两个分区N1
和N2
,N1和N2分别有不同的分区存储D1和D2,以及不同的服务S1和S2。
-
在满足
一致性
的时候,N1和N2的数据要求值一样的,D1=D2。 -
在满足
可用性
的时候,无论访问N1还是N2,都能获取及时的响应。
现在有这样的场景:
-
用户访问了N1,修改了D1的数据。
-
用户再次访问,请求落在了N2。此时D1和D2的数据不一致。
接下来:
-
保证
一致性
:此时D1和D2数据不一致,要保证一致性就不能返回不一致的数据,可用性
无法保证。 -
保证
可用性
:立即响应,可用性得到了保证,但是此时响应的数据和D1不一致,一致性
无法保证。
所以,可以看出,分区容错的前提下,一致性
和可用性
是矛盾的。
3.4 CAP原则权衡
CAP三者不可同得,那么必须得做一些权衡。
CA without P❌
如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但是对于分布式系统,分区是客观存在的,其实分布式系统理论上是不可选CA的。
CP without A
如果不要求A(可用),相当于每个请求都需要在Server之间强一致,而P(分区)会导致同步时间无限延长,如此CP也是可以保证的。很多传统的数据库分布式事务都属于这种模式。
AP wihtout C
要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。现在众多的NoSQL都属于此类。
3.5 CAP原则实际应用
我们应该都接触过微服务,常见的可以作为注册中心的组件有:ZooKeeper、Eureka、Nacos等等。
-
ZooKeeper 保证的是 CP。 任何时刻对 ZooKeeper 的读请求都能得到一致性的结果,但是,ZooKeeper 不保证每次请求的可用性,比如在Leader 选举过程中或者半数以上的机器不可用的时候服务就是不可用的。
-
Eureka 保证的则是 AP。 Eureka 在设计的时候就是优先保证 A (可用性)。在 Eureka 中不存在什么 Leader 节点,每个节点都是一样的、平等的。因此 Eureka 不会像 ZooKeeper 那样出现选举过程中或者半数以上的机器不可用的时候服务就是不可用的情况。 Eureka 保证即使大部分节点挂掉也不会影响正常提供服务,只要有一个节点是可用的就行了。只不过这个节点上的数据可能并不是最新的。
-
Nacos 不仅支持 CP 也支持 AP。
4、BASE理论
4.1 什么是BASE理论
BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写。
BASE 理论是对 CAP 中一致性 C 和可用性 A 权衡的结果,其来源于对大规模互联网系统分布式实践的总结,它是基于 CAP 定理逐步演化而来的,它大大降低了我们对系统的要求。
BASE理论的核心思想是:
即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
4.2 BASE理论的三个特性
基本可用
什么是基本可用呢?
假如系统出现了不可预知故障,允许损失部分可用性,当然也不能完全不可用。
损失的这部分可用性指的是什么?
-
响应时间上的损失:正常情况下的搜索引擎0.5秒即返回给用户结果,而基本可用的搜索引擎可以在2秒作用返回结果。
-
功能上的损失:在一个电商网站上,正常情况下,用户可以顺利完成每一笔订单。但是到了大促期间,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面。
软状态
软状态指允许系统中的数据存在中间状态(CAP 理论中的数据不一致),并认为该中间状态的存在不会影响系统的整体可用性,就是允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
分布式一致性的 3 种级别:
-
强一致性 :系统写入了什么,读出来的就是什么。
-
弱一致性 :不一定可以读取到最新写入的值,也不保证多少时间之后读取到的数据是最新的,只是会尽量保证某个时刻达到数据一致的状态。
-
最终一致性 :弱一致性的升级版,系统会保证在一定时间内达到数据一致的状态。
业界比较推崇是最终一致性级别,但是某些对数据一致要求十分严格的场景比如银行转账还是要保证强一致性。
最终一致性怎么保证呢?
-
读时修复 : 在读取数据时,检测数据的不一致,进行修复。比如 Cassandra 的 Read Repair 实现,具体来说,在向 Cassandra 系统查询数据的时候,如果检测到不同节点的副本数据不一致,系统就自动修复数据。
-
写时修复 : 在写入数据,检测数据的不一致时,进行修复。比如 Cassandra 的 Hinted Handoff 实现。具体来说,Cassandra 集群的节点之间远程写数据的时候,如果写失败就将数据缓存下来,然后定时重传,修复数据的不一致性。
-
异步修复 : 这个是最常用的方式,通过定时对账检测副本数据的一致性,并修复。
5、总结
CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸,ACID 是数据库事务完整性的理论。
CAP理论严格来讲不是三选二,而是CP
、AP
二选一,因为通常P
(分区容错性)是必须得到保证的。
BASE理论面向的是大型高可用、可扩展的分布式系统。与传统ACID特性相反,不是强一致性模型,BASE提出通过牺牲强一致性来获得可用性,并允许数据一段时间内的不一致,但是最终需要达到一致状态。
6、分布式系统常见解决方案
6.1 分布式事务
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
6.2 一致性协议/算法
早在1900年就诞生了著名的 Paxos经典算法 (Zookeeper就采用了Paxos算法的近亲兄弟Zab算法),但由于Paxos算法非常难以理解、实现、排错。所以不断有人尝试简化这一算法,直到2013年才有了重大突破:斯坦福的Diego Ongaro、John Ousterhout以易懂性为目标设计了新的一致性算法——Raft算法 ,并发布了对应的论文《In Search of an Understandable Consensus Algorithm》,到现在有十多种语言实现的Raft算法框架,较为出名的有以Go语言实现的Etcd,它的功能类似于Zookeeper,但采用了更为主流的Rest接口。
6.3 分布式存储
分布式存储系统将数据分散存储在多台独立的设备上。
传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。
分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
6.4 分布式计算
所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
分布式网络存储技术是将数据分散的存储于多台独立的机器设备上。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。
参考:
[1]. 分布式理论(一) - CAP定理
[2]. CAP理论
[3]. 分布式理论(二) - BASE理论
[4]. BASE理论