陈奇网络工作室

一文教你快速解决分布式事务XA的一致性问题

云计算

最近,腾讯云推出了分布式数据库解决方案( DCDB ),其最明显的特性之一是提供比开源分布式事务XA更高的性能。 大型业务系统具有用户数多、并发性高的特点。 在这一点上,很难支持集中式数据库(独立数据库)的性能。 因此,主要的互联网企业往往需要采用分布式(体系结构)数据库,物理利用更多的低端设备,在逻辑上水平划分大型表来支持业务。

分布式数据库可以解决性能难题,但事务一致性问题难以用分布式数据库解决。

分布式事务领导者面临的挑战,难以实现数据一致性

众所周知,一个事务的更新是由分布式数据库系统中的多个独立数据节点完成的。 每个节点上的本地事务都是此全局事务的一个事务分支。 在提交这些全局事务的过程中,某些事务分支可能无法成功提交。

针对此问题,理论解决方案——两阶段提交协议(简称2PC )已在业内存在,扩展了分布式事务(简称XA )的解决方案。 但是,在行业中实现工程化并大规模应用的案例很少。 云分布式数据库DCDB已在公司内部业务中使用多年。

(图:两阶段提交算法)

目前,DCDB已应用于腾讯内部90%%u4EE5的交易、计费业务,三一重工(树根互联)、汇通天下( G7 )、陂文集)起点/创世中文网等)、微众银行、和泰人寿、威富通等均在此产品中

支持第一个云分布式数据库XA,mysql 5.7

腾讯云分布式数据库DCDB是基于腾讯金融级数据库(公司内部代号TDSQL )云化改造的Mysql协议兼容的分布式数据库。 目前,腾讯云DCDB通过MySQL5.7(Percona分支)协议正式支持分布式事务XA,并在腾讯云公有云、金融云中面向开发者开放。 开发人员可以请求DCDB实例,初始化后,通过执行以下sql初始化连接实例:

MySQL xa init;

Query OK,0Rowsaffected(0.03sec ) )。

注意:在初始化xa之前,请打开强同步复制功能。 此外,此sql还会创建xa.gtid_log_t。 用户在今后的使用中请勿执行任何操作。

为了支持分布式事务处理,DCDB还添加了以下SQL命令:

1 ) SELECT gtid ),获取当前分布式事务的gtid (事务的全局唯一标识符),如果该事务不是分布式事务,则返回空;

gid格式:

"网关id "-"网关随机值"-"序列号"-"时间戳"-"分区号"例如c46535fe-b6-dd-595db6b8-25

2 )获得selectgtid_state(「gtid”)、“gtid”的状态,并且可能的结果如下:

a ) " COMMIT "表示事务已提交或最终提交

b )“ABORT”,表示事务最终将回滚

c )由于空、事务的状态将在1小时后明确,因此有以下两种可能性:

1 ) 1小时后查询,表示事务的状态已被清除

2 )如果在1小时内进行查询,识别事务最终会回滚

3 )运输令:

xa recover—向后端SET发送xa recover命令进行总结

xa lockwait :显示当前分布式事务处理的等待关系。 可以使用dot命令将输出转换为等待关系图。

xa show :当前网关上运行的分布式事务处理

以Python为例,可以将转账业务编码为:

db=

PymySQL.connect(host=testhost,port=testPort,user=testUser,password=testPassword,

database=testDatabase )

cursor=db.cursor (

try :

cursor.execute(begin )

把一个账户里鲍勃的余额减1

query=更新

t _ user _ balancesetbalance=balance1

wereuser=\\& quot; bob\& quot; andbalance1)

affected=

cursor.execute(query )

if affected==0: #余额不足,回滚事务处理

cursor.execute(rollback ) )。

返回

#给一个账户约翰的余额加1

query=更新

t _ user _ balancesetbalance=balance 1

wereuser=\\\& quot; John\\& quot; )

cursor.execute(query )

#为了安全起见,建议您现在运行‘SELECT gtid ( )’以获取当前事务的id值,以便于以后跟踪事务的执行情况

#提交事务处理

cursor.execute(commit )

except pyMySQL.err.MySQLError as

e :

#发生故障,回滚事务

cursor.execute(rollback ) )。

分布式事务的优点是大大降低了APP应用程序开发的难度。 因为某些不支持XA的数据库需要特殊且设计巧妙的业务系统,而不是利用数据库来解决事务中的数据不一致问题。 这种对APP应用程序开发人员的技术水平要求很高,业务系统越复杂,开发成本和技术障碍就越高。 这是业内许多开发人员在面对分布式数据库时感到头疼的主要原因。

腾讯云DCDB XA的重要实现方案

1、DCDB体系结构简介

云DCDB集群整体简图如下图所示。 MySQL将一组主从节点配置(也称为主设备)的主从节点称为SET,并在每个SET之外放置网关( TProxy )以形成物理片( Shard )。

CDB后端是MySQL (或其分支版本)数据库,当前,telnetmultiplecloudpubliccloud发布了支持XA的MySQL5.7.17 ) perertiplecloud版本

2、网关( TProxy )和XA

网关是用于接收请求并与后端MySQL建立连接的网络模块。 网关在两种模式(称为noshard )下工作。 在此模式下,网关不处理/分析SQL语句,而是透明地转发请求和响应。 另一种模式是shard (支持分布式( distributed )或自动水平分割表),TProxy分析SQL并将其传输到不同的数据片。

在实现XA之前,网关不能在一个事务中将DML语句发送到多个SET。 如果未实现两阶段提交( 2PC ),则事务将采用一阶段提交,因此如果任何分布式SET提交失败或回滚,该分布式事务将处于不一致状态。

(网关的工作原理)

两阶段提交所需的事务管理器( TM )。 为了解决灾难恢复和简化体系结构,腾讯云DCDB在TProxy上实施了TM。 DCDB网关是一个无状态模块,该体系结构允许DCDB XA支持以下内容:

1、分布式事务对业务透明,与单元事务语法( start transaction/commit/roll back/save point )兼容。

2 .每个网关能够独立接受和处理事务请求,与其他网关协调节点故障,避免丢失事务。

3、允许明示性事务中的多个语句分别发布到多个切片。

4、网关不需要持续状态,不需要灾难恢复,随时可以经由调度集群退出或加入集群,且性能可以扩展。

5、支持autocommit下的单句写入访问多个分片等。

通过CDB网关,还可以以流形式执行group by、order by。 流式传输使这些操作非常高效。 网关还支持两个Shard使用shardkey (表密钥)进行等值连接,以及使用shardkey进行子查询。

未来,telnet云将支持分布式JOIN、Sparksql和l2分区等高级功能,并与更多MySQL高级语法兼容。

3、强同步和XA

由于腾讯云DCDB默认采用强同步复制,主从节点的数据完全一致,XA事务也必须遵循强同步逻辑,从站确认数据同步后才能响应业务。 通过强同步,DCDB XA可以轻松应对以下两种异常情况

1、确认了主节点发生故障时,事务数据不会丢失。 主节点发生故障时,具有最新数据和binlog的从站被选择为主节点。 其中的数据还包括向用户确认已完成提交的所有事务的数据。

虽然绝大多数的XA事务可以正常执行。但极少数的异常情况还是会影响整个集群稳定性,因此,腾讯云设计了agent(监控模块),在故障后继续协助完成本地MySQL上面prepared事务的提交,即agent会解析commit log,并根据异常处理本地仍然处于prepared的事务数据;如果commit log上面没有事务的提交决定的话,agent也会回滚超时未被提交的prepared本地事务。

虽然在MySQL 5.5、5.6等版本早已实现XA,但这两个版本相对于5.7仍然有性能不足,因此腾讯云目前只在公有云上基于5.7.17支持XA版本。如今,腾讯云在MySQL 、percona、MariaDB等分支中做了大量优化和相关bug修复(部分已经提交到社区修复patch或开源),未来腾讯云还将继续致力于新特性的开发和相关Bug的修复,为众多有需要的企业,提供更好的分布式数据库支持。

更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理商官网:www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3