上一篇介绍了 单机数据库 的 ACID 事务。下面将进入真正的难点:
“分布式环境”
分布式与单机最大的区别在于:单机是一个整体。组成这台机器的零件要么(看上去)都在正常状态,要么都不在状态,很少有例外。
在单机环境,底层系统(操作系统,HAL,BIOS 以及固件)既不会向软件报告有一个 CPU 或内存被拔出插槽,也不会报告某条系统总线面临堵塞。软件也不需要设计成在这种情况下继续工作。
即使遇到硬件故障,底层系统也会尽力处理,向软件维持一个机器“整体可用”的表象。如果这个故障无法处理,最终系统会向软件发送一个信号,例如著名的 Segmentation fault ——这多半会 kill 当前运行的程序。
而 分布式环境 天生就需要处理部分失效。原因很简单:分布式 = 多个节点。概率论告诉我们:系统的节点越多,单个节点发生意外故障的几率就越大。而且,这里没有 分布式操作系统 能帮忙处理这种意外。
因此,在分布式环境,软件要负责解决故障带来的部分失效。早在 2000 年,Brewer 教授就提出,部分失效遵循一个定理:
CAP 定理
缩写 CAP 代表 Consistency(一致性), Availability(可用性)和 Partition tolerance(分区容忍性),注意:这里的 Consistency 与 ACID 里的数据一致性(C)不一样。这里指数据在分布式节点的一致性。
CAP 定理断言,任何一个分布式系统都不可能同时满足 C-A-P 三个特性:
C -- 从每个节点读到相同的数据。
A -- 从任何位置发起的读写请求都能够成功返回。
P -- 即使出现分区(部分隔离),也能响应请求。
这是可以证明的。设想一下,当一个分布式系统发生了部分隔离:
节点被分隔到了两个区域:写入区域(1)的数据无法传递到区域(2),而访问区域(2)的请求也不能转发到区域(1)。
这时候,如果让左边的写入成功——优先保证可用性,则访问区域(2)的请求读不到最新一致的数据,违反了一致性。
反之,如果让写入失败(阻塞),或者彻底阻止外部请求访问区域(2)——则保证了数据一致性,但是损失了可用性。
因此,要同时保证一致性和可用性,区域(1)和区域(2)必须能够互相通讯。
这里产生了一个 困境:首先,分布式系统的软件必须在 C-A-P 三个特性之间做出选择。其次,一旦意外故障导致分布式系统部分隔离,软件又必须在可用性和一致性之间再做一次选择。
部分隔离是常见的。前面提到,意外故障会带来分布式系统的部分失效。不管这种失效是发生在一个机房还是一个节点,或者仅仅是一次网络超时 ——它都会导致机房与机房之间、故障节点和正常节点之间、超时节点和写入节点之间,出现时间或长或短的部分隔离。
因此,分布式系统必定经常要做这类选择。
回到我们关心的分布式事务。
事务 ACID 在分布式环境下也会有相同的问题。如果出现部分隔离,一个需要访问区域另一侧的 ACID 事务,要么选择回退,要么选择等待。回退会让事务直接失败。而等待会让事务无法结束,使得隔离性规定的那些需要事务结束才能对外可见的数据无法变成可见(例如:没有释放锁)。总之,两个选择都会带来可用性问题。
问题的症结就像前一篇文章说的那样:ACID 的目标是保证数据的一致性。这样,在分布式环境中,因为 CAP 定理的限制,满足 ACID 的事务系统只能选择 C-A 或者 C-P。这样,要么系统完全无法容忍分布式环境的部分失效,要么在发生部分失效时必须放弃可用性。
这是一个 分布式困境。
为了走出这个分布式困境,我们需要接触更多的理论。
敬请期待。
相关推荐
分布式Key Value Store漫谈
Dubbo分布式服务架构,对于研究大型Web服务器的并发技术的同学们有帮助。
#资源达人分享计划#
漫谈WebLogic-CVE-2020-25511
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...
GPFS与CEPH之间的对比,反映出商业软件与开源解决方案的不同策略。GPFS依赖于IBM的技术支持,提供全面的服务和保障,适合对稳定性有严格要求的企业级应用;而CEPH则依靠社区驱动,更新快速,适应性强,适合预算有限...
.NET 4.0面向对象编程漫谈应用篇是一本专注于.NET 4.0框架下进行面向对象编程技术的电子书籍。作者金旭亮将其专业见解和实践经验融入到这本书中,让读者在应用层面上深入理解面向对象编程(Object-Oriented ...
在.NET 4.0面向对象编程漫谈基础篇中,金旭亮详细介绍了.NET框架下的面向对象编程的基础知识和技巧。面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来设计软件。对象可以包含数据...
《大型分布式网站架构设计与实践》主要介绍了大型分布式网站架构所涉及的一些技术细节,包括SOA架构的实现、互联网安全架构、构建分布式网站所依赖的基础设施、系统稳定性保障和海量数据分析等内容;深入地讲述了...
综上所述,《星际旅行漫谈》通过对光速旅行、时间机器和虫洞等概念的深入探讨,不仅呈现了人类探索宇宙的梦想与追求,也为读者展现了科学技术进步所带来的无限可能。尽管目前这些概念大多停留在理论阶段,但随着科学...
分布式事务通常采用两阶段提交协议来确保所有参与者要么全部提交,要么全部回滚。 【两阶段提交(Two-Phase Commit)】 两阶段提交是分布式事务中常用的一种协议,它分为准备阶段和提交阶段。在准备阶段,所有资源...
本文件提供信息安全基本知识,面向普通人群尤其是IT技术人员,通过案例和深入浅出的讲解,让听者掌握基本的信息安全知识、理念、理论和技能。适合于各类科技公司、院校和研究院所。
「端点安全」跨越攻防的壁垒_漫谈企业内部安全蓝军建设实践 - 安全方案 企业安全 企业安全 NGFW 安全对抗 端点安全
谈兼容内核之一:ReactOS怎样实现系统调用.pdf 漫谈兼容内核之二:关于kernel -win32的对象管理.pdf 漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 漫谈兼容内核之四:Kernel-win32的进程管理.pdf 漫谈兼容内核...
漫谈分布式架构 初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE...
电子商务解决方案是将商业活动与互联网技术紧密结合,以提高企业的运营效率和客户服务体验。本节将深入探讨各大IT巨头如IBM、HP在电子商务领域的解决方案。 【IBM公司的电子商务总体解决方案】 IBM的E-business...
【尿素期货上市】尿素期货是中国期货市场中的一种新型品种,主要针对尿素这一重要的化肥原料进行交易。尿素期货的上市对于市场参与者来说,提供了一种对冲价格风险和进行风险管理的工具,同时也增加了市场的流动性和...