BASE 理论小结

350 阅读6分钟

前言

写完了 CAP 理论,接着重新了解一下 BASE 理论。

问题

CAP 理论的一致性和可用性在存在网络分区的条件下,是冲突的。意味着,假如我们使用的分布式系统,就一定要在一致性和可用性中进行取舍。

可用性是分布式系统非常关键的指标。

假如有3个节点集群,每个节点集群的可用性为99.9%,则集群可用性是99.9%的3次方,即99.7%。每个月要宕机129.6分钟,这是非常严重的问题。 —— 《分布式协议与算法实践》 韩健 极客时间

AP 会成为大多数分布式项目的首要目标,而一致性 C ,会被充分地进行折中考虑。于是就有了 AP 的延伸,BASE 理论。

  • PS: BASE 达到 AP,尽量满足 C。

BASE

  • 基本可用 Basically Available
  • 最终一致性 Eventually Consistent
  • 软状态 Soft state

基本可用 Basically Available

自定义概念:这是一种分布式系统的特性,具备这种特性的系统,会有一种弹性的功能,这有别于我们对编程硬性且绝对正确的编程观。这样的系统在发生不可预知故障时,会允许损失部分功能的可用性,进而保证核心功能的可用性

已12306购票系统为例。12306购票系统每年都会有一次春运,需要极其庞大的计算资源,在正常情况下部署,是非常浪费的。假如其坚持绝对正确,则会导致大量宕机,最终系统不可用。

12306系统的基本可用如何实现?

  • 访问错开,流量错峰。也就是:8点购买A城市的票,9点购买B城市的票。从理论上看,就是每个城市购票都不是随时可用的,牺牲一部分的可用性,但不影响业务。
  • 延迟响应。这是提交了购票请求后,请求会在队列中排队,系统会在后面进行处理。从理论上看:系统不进行请求的处理,从用户角度上看就可以理解为那个时刻宕机不可用,事实上系统只是延迟处理。
  • 体验降级。譬如我们直接关闭一些服务,或者让图片由高清转为小图,以提供系统处理能力
  • 过载保护。任何系统在有限的硬件资源条件下都会出现负载过高的情况,系统必须有合适的处理策略进行过载监控及保护,例如最直接的超时拒绝服务,“系统开小差”等

以上流量削峰、延迟响应、体验降级、过载保护是系统对可用性的这种处理的常用手段,区别于硬性且无差别的可用性,在这些手段的帮助下,分布式系统会具备一定的弹性,保证核心可用性,即基本可用。

最终一致性 Eventually Consistent

自定义概念:系统中所有的数据副本经过一段时间的同步后,最终能够达到一致的状态。也就是分布式系统,本身就允许中间状态的存在,但保证状态最终一致。

  • 几乎所有的互联网系统都采用允许中间状态存在的最终一致性方案,只有实在不能使用时,才会考虑强一致性(不允许中间状态存在)或事务。例如:金融系统或支付系统。方案的使用是取决于业务的,譬如:购物车等,允许存在数百毫秒的数据延迟是可以的,只要在交互上屏蔽一下差异,用户基本不会发现,但要强硬地做到强一致,则会让系统非常吃力。

PS:强一致性,和分布式使用同步方式交互有关系么?是不是使用同步方式进行交互就能够保证一致性?事务允许多个服务同时提交,但会通过事务协调者一致通过。

最终一致性的实现方式

  • 以最新写入的数据为准
  • 以第一次写入的数据为准

PS: 这里有疑惑,在分布式系统上,怎么样才能区别一个数据是不是为准?第一次和最新一次?

实现最终一致性的具体方式有:

  • 读时修复
  • 写时修复
  • 异步修复

在这里,我想强调的是因为写时修复不需要做数据一致性对比,性能消耗比较低,对系统运行影响也不大,所以我推荐你在实现最终一致性时优先实现这种方式。而读时修复和异步修复因为需要做数据的一致性对比,性能消耗比较多,在开发实际系统时,你要尽量优化一致性对比的算法,降低性能消耗,避免对系统运行造成影响.

另外,我还想补充一点,在实现最终一致性的时候,我推荐同时实现自定义写一致性级别(All、Quorum、One、Any), 让用户可以自主选择相应的一致性级别,比如可以通过设置一致性级别为 All,来实现强一致性。

—— 《分布式协议与算法实践》 韩健 极客时间

PS: 最终一致性的实现,其实我还不是很了解。我想到了一个ABA问题,如 DB1 DB2 构成系统,并发生通信异常,DB1 的数据A 从 1->2->1,其实它的更新是最新的,而 DB2 的数据A 从 1 -> 3,这个数据快于 DB1 1->2 , 但慢于其 2 -> 1,这个时候,集群对数据A应该是什么值?其最终一致性又应该以什么为准?

感悟和小结

基本可用和数据的最终一致性是BASE最求的两个特点,也是符合大多数互联网公司的模型。它的出现是因为 CAP 理论给分布式系统划定了上限,再加上互联网业务的需求而催生出的一种经验,并由这种经验衍生出一系列可执行的方案,包括:

  • 限流
  • 流量削峰
  • 延迟响应(异步处理)
  • 服务降级
  • 过载保护
  • 故障隔离
  • 弹性扩容

等等,这些都是基本可用性的方案;最终一致性的实现我自己了解的不是什么透彻,因为还有一些未解决的问题,譬如存在网络分区的情况下,分区粉笔对统一数据进行修改,那应该以哪个为准呢?这里先抛出问题,我认为需要使用一致性协议进行同步才行。