分布式理论 PACELC 详细介绍
PACELC 基于 CAP 理论演进而来
CAP 理论是一个分布式系统中老生常谈的理论了:
- C(Consistency):一致性,所有节点在同一时间的数据完全一致。
- A(Availability):可用性,服务一直可用。
- P(Partition tolerance):分区容错性,遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务
三者根本无法同时满足,只要出现了网络分区,一致性就无法满足,因为节点之间无法互通。如果强行满足一致性,就必须停止服务运行,从而放弃可用性。所以,最多满足两个条件,并有下面几种情况:
(1)CA
满足一致性和可用,放弃分区容错。此时已经变成了单机系统,谈不上是分布式系统了。对于分布式系统而言,分区容错性是一个最基本的要求,因为分布式系统中的组件必然需要部署到不通的节点,必然会出现子网络,在分布式系统中,网络问题是必定会出现的异常。因此分布式系统只能在C(一致性)和A(可用性)之间进行权衡。放弃分区容错性,比较简单的方式就是把所有的数据都放在一个分布式节点上。那不就又成为了单机应用了吗?
(2)CP
满足一致性和分区容错,也就是说,要放弃可用。当系统被分区,为了保证一致性,必须放弃可用性,让服务停用。
放弃可用性,一旦出现网络故障,受到影响的服务需要再等待一定时间,因为系统处于不可用的状态。
(3)AP
满足可用性和分区容错,当出现分区,同时为了保证可用性,必须让节点继续对外服务,这样必然导致失去一致性。
放弃一致性,这里所指的一致性是强一致性,但是确保最终一致性。是很多分布式系统的选择。
PACELC 理论
如上所示,CAP理论告诉我们:在系统设计中,这三点只能取其二,一般的分布式系统要求必须有分区容错性。剩下的只能从 C 或者 A 中取舍。但是这个理论并不能很好地应用于实际,首先, A 中是有一定争议的,很长时间才返回,虽然可用,但是业务上可能不能接受。并且,系统大部分时间下,分区都是平稳运行的,并不会出错,在这种情况下,系统设计要均衡的其实是延迟与数据一致性的问题,为了保证数据一致性,写入与读取的延迟就会增高。这就引出了 PACELC 理论。
在出现分区错误的情况下,取前半部分 PAC,理论和 CAP 内容一致。没有出现分区错误的情况下(PACELC 中的 E 代表 Else),取 LC,也就是 Latency(延迟)与 Consistency(一致性)。
现在,其实很多存储,都已经实现了不同的 PACELC 的兼顾策略,并且交由用户配置去灵活根据不同业务场景使用不同的策略。例如:ElasticSearch使用了在写操作上存在Latency和Consistency之间的取舍。
例如在ElasticSearch中写数据过程中,需要将数据同步给其他副本。假设有两个副本,R1,R2。同步R1完成需要10ms时间,同步R2完成需要20ms时间,假设如果要完成一致性,我们需要等待20ms(ES数据同步是批量发生的)。但是,ElasticSearch采取的策略不是等待所有副本完成数据同步后才返回写操作成功,其采取的策略是,如果主副本写入成功,部分副本同步失败也认为整体成功(同步失败原因可能因为超时未响应,也可能是副本存在故障)。可以明显看出,ElasticSearch作为一款高性能的搜索引擎,在时延(Latency)和一致性(Consistency)上做了取舍。