赞
踩
ZooKeeper 由雅虎研究院开发,后来捐赠给了 Apache。ZooKeeper 是一个开源的分布式应用程序协调服务器,其为分布式系统提供一致性服务。其一致性是通过基于 Paxos 算法的ZAB 协议完成的。其主要功能包括:配置维护、域名服务、分布式同步、集群管理等。
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现以下两种状态之一。· 全部成功执行。· 全部不执行。
例如:银行转账,从A账户转100元至B账户:
A、从A账户取100元
B、存入100元至B账户。 这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
例如:现有完整性约束A+B=100,如果一个事务改变了A,那么必须得改变B,使得事务结束后依然满足A+B=100,否则事务失败。
如:现有有个交易是从A账户转100元至B账户,在这个交易事务还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。
事务的持久性也被称为永久性,是指一个事务一旦提交,它对数据库中对应数据的状态变更就应该是永久性的。
CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
如上图,CAP的三种特性只能同时满足两个。而且在不同的两两组合,也有一些成熟的分布式产品。
接下来,我们来介绍一下CAP的三种特性,我们采用一个应用场景来分析CAP中的每个特点的含义。
该场景整体分为5个流程:
一致性实现目标:
必要实现流程:
写入主数据库后,在向从数据库同步期间要将从数据库锁定,待同步完成后再释放锁,以免在新数据写入成功后,向从数据库查询到旧的数据。
分布式一致性特点:
“Reads and writes always succeed”
服务一直可用,而且是正常响应时间。
对于可用性的衡量标准如下:
可用性实现目标:
必要实现流程:
分布式可用性特点:
所有请求都有响应,且不会出现响应超时或响应错误。
分区容错性实现目标:
必要实现流程:
分区容错性特点:
分区容忍性分是布式系统具备的基本能力。
在小结中,我们主要介绍CAP的理论为什么不能够3个特性同时满足。
如上图,是我们证明CAP的基本场景,分布式网络中有两个节点Host1和Host2,他们之间网络可以连通,Host1中运行Process1程序和对应的数据库Data,Host2中运行Process2程序和对应数据库Data。
如上图,是分布式系统正常运转的流程。
根据CAP的特性:
当前是一个正常运作的流程,目前CAP三个特性可以同时满足,也是一个理想状态,但是实际应用场景中,发生错误在所难免,那么如果发生错误CAP是否能同时满足,或者该如何取舍?
假设和之间的网络断开了,我们要支持这种网络异常,相当于要满足分区容错性§,能不能同时满足一致性©和可用响应性(A)呢?
假设在N1和N2之间网络断开的时候,
A、用户向发送数据更新请求,那中的数据将被更新为
B、弱此时和网络是断开的,所以分布式系统同步操作将失败,中的数据依旧是
C、有用户向发送数据读取请求,由于数据还没有进行同步,没办法立即给用户返回最新的数据V1,那么将面临两个选择。
第一,牺牲数据一致性©,响应旧的数据给用户;
第二,牺牲可用性(A),阻塞等待,直到网络连接恢复,数据同步完成之后,再给用户响应最新的数据。
这个过程,证明了要满足分区容错性§的分布式系统,只能在和两者中,选择其中一个。
通过CAP理论,我们知道无法同时满足一致性、可用性和分区容错性这三个特性,那要舍弃哪个呢?
一个分布式系统中,不可能存在不满足P,放弃,即不进行分区,不考虑由于网络不通或结点挂掉的问题,则可以实现一致性和可用性。那么系统将不是一个标准的分布式系统。我们最常用的关系型数据就满足了CA,如下:
放弃一致性,追求分区容忍性和可用性。这是很多分布式系统设计时的选择。实现AP,前提是只要用户可以接受所查询的到数据在一定时间内不是最新的即可。
通常实现AP都会保证最终一致性,后面讲的BASE理论就是根据AP来扩展的。
场景1
淘宝订单退款。今日退款成功,明日账户到账,只要用户可以接受在一定时间内到账即可。
场景2:
12306的买票。都是在可用性和一致性之间舍弃了一致性而选择可用性。
在12306买票的时候提示有票(但是可能实际已经没票了),用户正常去输入验证码,下单。但是过了一会系统提示下单失败,余票不足。这其实就是先在可用性方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,会影响一些用户体验,但是也不至于造成用户流程的严重阻塞。
但是,我们说很多网站牺牲了一致性,选择了可用性,这其实也不准确的。就比如上面的买票的例子,其实舍弃的只是强一致性。退而求其次保证了最终一致性。也就是说,虽然下单的瞬间,关于车票的库存可能存在数据不一致的情况,但是过了一段时间,还是要保证最终一致性的。
CAP 不可能同时满足,而是对于分布式系统而言是必须的。如果系统能够同时实现 CAP 是再好不过的了,所以出现了 BASE 理论。
通用定义
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。
BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方法来使系统达到最终一致性。
两个对冲理念:ACID和BASE
是传统数据库常用的设计理念,追求强一致性模型。
BASE支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
实际上就是两个妥协。
上面说软状态,然后不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性。从而达到数据的最终一致性。这个时间期限取决于网络延时,系统负载,数据复制方案设计等等因素。
稍微官方一点的说法就是:
系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问最终都能够获取到最新的值。
总的来说,BASE 理论面向的是大型高可用可扩展的分布式系统,和传统事务的 ACID 是相反的,它完全不同于 ACID 的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间是不一致的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。