分布式系统理论--BASE/CAP

1 背景

  分布式系统是指由多个计算机节点组成,彼此之间通过网络来实现通信和协调,共同完成同一任务。
  分布式系统需要解决的一个核心问题是读取数据时如何保证一致性的问题,此类问题即分布式一致性问题。而分布式一致性存在多种情况,这些情况统一由一致性模型来表示。常见的一致性模型有线性一致性、顺序一致性、因果一致性等。
  CAP理论提出,在分布式系统环境下,为了应对不可避免的网络分区事件,常牺牲数据的一致性来换取服务可用性;或为了保证数据一致性而牺牲可用性。
  BASE理论是牺牲强一致性采用弱一致性中最终一致性模型,目的是换取服务的持续可用。
  随着分布式系统与事务型数据库的发展,越来越多的分布式数据库应运而生,如基于Share nothing 的MPP架构数据库Greenplum、腾讯自研的HTAP企业级数据库TBASE、华为的GaussDB系列,阿里的云原生数据库PolarDB系列等。分布式系统与事务型数据库的结合,使得分布式数据库中的强一致性和事务一致性再次被重视。

2 ACID、CAP与BASE简析

2.1 ACID

1)原子性
事务内的各个操作要不全执行成功,要不全执行失败,
2)一致性
事务执行前后,数据从一种致性状态转变成另一种一致性状态;
3)隔离性
对于并发的事务,一个事务的执行不会被其他事务所干扰;即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
4)持久性
一旦事务提交,它对数据库的影响是永久性,即使后续发生断电、重启等系统故障,数据也一直存在。

2.2 CAP理论

CAP定理(CAP theorem)
  在分布式领域有一个著名的理论:CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
1 一致性(Consistency)
  所有节点在同一时间看到的数据是相同,且是最新的;
2 可用性(Availability)
  保证每个请求不管成功或者失败都有响应
3 分隔容忍(Partition tolerance)
  系统中任意信息的丢失或失败不会影响系统的继续运作
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。

CP without A:如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。

AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。
在这里插入图片描述

BASE定理(BASE theorem)

  BASE是对CAP中一致性和可用性权衡的结果,其思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使得系统达到最终一致性。
1 Basically Available
  基本可用,是指一个分布式系统在分区发生时,依然能够对外提供部分服务;
Soft state:软状态
  允许系统中的数据存在中间状态,而此状态不会影响系统的整体可用性,例如允许分布式系统在不同节点的数据副本之间进行数据同步的过程存在时延(即允许某些时刻数据存在不一致但要满足最终一致性)
Enentual consistency:最终一致性
  描述系统中所有的数据副本在一段时间后,最终能够达到一个一致性状态,不需要实时保证系统数据的一致性。
BASE被用于构建于大型高可用、可扩展的分布式系统,如NoSQL系统。

3 分布一致性

  分布式系统是由多个物理节点和节点间的网络所组成,每一个部分在无故障的情况下可正常工作,系统的可用性和一致性都能被保证。
  但是实际情况会发生一些故障,如节点故障、网络分区等,使得集群中部分节点不能相通。但整个网络分成几块区域时,数据就有可能散布在那些不连通的节点中。若一个数据项只存在一个节点中,且恰巧位于不连通的节点,那么就会引发访问不到该节点的数据,这种分区属于不可容忍的分区。
  提高分区容忍性的典型方法是为一个数据提供多个副本,在发生分区后(单副本故障或单副本的网络故障),系统还存在其他可读的数据副本。但是,多副本之间要同步数据,就会引发分布式系统中数据一致性问题(对于外部一致性而言,需要考虑副本间数据同步问题)
  为了保证数据的一致性,每个写操作都必须写入全部节点,整个操作才算成功,只有通过这种强同步的方式才能保证写操作写入的数据具有一致性,以及后续读操作才能够最新的数据。
  同步数据会让等待现象发生,而等待又会带来可用性问题(时延)。为了进一步提高性能同步过程会采用一定的方式优化:多副本间共识算法Paxos协议或异步主备复制技术等。
  总之,因为分区,不得不容忍多副本情况发生。数据副本节点越多,分区容忍度越高,但是需要同步的数据就越多,保证数据一致性的难度会增大。为了保证数据一致性,有相同副本的节点间同步数据需要的时间就越长,可用性就越地。

参考:《分布式数据库原理、架构与实践》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值