分布式系统理解之CAP理论的发展

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37142346/article/details/84327134

最近一段时间在研究Zookeeper,深入了解了下分布式系统的发展以及CAP理论的发展,因此写下这篇文章总结一下,由于博主水平有限,如有不足之处可以留言讨论,本文查阅了很多资料,如有侵权请联系博主删除。

传统IT系统的要求

  • 性能
    在性能上要求快速响应,支持更多的用户和业务。
  • 可用性
    希望24小时在线服务,并且快速给予用户请求响应,提升用户的使用体验。
  • 安全性
    数据没有丢失,并且保证数据的一致性。

对于以上IT系统的传统要求,随着业务的发展,数据的快速增长,已经不能满足以上要求,首先开发者会想到使用更大更昂贵的服务器来支撑业务需求,可是即使是多么大,多昂贵的服务器的存储能力,处理事务的能力总会有上限,而且很多小公司并没有能力去使用昂贵的服务器。因此分布式系统得到快速发展。

分布式系统满足需求

  • 性能
    除了优化代码,减小对资源的消耗
    可以增加服务器的数量。
    对业务进行拆分(比如MonoDB的sharding操作)
  • 可用性
    优化代码,防止系统宕机。
    做系统集群,多个服务器节点处理同一个业务请求,即使一个宕机,不影响请求的响应。
  • 安全性
    数据的冗余存储,多副本机制(如HDFS的多副本存储)。

对于分布式系统,有以下优点:

  • 资源可以充分利用。
  • 理论容量无上限。
  • 不用担心因为宕机数据丢失或者不可用。

不过对于分布式系统的发展也遇到了一系列问题:

  • 增加系统的复杂性。
  • 增加保证数据一致性的难度。
  • 增加了开发维护的难度。
  • 增加了数据的安全性保证的难度。

那么在集群环境中如何保证数据的一致性呢?

  1. 数据的复制
  • 单节点写入然后复制到其他节点中,比如Zookeeper集群。
  • 多节点同时写入,比如Tomcat集群。
  1. 集中存储
  • 借助可靠性较高的存储,比如Redis分布式存储等。

要想构建分布式系统环境,传统的对于事务的ACID要求已经无法实现分布式系统的需求,多个节点节点之间并不能保证数据一致性,在传统的事务中,我们要求事务具有原子性,即单个节点的一个事务操作要么全部成功,要么全部失败。但是对于分布式系统,一个节点写入之后,又如何保证其他节点写入成功,怎么控制多个节点的回滚和提交操作是一个很大的问题。

因此,基于上面的问题,分布式系统中提出了CAP理论。

分布式系统理论之CAP理论

在这里插入图片描述
所谓CAP理论:

  • Consistency 一致性
    一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。等同于所有节点拥有数据的最新版本。
  • Availability 可用性
    可用性是指“Reads and writes always succeed”,分布式系统要求集群中可用的节点必须对于用户的请求给予响应。在这里需要注意的是:它要求每一个请求最终必须停止,既无论成功或者失败必须给予响应。
  • Partition Tolerance 分区容忍性
    分区容忍性(或容错性)即“the system continues to operate despite arbitrary message loss or failure of part of the system”,对于一个分布式系统,分区是不可避免的,它要求对于分布式系统中的各个分区即使在出现网络差错异常的情况下也可以对外表现出一致性和可用性状态。

一个分布式系统要求不可能同时满足一致性(Consistency),可用性(Availability),分区容错性(Partition Tolerance)这要的需求,只能满足其中的两个。

当然对于上面的不能同时满足C、A、P不是那么的绝对,在后面我们会看到它最终会做出妥协。

对于一致性、可用性、分区容错性我们该如何做出选择呢?

丢弃P:对于一个分布式系统,如果不能满足分区容错性,那么意味着集群的各个节点之间都保证相互之间的协调工作,如果网络异常,那么和单个节点没有两样,也不能称之为分布式系统。因此分区容错性是必须要保证的。

丢弃A:如果牺牲可用性,换来数据一致性。对于这种情况也有相应的应用场景,比如淘宝在双十一的高峰,为了保证数据的一致性,在我们支付的时候,有时候会等待很久都不能支付成功。这是因为并发量太大,必须要保证交易数据的一致性,即使要牺牲一点可用性。在舍弃可用性来换取数据一致性的情况下,也有很多应用案例,比如Redis,HBase数据库,有时候一个请求需要等待很久,甚至异常出错,但是必须保证数据的一致性,还有Zookeeper也是选择了CP,放弃了A。

丢弃C:如果牺牲一致性,换来可用性。对于这种情况,比较典型的就是火车订票系统,我们常常会在抢票的时候发现系统显示还有剩余的票,但是当在下单付款的时候却已没有剩余的票。这样虽然会降低用户的使用体验,但是也不至于大量用户请求阻塞服务器。

无论是牺牲可用性还是一致性,都要符合我们的场景需求,当然并不是强制要求分布式系统对于这三个需求真的不能同时满足,在很多场景下我们对于数据一致性的要求没有俺么严格,上面指的是不能满足强一致性。但是我们可以保证最终一致性来满足系统的需求。

数据一致性

在很多时候,一些系统需要牺牲强一致性来满足最终一致性,只要在用户可以接受的范围之内就行。对于数据一致性,从服务器和客户端的角度分为内部一致性和外部一致性,当然,一般情况下我们所讨论的都是外部一致性,即对于并发更新的数据如何正确的获取。

强一致性:
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。
弱一致性:
这种一致性要求没有强一致性那么严格,即系统在写入数据成功后不会保证用户立即读取到最新的结果,也不会承诺多久可以读取到。
最终一致性:
若系统后续没有更新操作,系统最终会返回最近更新的结果。如上述的火车订票场景。

因此,我们在可用性和一致性之间做出了妥协,牺牲了强一致性,保证了最终一致性和可用性,来达到最大化的利益。

分布式系统之BASE理论

BASE是Basically Available(基本可用),Soft state(软状态)和Eventually Consistent(最终一致性)三个短语的简写,它是对CAP理论中可用性和一致性权衡选择的结果。

  • 基本可用:
    响应时间上的损失:比如有些要求在1S内返回,有些要求5秒内返回。
    功能的损失:对于电商来说,某些区域可能不能购买某些商品,又或者在大促的时候,部分消费者被引流到一个降级的页面。
  • 软状态:
    允许系统中的数据存在一个中间状态,并不会认为该状态会影响到整体系统的可用性,即允许系统在不同节点的数据副本之间存在一定的时延。
  • 最终一致性:
    数据的副本经过一段时间的同步后,达到了一个一致的状态。

之前提到,传统的ACID已经不能满足对于分布式系统的数据一致性要求,因为它们没办法知道其他节点事务的执行状况。因此,常规的解决办法就是引入一个“协调者”的组件来统一调度所有分布式节点的执行。著名的是二阶段提交协议(Two Phase Commitment Protocol)和三阶段提交协议(Three Phase Commitment Protocol)。

二段式提交协议
主要分为Commit-request阶段和Commit阶段。

三段式提交协议:
主要分为分别为CanCommit、PreCommit、DoCommit。

虽然三段式提交协议改善了二段式提交协议的问题,但是始终无法很好的满足分布式系统一致性的问题,因此,著名的Paxos算法提出了。

Paxos算法:
Paxos协议由Leslie Lamport最早在1990年提出,目前已经成为应用最广的分布式一致性算法。Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。

本篇文章基于CAP理论来概述分布式系统的发展,对于二段式提交协议、三段式提交协议以及Paxos算法简单列举了一下,由于篇幅的限制以及笔者水平的有限,Paxos算法比较复杂。有兴趣的读者可以参考下面这篇阿里工程师的文章:

从CAP理论到Paxos算法
以及Paxos算法论文:
https://lamport.azurewebsites.net/pubs/paxos-simple.pdf
https://www.microsoft.com/en-us/research/publication/fast-paxos/

欢迎加入大数据开发交流群,一起探讨技术:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37142346/article/details/84327134