分布式事务数据库HotDB的数据强一致性

2022-03-15 00:00:00 数据 事务 节点 计算 开启

HotDB数据强一致性

1.数据强一致性(XA事务)

在分布式事务数据库系统中,数据被拆分后,同一个事务可能会操作多个数据节点,产生跨库事务。在跨库事务中,事务被提交后,若事务在其中一个数据节点COMMIT成功,而另一个数据节点COMMIT失败;已经完成COMMIT操作的数据节点,数据已被持久化,无法再修改;而COMMIT操作失败的数据节点,数据已丢失,这种情况会导致数据节点间的数据不一致。

HotDB Server利用MySQL提供的外部XA事务,可解决跨库事务场景中,数据的强一致性:要么所有节点的事务都COMMIT,要么所有的节点都ROLLBACK,以及提供完全正确的SERIALIZABLE和REPEATABLE-READ隔离级别支持。

1.1使用XA事务

在计算节点中,默认情况下,XA事务是关闭的。要使用XA事务,需在server.xml文件中,将属性enableXA设置为TRUE:

<propertyname="enableXA">true</property>

重新启动计算节点后方能生效。若XA事务开关被修改后,未重启计算节点直接进行动态加载,修改结果不会生效且会在计算节点日志中有INFO信息:

Can't reset XA in reloading, please restart thehotdb to enable XA

计算节点在开启XA事务功能后,对于应用程序或者客户端MySQL命令操作都是透明的,SQL命令,事务流程没有任何变化,可像普通事务一样使用。用START TRANSACTION或者BEGIN,SET AUTOCOMMIT=0开启事务, COMMIT或ROLLBACK提交或者回滚事务;开启自动提交也同样支持。

在系统中使用计算节点的XA事务,为保证事务的强一致性,需注意以下几点:

1.MySQL版本必须为5.7.17及以上。因为5.7.17之前的版本,MySQL在处理XA事务时,存在缺陷。因此在开启XA模式下,若计算节点启动时检测到存在任意存储节点MySQL版本低于5.7.17则计算节点启动失败;若启动计算节点后添加低于5.7.17的存储节点,动态加载将失败;若启动计算节点前低于5.7.17的存储节点无法连接,即使启动后重新连接成功,该存储节点仍然为不可用且动态加载将失败。以上情况都将输出ERROR级别的日志提示:Currently in XA mode, MySQLversion is not allowed to be lower than 5.7.17.

2.存储节点及配置库需开启半同步复制(额外注意:开启XA模式时,不允许使用MySQL Group Replication复制模式),当开启半同步复制时,不建议开双1(innodb_flush_log_at_trx_commit =1,sync_binlog = 1)模式,两者同时开启也会影响性能;

3.部署和使用XA强一致模式,需配置数据节点的高可用,并注意在主机故障切换从机后,原主机不可重用,不可直接在计算节点中标记其为可用,后续必须重新部署原主机,才可标记为可用。

4.XA事务的隔离级别支持serializable和repeatable read,若存储节点隔离级别设置为read uncommitted和read committed, 计算节点会直接按repeatable read模式进行处理。同时XA模式下,无法将会话的隔离级别设置为read uncommitted和read committed。

5.开启XA模式,使用HINT后,因计算节点无法控制HINT语句修改的内容,后续跟这个连接相关的任何操作计算节点都不再控制隔离级别的正确性。

特殊说明:

XA模式下:参照SQL99标准,begin\start transaction会立即开启一个事务。也即在XA模式打开的情况下,begin\start transaction将等同于start transaction with consistent snapshot。

来源 https://zhuanlan.zhihu.com/p/387406661

相关文章