全局事务管理节点(Global Transaction Management,GTM)是 AntDB 的核心组件。
GTM 是为保持数据库的全局一致性而存在的。有些 PG 分布式数据库如Postgres-XL 实现全局一致性的方法是集群中每个节点的每个事务使用的事务号和快照都来自 GTM,只要让 GTM 提供全局唯一的事务 ID(即 GXID)和全局快照,整个集群就能保持一致的可见性,从而保持数据库的一致性。但是为了保证提供的事务号全局唯一,GTM 必须要以类似“串行”的方式处理事务号和快照的请求,这可能会使 GTM 成为数据库集群的性能瓶颈。
AntDB 设计了可以让 Coordinator 和 Datanode 从本地就可以获取全局快照的算法,从而避免为了获取快照而向 GTM 进行请求的操作,这样极大地减少了 GTM 的压力。
AntDB 的 GTM 虽然不需要向其他节点提供全局快照,但是仍需要向它们提供 GXID。
GTM 与其他节点之间申请、分发活动事务号的流程如下:
(1)集群节点启动时,Coordinator 和 Datanode 的 SnapRcv 进程会和 GTM的 SnapSender 进程进行连接。
(2)某个节点的 backend 进程需要申请事务号的时候,通过 SnapRcv 进程向 GTM 的 SnapSender 进程发送申请事务号请求。
(3)GTM 的 SnapSender 进程收到申请事务号请求后生成一个 GXID,然后把这个 GXID 返回给申请事务号的 SnapRcv 进程,并把该 GXID 加入待分发事务号列表中。
(4)当 GTM 的待分发事务号列表不为空时,GTM 的 SnapSender 会逐个取出次列表中的事务号,分发给集群中所有节点的 SnapRcv 进程。
(5)节点的 SnapRcv 进程收到 SnapSender 分发下来的事务号后,存储在本地活跃事务列表中。
GTM 与其他节点之间申请、分发结束事务号的流程与活动事务号的申请和分发流程,类似:节点的 backend 进程通过 SnapRcv 进程向 GTM 的SnapSender 进程请求事物号,SnapSender 进程回复结束事务号成功后,向所有节点的 SnapRcv 进程分发结束事务号,各节点收到结束事务号后把此事务号从本地活跃事务号列表中剔除。