在单体应用向微服务架构转型的过程中,本地事务已不再满足系统一致性需求,为了解决这一问题,前人在对性能和数据一致性反复权衡的过程中总结了许多典型的协议和算法,各有优劣。本文我们将深入探讨 Freewheel 如何实现无单点故障的可扩展分布式事务实现模型。
当应用程序有严格的数据一致性要求时,ACID 事务是必须的,如果一个事务涉及的所有操作能够放在一个服务内部,且共用一个数据库,那么只用在一个方法里同一个事务下操作数据库即可。然而为了提升系统整体的可靠性,方便各个模块独立演化,系统从单体应用演进为微服务架构。随着数据体量的增长,数据源也从 MySQL 扩展到关系型数据库 Amazon Aurora 和 NoSQL 数据库(Amazon DynamoDB),基于多样化索引和查询数据的需求,引入了搜素引擎(ApacheSolr 和 ElasticSearch ) ,多服务交互、多数据源并存产生了分布式事务。
Freewheel 分布式事务应用场景有三个:
综合考虑 Freewheel 的业务需求后,我们实现了多引擎数据库分布式事务。
Freewheel 分布式事务方案主要设计目标如下:
数据强一致性:确保该事务范围内的所有操作都可以全部成功或者全部失败,事务具有原子性、一致性、隔离性、持久性 4 个特性。
系统高可用:遵循“design for failure”的设计原则,硬件层面,采用服务节点多 region 多 AZ 部署和节点故障快速自恢复的策略来保证系统的高可用。软件层面,设计 failover 机制应对服务异常。
可扩展:应用 Auto Scaling 服务,它会基于设定的负载压力,自动进行扩展和缩容,来保证服务正常运行。
易用性:分布式事务应用 API:易学,易懂,易记,系统设计上无业务侵入,没有额外的编码或测试工作。
常见分布式事务解决方案对照表:
方案 | 优点 | 缺点 |
---|---|---|
XA | 强一致性无业务侵入 | 同步阻塞有限的数据源支持,比如MySQL, ActiveMQ5.7.7版本前,客户端退出或者服务宕机事务回滚,服务重启binlog丢失问题 |
两阶段提交 | 强一致性 | 延迟:同步阻塞单点问题:协调者在 2PC 中起到非常大的作用,发生故障将会造成很大影响。特别是在阶段二发生故障,所有参与者会一直等待状态,无法完成其它操作参与者依赖:任意一个节点失败就会导致整个事务失败 |
补充事务(TCC) | 高可靠实时高 | 开发复杂,需带有业务补偿机制事务状态管理,需要多次DB操作,有一定的性能损失最终一致性 |
Saga | 易于理解松耦合,避免服务间依赖关系实时高 | 开发复杂,需带有业务补偿机制最终一致性 |
Seata | 高性能易于使用支持AT, TCC, SAGA, XA 模式 | 改造成本大:相关程序都要加入Seata事务性能损失:Seata本身存在一定的性能损耗 |
两阶段提交
补充事务(TCC)
Saga
Seata
结合 Freewheel 强一致性业务需求,多数据源分布式事务将由 XA、2PC 和 Seata 这些解决方案组合而成。
Freewheel 分布式事务依托在 Freewheel 数据访问层中间件(DAL)上,这个中间件是由 Freewheel 平台团队自主研发的,它的目标是为上游应用提供更好的数据访问,为下游数据源提供更好的保护。为了方便描述,下文均用 DAL 来作为 Freewheel 数据访问层中间件的简称。
分布式事务由这三个组件来协商处理:
为了预防死锁,并且减少 DAL RM 和 TC 之间的 交互,降低对 TC 的依赖,同一个分布式事务操作放在同一个 DAL 节点,由此,DAL RM 可以方便的在单节点控制和协调分支事务,完成全局事务的提交和回滚。
以多服务,不同数据源(Aurora 与 DynamoDB)为例,描述 Freewheel 分布式事务过程。
基于业务需求,DAL 分布式事务支持的数据源为 MySQL 和 AWS DynamoDB,下面章节阐述了这两个数据源 ACID 技术实现。
分布式事务设计中新建了事务控制表、事务记录表、索引表及业务镜像表:
采用 MySQL XA 2PC 来保证 ACID,原因如下:
这个时序图描述了 RM 对 MySQL 事务的工作流程:
一个事务操作,由同一个 DAL RM 处理,相同 DB 下业务事务处理,放在一个 XA 操作里:
SQL CRUD 语句应该使用触发行锁的索引操作,否则会触发表锁,影响系统吞吐量。
DynamoDB 提供了本地事务接口 TransactGetItems 和 TransactWriteItems, 它等效于 MySQL 批量操作,对于相互间有上下文或者依赖的操作并不可用,这限制了它在应用中的使用场景,详细信息请参考 TransactGetItems 和 TransactWriteItems。
DynamoDB 本身没有分布式事务机制,DAL 结合 DynamoDB 功能属性,对提供的插入、更新、删除和查询接口,设计 2PC 机制 来满足 DynamoDB 的 事务属性。
下表显示了分布式事务操作 (DisTxDAL) 和其他操作之间的隔离级别。
Operation | Other Operation | Isolation Level |
---|---|---|
DisTxDAL | DisTxDAL | 可序列化 |
DisTxDAL | DAL DDB write interface | 可序列化 |
DisTxDAL | DAL DDB read interface | 读取已提交|读取未提交 (可选) |
更新接口实现方法
一阶段
二阶段
插入接口实现方法
一阶段
二阶段
删除接口实现方法
一阶段
二阶段
查询接口实现方法
事务进行中的数据含有事务属性信息,xid 表示事务全局事务 ID, operation 表示事务操作接口 create、update、delete,这里 item 表示业务数据元素。
操作接口 | 事务开始 | 事务进行 | 事务结束(提交) | 事务结束(回滚) |
---|---|---|---|---|
create | None | item: item valueoperation:createxid: xid value | item: item valueoperation:createxid: value | None |
update | item: item value | item: item new valueoperation:updatexid: xid value | item: item new valueoperation:updatexid: xid value | item: item value |
delete | item: item value | item: item valueoperation:deletexid: xid value | None | item: item value |
基于业务数据变更表及写接口实现方法,实现了在读提交与读未提及查询方法:
为了方便用户使用,分布式事务 API 里封装了与事务协调器及 DAL 资源管理器的交互过程,交互过程对应用是透明的,下面是分布式事务 API:
type DistributedTransApi interface { DisTxDAL(ctx context.Context, fn TranFunc) error}type TranFunc func(ctx context.Context) error
复制代码
微服务之间,微服务与数据库访问层之间采用 google rpc 调用,服务之间关键数据都是基于 context metadata,如果经过两层服务交互,就会导致 context metadata 丢失。举例来说,A 服务调用 B 服务,B 服务调用 C 服务,那么 C 服务就会缺失 A 服务 context metadata,针对这种情况,DAL 提供了通用函数用于提取 DAL 相关的元数据,供应用方按需添加。
func ExtractDalMetadata(ctx context.Context) (metadata.MD, error)
复制代码
协调器主要功能点:
全局分配唯一事务 ID,供 DAL TM 获取,此数据需要在同一事务的业务服务间传输共享。
维护全局事务的运行状态,负责协调和驱动全局事务的提交或回滚。
DAL TC 是 HA 多节点实例,引入 ETCD leader 选举机制来保证只有一个 TC 实例承担 failover 功能,详细信息在系统高可用章节软件层面 failover。
为了预防硬件故障对高可用的影响,DAL,TC 和 ETCD 服务均是多 Region 多 AZ 部署,并且基于服务的特性配置了相应的服务策略:
美东美西均部署相应服务作为服务灾备策略,下图是美东地区的解释图(美西类似)。
在 DAL 应用或者业务应用遇到异常退出时,软件层面 Failover 机制是为了能不发生死锁,并且继续处理未完成分布式事务,实现方法如下:
Freewheel 强一致性分布式事务未来会支撑更多的数据源,如 Redis、Solr 和 ElasticSearch 等,目前的数据库访问层 API 是基于 gRPC,这对数据库访问层使用方带来了一定技术语言限制,未来会探究 GraphQL 在数据库访问层分布式事务应用的可行性。
作者简介:
李长城,Lead Software Engineer,目前就职于 Comcast FreeWheel 架构平台团队。研究方向为微服务架构、数据库中间件、云计算等领域。
领取专属 10元无门槛券
私享最新 技术干货