在分布式数据库的世界里,要保证跨节点事务的 ACID,就离不开两阶段提交(2PC);而 2PC 中协调器一旦宕机,就可能造成事务悬挂甚至集群阻塞。本文将深入剖析南大通用GBase 8c分布式数据库(gbase database)的 2PC 事务状态保持机制,看看它是如何在保障强一致性的同时,实现协调器故障下的无感切换。
理解事务机制之前,先要看清 GBase 8c 的分布式架构。
GBase 8c 采用 Shared-Nothing 的分布式架构,计算节点和存储节点分离,节点间通过高速网络通信。集群包含三类核心角色:
当事务只涉及单个 DN 时,CN 可以直接向该 DN 发起本地事务,无需 2PC,性能非常高。但当事务需要跨多个 DN 操作时,就必须依靠 两阶段提交协议来保证原子性。
2PC 的执行流程分为两个阶段:
这套机制在正常情况下运转良好,但存在一个致命的脆弱点—— 协调器(CN)是单点。如果在第二阶段,CN 在发送 Commit 后、收到所有 Commit OK 之前宕机,就会出现一个可怕的情况:
部分 DN 已经提交了事务,部分 DN 还在等待最终的提交指令。事务处于“悬空”状态,已申请的锁无法释放,其他事务可能因此被阻塞。严重时,整个集群可能陷入卡死。
这就是经典 2PC 的 阻塞问题——协调器故障会导致事务状态无法最终确定。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69979120/viewspace-3182152/ ,如需转载,请注明出处,否则将追究法律责任。