本系列为本人读《从Paxos到ZooKeeper》一书的一些读书笔记,仅供学习使用,谢谢。
一、从集中式到分布式
1.1 分布式的定义:
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。
一个标准的分布式系统在没有任何业务逻辑约束的情况下,都会有以下特征:
- 分布性
- 对等性
- 并发性
- 缺乏全局时钟
- 故障总是会发生
1.2 分布式环境的各种问题
通信异常
由于网络本身的不可靠性,导致各网络节点之间进行网络通信时,会伴随着不可预知的风险,网络光纤、路由器或是DNS等硬件设备或是系统不可用都会导致最终分布式系统无法顺利完成一次网络通信。另外,集群的延时通常会远大于单机操作。
网络分区
网络的异常会导致分布式系统中,只有部分节点能够正常通信,从而形成了网络分区。
三态
相比于单机的失败或者成功,集群会出现“三态”的概念,即成功、失败与超时。有两种丢消息的情况:
- 由于网络原因,消息没有成功发送到接收方,而是在发送过程就发生了丢失现象。
- 接收方处理后,响应给发送方的过程中,发生消息丢失现象。
节点故障
分布式服务器节点宕机或“僵死”现象。
二、从ACID到CAP/BASE
2.1 ACID
事务(Transaction)是由一系列对系统中数据进行访问和更新的操作锁组成的一个程序执行逻辑单元(Unit),狭义上的事务特指数据库事务。一方面,当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。另一方面,事务为数据库操作序列提供了一个从失败恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持数据一致性的方法。
事务具有四个特征,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称事务的ACID特性。
原子性
指事务必须是一个院子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现以下两种状态之一。
- 全部成功执行。
- 全部不执行。
任何一项操作失败都将导致整个事务失败,同时其他已经被执行的操作豆浆杯撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。
一致性
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
隔离性
是指在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。在标准的SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,如未授权读取(Read Uncommitted)、授权读取(Read Committed)、可重复读(Repeatable Read,MYSQL 默认采用)和串行化(Serializable)。
持久性
是指事务一旦提交,他对数据库中对应数据的状态变更就应该是永久性的。
2.2 分布式事务
分布式shi'wu事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。通常一个分布式事务中会涉及到对多个数据源或业务系统的操作。
2.3 CAP和BASE理论
对于一个高访问量、高并发的互联网分布式系统来说,如果我们期望实现一套严格满足ACID特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突-因为当我们要求分布式系统具有严格一致性时,很可能就需要牺牲掉系统的可用性。但是,可用性优势一个不允许我们讨价还价的系统属性,对于一致性,则更加是所有消费者对于一个软件系统的刚需。因此,在可用性和一致性之间永远无法存在一个两全其美的方案,于是出现了诸如CAP和BASE这样的分布式系统经典理论。
CAP定理
一个分布式系统不可能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
需要明确的一点是,对于一个分布式系统而言,分区容错性可以说是一个最基本的要求。因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓分布式系统了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然要面对和解决的问题。因此系统架构设计师往往需要把经历花在如何根据业务特点在C和A之间寻求平衡。
BASE理论
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。
总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID特性是相反的,他完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计中,ACID特性和BASE理论往往会结合在一起使用。
---恢复内容结束---