CAP理论虽然告诉我们,一致性和可用性二者不可兼得,但这并不代表互联网系统都应该牺牲一致性,哪个特性更重要只有业务需求才能决定。
ACID是单机事务的特性,不过在分布式系统中,由于两台机器理论上无法达到一致的状态(参考Fischer等的论文),需要引入一个单点进行协调,这就出现了著名的两阶段锁协议。两阶段锁(Two-phase commit)协议是每个分布式工程师必须掌握的协议,大致如下:
1, Prepare:协调者(Coordinator)给每个参与者(Participants)发送Prepare消息,每个参与者要么直接返回失败,比如权限验证失败,要么在本地执行但不提交,到达一种“万事俱备,只欠东风”的状态;
2, Commit/Rollback:如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作;
两阶段锁是一种悲观锁,第一个问题是协议本身的成本:整个协议过程是需要加锁的,比如锁住数据库的某条记录,且需要持久化大量事务状态相关的操作日志。更为重要的是,两阶段锁在出现故障时表现出来的脆弱性,比如两阶段锁的致命缺陷:当协调者出现故障,整个事务需要等到协调者恢复后才能继续执行,如果协调者出现类似磁盘故障等永久性错误,该事务将成为永久遗弃的孤儿。两阶段锁的更为详细的描述可以参考Andrew S. Tanenbaum的大作<>。
针对两阶段锁协调者故障的问题,有不同的解决方法:第一种是三阶段锁(Three-phase commit),这种方法纯粹是理论上的方法,工程上不具备可操作性;第二种方法是对协调者进行Replication,当主协调者出现故障时,可以由备机接替其继续服务。如果需要将这个过程自动化,可以引入Paxos协议执行主协调者选举(参考Jim Gray和Lamport的论文)。
当然,这里需要简单说明,并不是所有和多机有关的事务都需要两阶段锁,比如Microsoft Azure系统中存三个副本,主副本的事务操作以操作日志的形式同步到辅副本,虽然三台机器都进行了事务操作,不过本质上还是单机的事务操作。
和两阶段锁这种悲观锁相对应的就是乐观锁:大多数操作成功失败的可能性很小,所以不需要类似两阶段锁的Prepare阶段,直接在多个参与者上执行,当某个参与者执行出现问题,再执行补偿操作。又如存储系统中经常出现的Read-Test-Write操作,我们不会将整个过程锁住,而是允许Read-Test-Write过程中其它客户端对互斥资源的访问,比如Read阶段记录数据版本,Write的时候检查版本,如果发现不一致则重试整个Read-Test-Write过程。
BASE主要是针对多套业务系统而言,在存储系统内部一般不提这个概念。如果是数据库这样的SQL系统,就是ACID的一致性模型;如果是类似GFS + Bigtable这样的NOSQL系统,就是单行事务的一致性模型;如果是类似Google Megastore这样的NOSQL系统,就是支持跨机多行事务的一致性模型;如果是Dynamo这样的去中心化系统,就是基于冲突合并的一致性模型。多套业务系统之间可以采用BASE的原则进行架构设计,比如采用消息中间件进行可靠的消息传输,保证多台业务系统最终达到一致的状态。
几乎所有的NOSQL存储系统都不支持分布式事务,因为需求不够强烈,且实现极其复杂。然而,如果业务确实需要分布式事务,那就支持吧,虽然影响扩展性,不过不可能因为我们是NOSQL系统就可以找到其它不影响扩展性的方法。
分享到:
相关推荐
### 分布式系统工程实践知识点概述 ...以上内容仅为《分布式系统工程实践》文档的主要知识点概述,每一部分都包含了大量的技术细节和实践经验,对于深入学习分布式系统的设计与实现具有重要的参考价值。
分布式系统工程实践 分布式系统是一种由多个独立的计算单元组成,通过网络互相连接并协作完成任务的系统。这类系统通常具有高度的内聚性和透明性,其核心目标是提供高性能、高可用性以及可扩展性。分布式系统中,...
分布式系统工程实战是一本由阿里人员撰写的书籍,旨在为读者提供分布式系统设计与实现方面的实战经验。书中内容丰富,涵盖了分布式系统的基础知识、关键技术、存储与计算系统的分类以及工程实现的注意事项等关键知识...
本文的内容虽然涉及了分布式系统的诸多方面,但侧重于介绍那些在工程实践中应用广泛、简单有效的理论、算法和协议,并通过实例和“工程投影”来帮助读者更好地理解这些概念和技术在真实系统中的应用。由于篇幅和深度...
7. **代码实践与原型工程**:资料包中的代码和原型工程为学习者提供了动手实践的机会,通过实际操作理解分布式事务的实现原理和具体步骤。 8. **视频教程**:视频教学通常比文字更具象化,能更直观地展示分布式事务...
在大规模分布式系统中,由于网络延迟、服务故障等因素,实现这样的事务处理非常复杂。 LCN分布式事务框架的核心是基于消息中间件实现的,通过拦截器和通知机制,将本地事务与全局事务进行解耦。它的工作原理是:当...
同时,一个分布式系统工程实践的成功,不仅取决于理论和技术的选择,还依赖于合理的架构设计和高效的工程实现。在本文的模型中,节点是一个整体的概念,它可能是一个硬件节点,也可能是一个软件进程。宕机节点是系统...
在实现高性能分布式事务方面,GoldenDB采用了无共享架构(ShareNothing),通过无状态化的设计理念,避免了单点故障和状态依赖问题。计算节点负责接收数据库操作请求,执行SQL解析、优化,并生成分布式查询计划。...
本书《安全工程——可靠的分布式系统构建指南》旨在为读者提供一个全面深入地了解如何在分布式系统中实现高效且可靠的安全策略的平台。 #### 第一部分:安全与分布式系统基础 **1.1 分布式系统的概念** 分布式...
通过东北大学的“分布式操作系统课件”,学生可以系统学习以上内容,并通过案例分析和实践项目,提升对分布式系统设计和实现的理解。在当今互联网和大数据时代,分布式操作系统不仅是学术研究的热点,也是实际工程...
在深入分析微服务分布式事务管理机制的基础上,我们将探讨如何在异步通信模式下实现微服务架构中的事务一致性,并深入理解与之相关的概念与技术。 首先,微服务架构是目前软件工程中一种流行的服务组织方式,其主要...
分布式事务管理是现代大型互联网应用中的核心技术之一,它允许在多台服务器或多个数据库之间保持...通过这个DEMO,你可以深入了解分布式事务的实现原理,并在自己的项目中应用这些技术,以确保复杂环境下的数据正确性。
因此,设计有效的故障检测和恢复机制是分布式系统工程中的一大挑战。 ### 4. 追求最高透明度的代价 尽管高透明度可以带来更好的用户体验,但过度追求这一目标可能会显著降低系统的性能。例如,为了维持完全的分布...
通过构建分布式服务框架、分布式事务管理等技术框架,工行已经在部分业务场景中实现了分布式架构的应用。 具体到实践层面,工行在构建大数据云平台方面也有所布局,利用Hadoop、分布式数据库等技术,为营销、风险...
杨传辉,阿里巴巴高级技术专家,花名日照,OceanBase核心开发人员,对分布式系统的理论和工程实践有深刻理解。曾在百度作为核心成员参与类MapReduce系统、类Bigtable系统和百度分布式消息队列等底层基础设施架构工作...
标题《基于非阻塞的分布式事务提交协议的实现》和描述提到了关于分布式事务提交协议的最新研究和实现,具体内容中介绍了两阶段提交(2PC)和三阶段提交(3PC)协议的缺点,并提出了一种新的基于非阻塞的两阶段提交协议...