一个分布式系统最多只能同时知足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这其中这两项mysql
指全部节点在同一时间看到的数据彻底一致,这里说的就是数据一致性。
其中一致性又能够分为sql
可用性是指分布式服务一直处于可用状态,即用户发起的请求老是可以在有限时间内处理而且返回。数据库
在衡量分布式系统的可用性的时候,通常是经过停机时间来计算的。服务器
可用性类型 | 可用水平(%) | 年可容忍停机时间 |
---|---|---|
容错可用性 | 99.9999 | < 1 min |
极高可用性 | 99.999 | < 5 min |
具备故障自动恢复能力的可用性 | 99.99 | < 53 min |
高可用性 | 99.9 | < 8.8 h |
商品可用性 | 99 | < 43.8h |
分布式系统在遇到某结点或者网络分区故障的时候,仍然可以正常对外提供服务网络
假设架构
因为在单机的状况数据库是能够保证其自身事务的 ACID 特性的,在分布式环境中主要影响他们的则是网络通讯问题这个不肯定因数,可是对于分布式服务来讲,在部分服务器网络通讯出现异常的时候也必须可以正常响应也就是分布式系统必需要知足分区容错性,不知足分区容错性的分布式服务没有意义。并发
因此咱们这里只讨论,在知足分区容错性的前提下是否可以同时知足一致性和可用性这 2 种状况异步
在此就能看出咱们在知足分区容错性的前提下,只能在一致性和可用性中二选一。分布式
这里的二选一中的一致性是指的是强一致性,咱们能够退而求其次的选择最终一致性方案。由于最终一致性方案可能会致使中间有一段时间内数据是不一致的,因此具体选用仍是要分状况。好比涉及到金钱相关的操做,能够只选择分区容错性和一致性,即出现分区故障的时候优先保证数据的一致性,让服务暂时不可用这样的场景在银行等机构都有使用,咱们能够权衡使用。高并发
保证一致性和可用性舍弃分区容错性。这样的场景几乎不存在,舍弃分区容错性意味着舍弃分布式系统,咱们只能想办法去增强基础设施建设区下降网络分区的发生。
保证一致性和分区容错性而舍弃可用性。这意味着若是发生网络分区,那么系统会处于不可用状态直到网络分区的恢复。
知足这种性质的其实仍是挺多的好比 Zookeeper 它会优先保证 CP,好比金融机构某些核心的金融业务优先保证 CP 系统暂时的不可用也比资金流失好多了。
保证可用性和分区容错性舍弃一致性。这里舍弃的是强一致性,某些应用能够退而求其次的选择最终一致性。
强一致性通常是采用 XA 协议来实现的它采用 2 PC 协议 其中可能涉及到长时间的阻塞而致使系统并发性下降吞吐量急剧降低,没法知足高并发下的场景
因此说不少大型应用都是选择的 AP without C 而后保证最终一致性,好比在淘宝商城购买商品发现还有库存,可是下单支付的时候却提示库存不足,好比在 12306 抢票的时候看到还有票结果支付的时候却提示余票不足(相信你们都有过相似体验)这样的状况其实无伤大雅。
在 CAP 理论中咱们讲了,系统没法同时知足 CAP,可是能够退而求其次的选择 AP 而后保证最终一致性
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即便没法作到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用能够采用适合的方式达到最终一致性(Eventual Consitency)
基本可用是指容许损失部分可用性,保证核心可用便可。
好比在秒杀场景中,为了应对用户可能出现的激增状况,要保证服务器不会所以出现错误,那么达到服务器承载的上限后,服务器就只能为后续的请求提供降级服务了,将后面一部分用户的请求进行排队或者是引导到降级页面去,这就是损失部分可用性,保证核心可用的一种体现。
软状态是指容许系统存在中间状态,而该中间状态不会影响系统的总体可用性。分布式存储中通常至少会有三个副本,容许不一样节点间副本同步的延时就是软状态的体现,mysql replication 的异步复制也是一种体现。
最终一致性是指系统中的全部数据副本通过必定时间后,最终都能达到一致性的状态,是弱一致性的一种体现
参考: