暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

经典的两阶段提交算法原理及缺陷

原创 KunlunBase 昆仑数据库 2022-04-14
323

背景

笔者在过去经典的两阶段提交算法过程中,发现会遇上部分节点在执行事务提交期间发生故障,导致如下的错误,这些错误都会导致用户数据丢失或者出错。错误如下:

1、一个分布式事务的一部分事务分支被提交,另一部分事务分支被回滚

2、应答给客户端事务提交成功,但是分布式事务所有分支全部被回滚

3、应答给客户端事务被回滚,但是分布式事务部分或者全部分支被提交

4、存储节点故障恢复时,某个存储节点的事务分支不能被正确地恢复。

在上面这些错误源中,第#4类错误处理由存储节点自身负责,分布式事务处理机制负责处理前3类错误,笔者会在下篇文章做主要讨论。

对于第#4类错误,笔者曾经在FOSDEM 2021做过一次技术分享,https://fosdem.org/2021/schedule/event/mysql_xa/,国内视频连接在:昆仑分布式数据库 MySQL XA事务处理的容灾技术(https://b23.tv/h7zzmR)以后也会陆续撰文详述。

经典的两阶段提交算法原理

两阶段提交算法把事务的提交分为preapre和commit两个阶段。

第一阶段事务管理器GTM发送prepare命令给所有的resourcemanager(RM),每个RM就prepare分布式事务的本地分支,也就是把它们的WAL日志刷盘以便即使RM宕机,恢复之后仍然可以提交(或者回滚)这些prepared状态的事务。

prepare一个事务之后,这个事务进入prepared状态,之后既可以commit它,也可以rollback它。

如果GTM收到所有的RM返回的都是成功,那么GTM发送commit给每个参与的RM,于是RM就提交其prepared状态的事务分支,这样就完成了两阶段提交。

经典的两阶段提交算法缺陷

如果两阶段提交流程中发生GTM或者RM宕机等故障,那么这个两阶段提交流程就可能中断并且无法正确地继续的问题。

如何优化避免其缺陷?

为避免此类事故发生,昆仑分布式数据库的分布式事务处理机制基于经典的两阶段提交算法,并在此基础上增强了其容灾能力和错误处理能力。

故此可以做到任意时刻昆仑数据库集群的任意节点宕机或者网络故障、超时等都不会导致集群管理的数据发生不一致或者丢失等错误。

一个昆仑分布式数据库集群包含若干个彼此独立且功能相同的计算节点做分布式事务处理和分布式查询处理(下篇文章做详述):

  • 包含若干个存储集群存储用户数据分片,每个存储集群使用高可用机制确保节点宕机数据不丢失。

  • 一个结构与存储集群完全相同的元数据集群,它存储着这个集群的关键元数据信息,包括本文所说的commit log。

  • 一个cluster_mgr模块, 负责维护集群运行状态,并且处理因为节点故障而残留的prepared 状态的事务分支。

故此在上述的模块的有机配合下,经典的两阶段算法提交的缺陷可以很好的避免!

总结

对于经典的两阶段提交算法流程,笔者及团队已经做了优化用于解决这些问题,从而达到坚不可摧的容灾能力。对于优化的原理过程,笔者会在下文做详述(届时欢迎大家做讨论)

点击阅读原文

推荐阅读

KunlunBase架构介绍
KunlunBase技术优势介绍
KunlunBase技术特点介绍
KunlunBase集群基本概念介绍

END

昆仑数据库是一个HTAP NewSQL分布式数据库管理系统,可以满足用户对海量关系数据的存储管理和利用的全方位需求。
应用开发者和DBA的使用昆仑数据库的体验与单机MySQL和单机PostgreSQL几乎完全相同,因为首先昆仑数据库支持PostgreSQL和MySQL双协议,支持标准SQL:2011的 DML 语法和功能以及PostgreSQL和MySQL对标准 SQL的扩展。同时,昆仑数据库集群支持水平弹性扩容,数据自动拆分,分布式事务处理和分布式查询处理,健壮的容错容灾能力,完善直观的监测分析告警能力,集群数据备份和恢复等 常用的DBA 数据管理和操作。所有这些功能无需任何应用系统侧的编码工作,也无需DBA人工介入,不停服不影响业务正常运行。
昆仑数据库具备全面的OLAP 数据分析能力,通过了TPC-H和TPC-DS标准测试集,可以实时分析最新的业务数据,帮助用户发掘出数据的价值。昆仑数据库支持公有云和私有云环境的部署,可以与docker,k8s等云基础设施无缝协作,可以轻松搭建云数据库服务。
请访问 http://www.kunlunbase.com/ 获取更多信息并且下载昆仑数据库软件、文档和资料。
KunlunBase项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb

最后修改时间:2022-11-29 11:14:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论