NDB 集群内部  /  NDB 内核块  /  DBTC 块

4.9 DBTC 块

这是事务协调器块,负责处理分布式事务和其他数据操作,在全局级别(与 DBLQH 处理单个数据节点上的此类问题不同)。在源代码中,它位于 storage/ndb/src/kernel/blocks/dbtc 目录中,其中包含以下文件:

  • Dbtc.hpp: 定义 Dbtc 类和相关构造,包括以下内容:

    • 触发器和索引数据 (TcDefinedTriggerData)。  一条记录,形成每个表的所有活动触发器的列表。这些记录由触发器池管理,在触发器池中,每当触发器被激活时,就会占用一个触发器记录,而当触发器被停用时,就会释放该记录。

    • 已触发触发器数据 (TcFiredTriggerData)。  一条记录,形成给定事务的所有已触发触发器的列表。

    • 索引数据 (TcIndexData)。  此记录形成每个表的所有活动索引的列表。此类记录由索引池管理,在索引池中,每当创建索引时,就会占用一个索引记录,而当删除索引时,就会释放该记录。

    • API 连接记录 (ApiConnectRecord)。  API 连接记录包含应用程序连接到的连接记录。应用程序可以一次发送一个操作。它可以在发送先前操作后立即发送新的操作。这意味着在事务协调器中,单个事务中可以有多个操作处于活动状态,这是通过使用 API 连接记录来实现的。每个活动操作由 TC 连接记录处理;一旦 TC 连接记录已将请求发送到本地查询处理程序,它便准备好接收新操作。 LQH 连接记录负责等待操作完成;当操作在 LQH 连接记录上完成时,可以在当前 LQH 连接记录上启动新操作。 ApiConnectRecord 始终与 256 字节对齐。

    • 事务协调器连接记录 (TcConnectRecord)。  TcConnectRecord) 保留执行事务所需的所有信息;事务控制器建立与执行事务所需的各个块的连接,并决定哪个节点将处理每个事务,并在结果上发送确认信号给应用程序,以便应用程序可以验证从 TUP 块接收到的结果是否正确。每个活动事务可能有多个记录。TC 连接记录与 API 连接记录协作以与 API 节点进行通信,并与 LQH 连接记录协作以与事务中涉及的任何本地查询处理程序进行通信。 TcConnectRecord) 永久连接到 DBDICT 中的一条记录以及 DIH 中的另一条记录,并包含活动 LQH 连接记录列表以及已启动(但当前未处于活动状态)的 LQH 连接记录列表。它还包含使用当前 TC 连接记录执行的所有操作的列表。 TcConnectRecord 始终与 128 字节对齐。

    • 缓存记录 (CacheRecord)。  此记录用于接收 TCKEYREQ 和发送 LQHKEYREQ 之间(请参阅 第 3.3 节,“操作和信号”)。这是一个单独的记录,以便提高缓存命中率并最大限度地减少内存存储要求。

    • 主机记录 (HostRecord)。  此记录包含系统中每个节点的 活动 状态,并与 128 字节对齐。

    • 表记录 (TableRecord)。  此记录包含系统中所有表的当前架构版本。

    • 扫描记录 (ScanRecord)。  每次扫描都会分配一个 ScanRecord 来存储有关当前扫描的信息。

    • 数据缓冲区 (DatabufRecord)。  这是一个用于通用数据存储的缓冲区。

    • 属性信息记录 (AttrbufRecord)。  此记录可以包含一个 (1) ATTRINFO 信号,其中包含一组 32 个属性信息字。

    • 全局检查点信息记录 (GcpRecord)。  此记录用于在事务完成阶段存储全局检查点号以及计数器。 GcpRecord 与 32 字节对齐。

    • TC 故障记录 (TC_FAIL_RECORD)。  这是在处理从失败的事务协调器接管 TC 职责时使用的。

  • DbtcInit.cpp: 处理 Dbtc 索引和数据的分配和释放(包括类析构函数)。

  • DbtcMain.cpp: 实现 Dbtc 方法。

注意

任何数据节点都可以充当事务协调器。

DBTC 块实现为 Dbtc 类。

事务协调器是应用程序向其发送请求的内核接口。它建立与系统中各个块的连接以执行事务,并决定哪个节点将处理每个事务,在结果上发送确认信号给应用程序,以便应用程序可以验证从 TUP 块接收到的结果是否正确。

此块还处理唯一索引,这些索引必须在所有数据节点上同时协调。