简介
用了这么久分布式从来没有总结过分布式理论,抽空总结一下。本篇从实际项目应用出发,从两个方面阐述分布式理论,第一个方面分布式解决什么问题,第二方面分布式带来什么问题。
为什么要用分布式?
单体服务缺点:
1、没有业务边界一说,需求即业务边界,模块划分模糊,维护成本大。
2、没有资源隔离(CPU、内存、数据库等),一个功能出问题,整个服务下线。
3、服务扩展性低,只能集群部署,一个功能点有瓶颈,必须扩展整个服务;数据库扩展,整个服务改动非常大。
4、交付周期长,任何一个功能都会影响上线时间。
如果这些缺点都在你的接受范围内,那么优先考虑单体服务(整个系统功能非常单一,数据量很少不存在瓶颈)。
但是在正常的互联网项目中,不存在这么简单的项目,单库单表一定会有数据库瓶颈,并且一般只允许部分功能下线,不允许整个服务下线。这时单服务就不能满足我们的需要,比方说用户和订单我需要水平扩展,日志上线后几乎不用扩展等。分布式目标与要素:分布式系统的目标是提升系统的整体性能和吞吐量另外还要尽量保证分布式系统的容错性
分布式带来了什么问题?
在选择分布式架构时一定要先明白分布式的缺点:
1、分布式是夸网络的,一定会有性能损耗。
2、网络可靠性直接影响整个系统可靠性。
3、编码复杂度高
4、数据一致性问题
5、运维成本高
既然分布式带人了这么多问题,我们又不得不选,那么解决分布式问题就是不可逃避的事情,我们要怎么解决分布式问题呢?有没有什么理论依据呢?
CAP理论
1985年人们证明了异步通信中不存在任何一致性的分布式算法。所以之后人们一直在摸索试图找到最大限度满足异步一致性需求的算法或依据,在CAP之前研究者就已经发现低延迟和顺序一致性不可能同时被满足,虽然还是模糊但是已经比较贴近实际。2000年有人提出一致性、可用性和分区容错性三者无法在分布式系统中被同时满足,并且最多只能满足其中两个。这是第一次有人把一致性、可用性和分区容错性单独提炼出来作为系统设计重要特征。
C(一致性Consistence):指数据在多个副本之间能够保持一致的特性(严格的一致性)。
A(可用性Availability):指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据。
P(分区容错Network partitioning):分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。
CAP的出现仿佛是一盏明灯,它揭露了分布式系统的本质,并给出了设计的准则,而这正是1985年以来人们正在寻找的东西!所以CAP在当时的影响力是非常大的!
高可用、数据一致是很多系统设计的目标,CAP只能3选2组合如下:
CA 满足一致性和可用性,放弃分区容错。其实就是一个单服务。
CP 满足一致性和分区容错性,也就是说,要放弃可用。当系统被分区,为了保证一致性,必须放弃可用性,让服务停用。
AP 满足可用性和分区容错性,当出现分区,同时为了保证可用性,必须让节点继续对外服务,这样必然导致失去一致性。
CAP 理论不允许出现在分区存在的情况下拥有完美的数据一致性和可用性。一般来说跨区域的系统,设计师无法舍弃 P 性质,那么就只能在数据一致性和可用性上做一个艰难选择。不确切地说,NoSQL 运动的主题其实是创造各种可用性优先、数据一致性其次的方案;而传统数据库坚守 ACID 特性(原子性(A)、一致性(C)、隔离性(I)、持久性(D))
CAP 理论定义已经不适合现在的分布式系统,因为CAP不能覆盖所有场景,并且在不同的项目中CAP含义也有差别(在CA中的C代表的是本地一致性;CP中的代表的是全局一致性,AP中直接没有C;这些C的含义在不同的场景根本就不同)。并且大多数情况下这三个概念又不能完全独立,也不能完全舍弃一个。直到后来有人提出BASE理论。
BASE 理论
BASE理论则是对CAP理论的实际应用,也就是在分区和副本存在的前提下,通过一定的系统设计方案,放弃强一致性,实现基本可用,这是大部分分布式系统的选择。在这个前提下,如何把基本可用做到最好,则是我们追求的目标。
Basically Available(基本可用):假设系统,出现了不可预知的故障,但还是能用,相比较正常的系统而言,响应时间上的损失或功能上的损失
Soft State(软状态):允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。
Eventually Consistent(最终一致性):最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
BASE理论面向的是大型高可用、可扩展的分布式系统。与传统ACID特性相反,不同于ACID的强一致性模型,BASE提出通过牺牲强一致性来获得可用性,并允许数据段时间内的不一致,但是最终达到一致状态。同时,在实际分布式场景中,不同业务对数据的一致性要求不一样。
BASE 理论中5种最终一致性:
因果一致性(Causal consistency)
因果一致性指的是:如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。于此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制。
读己之所写(Read your writes)
读己之所写指的是:节点A更新一个数据后,它自身总是能访问到自身更新过的最新值,而不会看到旧值。其实也算一种因果一致性。
会话一致性(Session consistency)
会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现 “读己之所写” 的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。
单调读一致性(Monotonic read consistency)
单调读一致性指的是:如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧的值。
单调写一致性(Monotonic write consistency)
单调写一致性指的是:一个系统要能够保证来自同一个节点的写操作被顺序的执行。
在实际项目种,结合实际情况一般会搭配这5种最终一致性来构建系统。BASE理论对于CAP的一种适应妥协和弱化,为了保证可用性,对一致性作出的一些削弱,所以呢可以说BASE是一种反ACID的理论。