每次要开发分布式系统的时候,如何设计一个合适的分区容错一致性模型,是一个非常棘手的问题,我们自研InfluxDB系统的项目,如何设计一个容错一致性模型,因为其中有META和DATA两个节点,功能和数据特点不一样,我们需要根据这两个单元的特点,去设计分区一致性的模型
那么,我想到了CAP理论,并且CAP理论下,完成了这个问题,那么CAP是如何解决的呢?
CAP与其说是算法,更加像是一种思考的框架,对分布式的特性做了高度的抽象,抽象为了一致性,可用性,分区容错性,并且总结出货了CAP不可能三角,一旦掌握了其,就好比一个引路人,自然而然就能做出权衡,设计出合适的分区容错一致性模型
我们分别说下CAP的三个衡量指标
1.一致性 Consistency
2.可用性 Availability
3.分区容错性 Partition Tolerance
一致性C
就是无论访问的是哪个节点,都会读到一份最新写入的数据,不然就会失败,就好比一种对访问自己的客户端的一种承诺
具体的细节如下图所示
一旦写入了SET x=2
那么节点1收到了请求后,会同时将节点2的数据也更新为x=2
那么这样完成之后,不管客户端访问哪个节点,都是读取的同一份数据,这就是一致性
一致性这个指标,是分布式系统非常重要的特性,强调的是数据正确,对客户端来说,每次都能读取到最新写入的数据
但是这种一致性会带来一个新的问题,就是在节点之间出现通信的问题,无法写入最新的数据,导致一直无法给客户单返回数据
业务集群的一些关键系统,比如名字路由,如果仅仅因为分区故障,无法响应最新数据,导致系统整体瘫痪了,是不可接受的
于是就是CAP中的另一个指标,可用性
可用性指的是任何来自客户端的请求,不管哪个节点的访问,都能得到数据,但不保证是最新的数据,强调的是服务可用性,不是数据正确
比如下面的例子
这就说明,用户无论往哪个节点发起读的请求,不管是否一致,都能立刻得到值
这个指标主要针对的是集群的分区故障的容错能力
那么分布式和一般的单机系统不同,其涉及到了多节点间的通信和交互,节点间的分区故障是会必然发生的
而CAP不可能三角,就是一个很好的总结
CAP三角说的是对一个分布式的系统来说,一致性和可用性和分区容错性,3者往往不可兼得,只能3者选择其2
如何使用CAP理论
网络交互会有一定的延迟和数据丢失,这种状况我们可以接受,还必须保证系统不可崩溃,故P是一个前提,是必须要保证的
对于一致性C和可用性A来说,要二者选其一,那么CP和AP的含义是什么呢
如果保证CP的话,那么就会一定读到最新数据,不会读到旧的数据,这时候有问题就强制抛离错误的节点
如果保证CA的话,那么就会一直处理客户端的请求,那么一些节点不会返回最新的信息,
那么还有一点,就是很多人认为C和A之间只能保证一个,其实在网络正常的情况下,分布式能够正常运行的时候,在不需要P的时候,C和A能够同时保证,只有在出现分区故障的时候,才会需要在C和A之间做出选择
对于开头提到的InfluxDB的集群场景,因为缺乏集群能力和可用性,而且InfluxDB是由META节点和DATA节点一同构成的,两个节点的功能和数据特点不一样,于是设计出的分区容错一致性模型不一样
对于这个系统来说,P是必须要保证的
而META节点保存的是系统运行的关键性信息,数据库名,表明,保留策略,那么就必须要实现一致性
这样就能避免读取不到最新的元信息,比如有了一个新的数据库telegraf,如果不能读到最新的元信息,那么就会因为找不到数据库而写入失败,故采用CP架构
对于DATA节点,记录一条CPU的负载数据
cpu_usage,host=server01,location=cn-sz user=23.0,system=57.0
虽然这些数据不是系统运行相关的元信息,服务访问会很频繁,水平扩展,性能,可用性是关键,所以采用了AP架构
这样,用CAP理论来设计InfluxDB,设计出了符合META和DATA节点的分区容错一致性模型,采用类似的思考方法,设计出符合的业务场景的分区容错性
如果无脑的采用CAP理论的影响,或者对CAP理论理解不够深入,DATA节点不会采用AP架构,而是现在的共识算法,比如使用Raft算法
受限于Raft的强领导模型,所有写请求都在领导者节点上处理,整个集群的写性能会受困于单机性能,导致集群接入性能低下,无法支撑海量或者大数据量的时序数据
受限于强领导者模型,导致无法提升主要的写性能问题
CA模型,在分布式系统中不存在,不保证P是不可能的,只要是具有集群,就需要考虑P
CP模型,采用CP模型的分布式系统,舍弃了可用性,一定会读到最新的数据,但是一旦有数据的不可用,就会影响到用户的体验和业务的可用性
AP模型,采用AP模型的分布式系统,舍弃了一致性,实现了服务的高可用,用户在访问系统的时候,能立刻得到数据,但是可能读到老数据,典型应用就比如Cassandra和DynamoDB
CAP就好比一个PH是指,可以用来度量分布式系统的酸碱度,在数据一致性 ACID和服务可用性之间妥协,我们要根据这两者进行设计合适的分布式西永
而且在分布式系统的开发中,延迟是一个非常重要的指标
我们可以通过一个服务的延迟,判断其的可用性,如果是领导者的节点,那么可以根据这个决定是否发起领导者,所以,注意延迟
课后思考
CP的KV存储和AP的KV存储,分别适合怎么样的业务场景?
两者的偏向在上面的CAP三角中说明的很清晰了,就是在CP更加偏向于对于一致性的保证,而AP偏向于对可用性的保证,就好比淘宝发布一个商品,在这个商品发布过程中,我们肯定要保证用户能获取到商铺中的其他商品,保证可用性,但是再下单购买的时候,库存是否充足,就是要保证一致性,避免超卖问题