gydtep
发表于 2021-7-12 14:42:15
XA 协议由 TM 向多个 RM 通过 XA PREPARE 和 XA COMMIT 两条命令完成两阶段提交。两阶段提交常常为人诟病的问题是 TM 的单点问题和 Commit 阶段发生异常可能导致的数据不一致问题。为此,在 PolarDB-X 的实现中,我们额外引入了事务日志表以及 COMMIT POINT 的概念。
gydtep
发表于 2021-7-12 15:14:31
确认所有参与节点 Prepare 成功的情况下,我们向全局事务日志添加一条事务提交记录作为 COMMIT POINT。在 TM 发生异常的情况下,我们可以选择新的 TM 继续完成两阶段提交,新 TM 会根据主库中是否存在 COMMIT POINT 记录选择恢复事务状态或者回滚事务。
gydtep
发表于 2021-7-12 18:50:39
因此我们也做了这样一个优化:仅在第一次进行快照读时获取 SNAPSHOT_TS。这个优化针对的是一些对 Serializable 有很强需求的场景:
BEGIN;
SELECT balance FROM accounts WHERE id = 0 FOR UPDATE; # 检查余额,需要加锁
UPDATE accounts SET balance = balance - 1 WHERE id = 0;
UPDATE accounts SET balance = balance + 1 WHERE id = 1;
gydtep
发表于 2021-7-12 19:23:01
单机多分片优化
如果分布式事务的多个分区位于同一个 DN 节点上时,实际上可以将它们共同视作一个单机事务。这种情况下,可以将多个 RPC 合并,一次性地完成多个分片的 PREPARE 和 COMMIT。如果所有分片均在同一个 DN 节点上,甚至可以将事务以 1PC 的方式提交。
gydtep
发表于 2021-7-12 20:28:59
异步提交优化
上述优化针对的依然是一部分特定场景,对于多分片的分布式事务,往往还是相比单机事务有较长的延迟。因此我们设计了异步提交方案,针对任何分布式事务,都可以在完成了 PREPARE 阶段后直接返回成功,达到接近单机事务的提交延迟(一次跨机房 RPC)且不影响数据可靠性和线性一致性。我们会在之后的文章中详细介绍这一方案,欢迎大家关注我们专栏。
gydtep
发表于 2021-7-12 21:39:03
总结
本文主要介绍了 PolarDB-X 2.0 中的 TSO 分布式事务的实现。相比于 PolarDB-X 1.0 (DRDS)默认的 XA 事务,TSO 事务性能更优:通过 MVCC 方式避免加读锁,同时通过一系列优化(例如异步提交)提升了性能。此外借助 TSO 事务还提供了备库一致性读的能力。
gydtep
发表于 2021-7-13 10:25:58
解读:概念随着新的技术发展而演化
第一阶段:容器化封装+自动化管理+面向微服务
第二阶段:DevOps、持续交付、微服务、容器
第三阶段:DevOps、持续交付、容器、服务网格、微服务、声明式API
gydtep
发表于 2021-7-13 10:37:01
对一个词的解读,除了看其历史发展背景,还有一种偏向于语言学的方法解读,也就是我们常说的从“字面意思”来理解。
Cloud Native,从词面上拆解其实就是 Cloud 和 Native,也就是云计算和土著的意思——云计算上的原生居民,即天生具备云计算的亲和力。
gydtep
发表于 2021-7-13 11:18:33
首先从 Cloud 来理解,云可以看作是一种提供稳定计算存储资源的对象。为了实现这一点,云提供了像虚拟化、弹性扩展、高可用、高容错性、自恢复等基本属性,这是云原生作为一种云计算所具备的第一层含义。第二层要从 Native 来看,云原生和在云上跑的传统应用不同。一些基于公有云搭建的应用是基于传统的 SOA 架构来搭建的,然后再移植到云上去运行,那么这些应用和云的整合非常低。
gydtep
发表于 2021-7-13 16:25:28
容错设计
如果说错误是不可避免或者难以避免的,那么我们应该换一个思路,保证错误发生时,我们可以从容应对。
消除单点
特性开关
服务分级
降级设计
超时重试