乐趣区

关于后端:浅析分布式理论的CAP

大家好,我是易安!

明天让咱们来聚焦于分布式系统架构中的重要实践——CAP 实践。在分布式系统中,可用性和数据一致性是两个至关重要的因素,而 CAP 实践就是在这两者之间提供了一种衡量的准则,帮忙咱们在设计分布式系统时进行决策。同时,CAP 实践的呈现也深刻影响着分布式系统的倒退和设计。然而在当今这个工夫点,业界对于 CAP 实践的了解和利用也在一直地发生变化,咱们一起探讨下这些新的思考和意识

什么是 CAP 实践

CAP 实践是加州理工大学伯克利分校的 Eric Brewer 传授在 2000 年 7 月的 ACM PODC 会议上首次提出的,它是 Eric Brewer 在 Inktomi 期间研发搜索引擎、分布式 Web 缓存时得出的对于数据一致性(C:Consistency)、服务可用性(A:Availability)、分区容错性(P:Partition-tolerance)的一个驰名猜测:

It is impossible for a web service to provide the three following guarantees : Consistency, Availability and Partition-tolerance.

在这个猜测提出的 2 年当前,来自麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从实践上证实了 Eric Brewer 传授的 CAP 猜测是成立的,从此,CAP 实践在学术上正式成为了分布式畛域公认的定理,并深刻影响着分布式系统的倒退。

CAP 实践通知咱们,一个分布式系统不可能同时满足数据一致性、服务可用性和分区容错性这三个根本需要,最多只能同时满足其中的两个。为什么会这样呢?咱们先来理解一下 CAP 实践对于数据一致性、服务可用性和分区容错性是怎么定义的。

一致性(C)

CAP 实践中的一致性是指强一致性(Strong Consistency),又叫线性一致性(Linearizable Consistency),它要求多节点组成的分布式系统,能像单节点一样运作,如果一个写操作返回胜利,那么之后的读申请都必须读到这个新数据;如果返回失败,那么所有的读操作都不能读到这个数据。

一致性中除了强一致性之外,还有其余的一致性级别,比方序列一致性(Sequential Consistency)和最终一致性(Eventual Consistency)等,这个在前面的课程“一致性与共识(一)”中会有具体的介绍。

可用性(A)

CAP 实践对可用性的定义,指的是要求零碎提供的服务必须处于 100% 可用的状态,对于用户的每一个操作申请,零碎总可能在无限的工夫内返回后果。上面咱们重点来探讨可用性定义中的三个关键点:“100% 可用”、“无限工夫内”和“返回后果”

  • 第一点,100% 可用,既不是 99% 可用,也不是 99.99% 可用,它说的是零碎必须齐全可用,不容许任何不可用的状况呈现,这是一个十分现实的模型。
  • 第二点,无限工夫内,它指的是对于客户端的一个申请,零碎必须在指定的工夫内返回对应的申请后果,如果超过了这个工夫,零碎就被认为是不可用的。一般来说,“无限工夫内”是零碎在设计的时候,就设定好的零碎运行指标,不同的零碎之间会有十分大的差异。

例如,对于一个服务在线业务的 OLTP 数据库 MySQL,它的“无限工夫”个别不会超过 1 秒,然而对于服务离线剖析的 OLAP 数据库 Hive,它的“无限工夫”可能会超过 30 秒,甚至更长。

尽管不同的零碎对于“无限工夫”的设定差异十分大,然而对于一个给定的零碎来说,在设定了这个“无限工夫”之后,只有对一个申请的响应超过了这个工夫,咱们就认为这个零碎是不可用的。

  • 第三点,返回后果,这是指零碎在实现对客户端申请的解决后,必须返回一个失常的响应后果。客户端能够依据这个响应后果,来明确判断这个申请执行胜利还是失败,而不是返回一个让用户无奈判断的不失常的响应后果。

比方客户发动一个申请,从用户 A 的账户转 50 元到用户 B 的账户,“转账胜利”和“余额有余”都是失常的响应后果,而“服务不可达”和“服务器外部谬误”等就是不失常的响应后果。

分区容错性(P)

分区指的是在整个分布式系统中,因为各种网络起因,零碎被分隔成多个独自的局部,它不仅蕴含咱们通常说的网络分区,也蕴含因为网络丢包导致的网络不通的状况。并且,这里说的因为网络丢包导致网络不通的情景,还蕴含节点宕机的场景,因为零碎的其余机器不晓得某个节点宕机了,只晓得与宕机节点的网络是不通的,所以当节点宕机产生时,其余节点发往宕机节点的包也将失落。

在事实的分布式系统中,咱们面对的就是一个不牢靠的网络和有肯定概率宕机的设施,这两个因素都会导致分区呈现,因而在分布式系统实现中,分区容错性 P 是一个必须项,而不是可选项。

在分布式系统中,如果咱们的设计放弃分区容错性,就相当于咱们认为节点之间的网络通信永远是好的,那么咱们对节点之间的近程调用的后果,就不须要解决超时、网络地址不可达等网络层谬误了。然而这样一来,看似是简化了零碎设计,理论却漠视了超时等网络谬误的状况。当它们呈现后,零碎的行为就是未定义的了,可能会呈现解体,或者是脏数据的问题。

因而,对于分布式系统工程实际来说,CAP 实践更适合的形容是:在满足分区容错的前提下,没有算法能同时满足数据一致性和服务可用性。

CAP 实践争执

对于数据一致性和可用性之间的争执由来已久,过后次要体现为 ACID 与 BASE 之间的争执。

基于 BASE 实践撑持的 NoSQL 静止保持发明各种可用性优先、数据一致性其次的计划,而传统数据库则坚守 ACID 个性(原子性、一致性、隔离性、持久性),优先数据一致性,在必要的时候,能够放弃零碎可用性。过后 BASE 实践还没有被宽泛承受,人们还是不违心放弃 ACID 的长处。

当 CAP 实践提出后,咱们明确了在分布式系统中,只能在强一致性和 100% 的可用性之间二选一,不能两个都要。从此 BASE 实践也逐步被人们所承受,在大规模存储的场景中广泛应用,并且创始了从 2000 年到 2010 年,NoSQL 静止的黄金十年。这十年里,工业界产生了大量优良的 NoSQL 零碎,比方 BigTable、HBase、MongoDB、Cassandra,解决了人们过后遇到的大规模数据存储的问题。

CAP 实践的从新思考与了解

CAP 实践的呈现是有历史使命的,让人们可能在分布式系统中,放弃以关系数据库为代表的 ACID 强一致性零碎,承受以 NoSQL 为代表的 BASE 实践,并且临时解决了人们在 2000 年前后对于分布式系统中,数据一致性和可用性之间的争执,让人们可能更加求实地解决过后因为互联网爆发式倒退,产生的海量用户和数据的分布式计算与存储的问题。

一个有历史使命的事物,在使命实现后,要么就过期了,人们不再提起它,要么就会对它有新的解释,让它追随时代一起倒退上来。而 CAP 实践显然属于后者,因为直到现在,人们还在对它一直地从新思考与了解。

在 2000 年的时候,CAP 实践通过一个简略然而准确定义的模型,论证了在一个满足分区容错的分布式系统中,当咱们进行零碎设计时,只能在数据一致性和服务可用性之间二选一。其中,数据一致性(C)指的是数据的强一致性,服务的可用性(A)指的是服务 100 % 的可用性,这才是 CAP 实践论证模型的关键点

对可用性的从新思考与了解

首先,咱们对服务的可用性(A)进行剖析,你会发现在咱们的日常工作中,简直没有见过 100% 可用的服务。可用性指标是在 0 到 100% 之间间断散布的,其实一个 100% 可用性的服务和一个 99.9999% 可用性的服务之间并没有多大的差异,如果咱们的服务能实现 99.9999% 的可用性,哪怕它不合乎 CAP 实践的可用性,也是合乎咱们工作中对可用性的要求的。

所以,在咱们的零碎抉择了 CP 模型的时候,对于可用性(A),咱们永远无奈达到 100%,然而按业务要求一直优化,是咱们致力的指标。

对于具体的实际,我认为基于 Raft 算法实现的 etcd 就是一个十分好的,对可用性进行从新思考的实际。如果根据 CAP 实践来划分的话,etcd 属于 CP 模型。

而在 etcd 零碎的实现中,如果网络没有呈现分区,整个零碎是 100% 可用的;就算网络呈现分区了,也不会有整个 etcd 零碎都不可用的状况。在这时,超过半数 etcd 实例所在的网络分区一侧,零碎是失常可用的,尽管网络分区的另一侧是不可用的,然而整个 etcd 零碎的可用性仍然可能超过 50%。

对一致性的从新思考与了解

对于数据的一致性(C),除了 CAP 实践要求的强一致性外,还有枯燥一致性、会话一致性和最终一致性等。如果咱们的零碎设计抉择了 AP 模型,在数据一致性方面,尽管咱们无奈实现强一致性,然而咱们也不要全副放弃,能够致力去实现更高的一致性级别,为零碎的服务提供更好的形象

这里咱们通过一个例子来阐明,假如咱们设计一个 AP 模型的分布式系统,失常状况下,如果根据 CAP 实践,在零碎设计时,咱们须要放弃数据的一致性。然而,咱们能够从另一个思路来设计,在零碎没有呈现网络分区的时候,这个分布式系统应该设计为强一致性的。

如果呈现网络分区了,咱们能够依据零碎状况,有抉择并且精心设计地升高零碎的一致性级别。比方,从强一致性升高到枯燥一致性或会话一致性等,这样的设计,既合乎 CAP 理论依据,也为零碎提供了更好的一致性级别,特地是在网络分区的时候。

对分区容错性的从新思考与了解

最初,咱们来剖析一下分区容错性 P 的问题。在分布式系统中,节点之间必须通过网络来通信,可是网络可能会丢包和中断,节点也可能会宕机,这样的状况就要求咱们在零碎设计的时候,必须做好零碎的分区容错解决。

然而,零碎呈现分区的状况十分少见,所以咱们能够来试想一下,在网络不呈现分区的时候,咱们将数据强一致性和 100% 的可用性都抉择,等到网络呈现分区的时候,零碎再抉择放弃局部的可用性或者升高数据一致性的级别,这种解决形式是否可行呢?

其实这样的解决形式是能够的,在上面对可用性和一致性的从新思考与了解中,所举的例子都是按这个形式来解决的,它理论是将 CAP 实践的抉择,推延到呈现网络分区的时候,而不是零碎一启动就进行 CAP 的抉择。这样能够大大提高零碎的可用性和数据一致性,并且零碎仍然能容忍网络分区。

另外,对于 CAP 实践的从新思考,特地须要阐明的一个例子是 Google 的 Spanner,咱们都晓得 Spanner 是一个寰球分布式数据库,然而 Google 却声称 Spanner 是一个 CA 零碎,这是不是和 CAP 实践的说法产生了矛盾呢?

其实并不矛盾,Spanner 尽管是一个分布式系统,然而它运行在 Google 的外部网络中,并且领有大量冗余的网络链路、解决相干故障的架构布局、以及十分粗疏的运维,以此来确保零碎的可用性超过了 99.999%。尽管不能达到 100%,然而对于使用者来说,和可用性 100% 简直没有任何区别,所以 Spanner 就是一个 CA 零碎。

而且,在网络呈现分区的时候,Spanner 会抉择一致性而不是可用性,这个时候 CAP 实践仍然会失效。所以对于 CAP 实践的从新思考,总而言之就是一句话:CAP 实践给咱们定义了零碎的设计边界,尽管想要设计出超过边界的零碎是徒劳的,然而咱们却能够有限迫近边界,并且把它作为咱们设计零碎的指标。—

总结

明天,咱们一起探讨了什么是 CAP 实践,它是指分布式系统中,在满足分区容错的前提下,没有算法能同时满足数据一致性和服务可用性,只能在数据一致性和服务可用性之间二选一。

紧接着,咱们探讨了 CAP 实践产生的影响,能够说 CAP 实践的呈现,让人们承受了 BASE 实践,并且推动了 NoSQL 静止的倒退,开启了它的黄金十年。

最初,咱们探讨了当初人们对于 CAP 实践的新了解。对于 AP 模型的零碎,咱们会致力去晋升数据一致性的级别,而对于 CP 模型的零碎,咱们会致力去晋升零碎可用性的级别。在网络不呈现分区的时候,咱们能够将 A 和 C 都抉择上;在网络呈现分区的时候,通过推延 CAP 抉择来进步零碎的可用性和数据一致性。

综上所述,CAP 实践对于分布式系统的设计和实际具备重要意义,让人们在解决数据一致性和服务可用性之间的衡量时,有了更加明确的思路和领导准则。而对于将来的倒退,咱们置信人们会一直地摸索和挑战 CAP 实践的极限,以期发明出更加高效、稳固、牢靠的分布式系统。

最初举荐你去读一下 周志明 老师的 << 凤凰架构 >>,置信你能有更加粗浅的意识。

如果本文对你有帮忙的话,欢送点赞分享,这对我持续分享 & 创作优质文章十分重要。感激!

本文由 mdnice 多平台公布

退出移动版