分布式理论基础
这是Zookeeper学习总结 的系列文章。
分布式的诞生
在上世纪末,互联网发展十分迅猛,更快的计算能力和更大的存储空间是计算机学科领域思考的两大问题。在细分领域,人们不断提出提高单机的性能和存储,IBM等公司开发了不同种类的微型机、小型机和大型机,将单机的计算和IO处理能力一再推向高潮。然而,很快人们就发现,这是一条前景黯淡的道路,单机再强大,也有天花板。主要体现在:
- 有性能上限,无法水平扩展;
- 单点的高可用性无法保证
- 造价高昂;
随着网络带宽的提高,一些分布式的架构出现(即将一些廉价的主机通过网络连接起来,企图达到计算能力和存储容量累加的目的)并迅速发展。
分布式的特点及挑战
不同于大型机那种集中式的架构,分布式有很多鲜明的特点。(这里建议阅读Google分布式理论的几篇论文了解。)
分布式节点之间仅仅依赖网络通信,分布随机;没有全局时钟。
在《分布式系统概念与设计》一书中有如下定义:
- 分布性。分布式节点空间随意分布,且动态变化;
- 对等性。 节点之间地位平等,没有主从之分;
- 并发性。同一个分布式系统各个节点,可能会并发操作一些共享的资源,如数据库和分布式存储;
- 没有全局时钟。 分布式系统由多个随意分布的进程组成,通过交换消息相互通信。很难判断事件发生的先后顺序;
- 故障的必然性。
这也使得,在高并发环境下,共享数据的修改存在比单机更大的安全性问题;此外,网络的不可靠性,也会导致出现网络分区,多分区下的数据很难保证一致性。
解决方案理论基础
CAP理论
上面也提到了,数据的一致性在分布式系统中,是一种巨大的挑战。回顾单机,我们可以通过事务去控制多个操作是否得到一致的执行。这一套在多节点下,显然不再适用。Eric Brewer在ACM会议上提出著名的CAP理论。
CAP理论分别提到了一致性、可用性和分区容错性。
一致性
在分布式环境,一致性是指数据在多个副本之间保持一致的特性。在数据一致的某个时间点,执行更新操作后,也要求系统各部分数据是一致的。
可用性
可用性是指,系统对于外部的请求,必须在一定可容忍有限时间内给出应答。
分区容错性
首先要了解网络分区,即在分布式系统内,不同节点归属在不同网络子网,子网络之间可能出现网络不连通情况,但在子网内部的通信是正常的。
分区容错性,约束了分布式系统在遭遇任何网络分区后,仍要对外提供一致性和可用性的服务,除非所有环境都出现故障。
CAP理论告诉我们,一个分布式系统不能够同时满足一致性、可用性和分区容错性,且至多满足其中两个特性。
牺牲P:
牺牲A:
牺牲C:
BASE理论
从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写。权衡了CAP理论中的A和C。
基本可用
当出现故障时,允许出现部分不可用,这不等同于系统整体不可用。基本可用,可以体现在响应时间上的损失和功能上的损失。在大促期间,流量激增,活动页的响应时间会数倍增长;很多耗时服务,可能由于压力被降级到一些轻量的降级预案。这些措施只会影响轻微的体验和系统目标,而不会带来整体不可用的灾难后果。
软状态
软状态是指,系统中的节点数据都存在中间状态,该中间状态的存在不会影响到整体的可用性,这通常体现在数据在一致性同步复制过程中,允许存在延时。
最终一致性
数据在同步复制中虽然存在延时,但终究会达到最终的一致。最终一致性是一种弱一致性,数据一定能够达到最终一致的状态,所有客户端最终也可以得到最新的值。
总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统的事物ACID特性是相反的,它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性和BASE理论往往又会结合在一起。