
一、DM MAL 系统概述1.1 MAL 系统的作用与定位DM MAL (Message Asynchronous Link) 是达梦数据库用于节点间异步通信的核心链路系统。它在数据守护 (Data Watch)、MPP 集群、读写分离、数据库复制等场景下承担节点之间的消息传递任务。MAL 系统的稳定性直接决定了集群的可用性与一致性。1.2 MAL 系统的整体架构MAL 系统以 MAL 链路为基本单元每两个需要通信的节点之间会建立一条 TCP 长连接。链路上承载心跳、控制消息、数据页、Redo 日志等多种报文。MAL 系统在每条链路上独立运行收发逻辑并通过线程池模型处理上层业务下发的消息。1.3 MAL 线程模型总览MAL 系统采用多线程协作模型主要包括以下线程MAL 接收线程 (mal_recv_thread)负责从链路读取报文。MAL 发送线程 (mal_send_thread)负责向链路写入报文。MAL 心跳线程 (mal_heartbeat_thread)周期性发送心跳报文。MAL 检测线程 (mal_check_thread)检测链路与对端状态。MAL 工作线程 (mal_worker_thread)处理上层投递的消息。MAL 定时器线程 (mal_timer_thread)处理超时与重试。上层业务模块MAL 工作线程池MAL 发送队列MAL 发送线程TCP 链路MAL 接收线程MAL 接收队列MAL 心跳线程MAL 检测线程MAL 定时器线程二、DM MAL 系统相关线程详解2.1 MAL 接收线程MAL 接收线程绑定在每条 MAL 链路上循环调用底层 socket 读取接口解析报文边界将完整报文放入接收队列后通知工作线程处理。接收线程需要处理粘包、半包以及网络中断异常当读取返回 0 字节或异常时会触发链路重建流程。接收线程关键逻辑调用 epoll_wait 或 recv 等待数据到达。按报文头解析长度字段拼接出完整报文。将报文封装为 mal_msg 结构挂入接收队列。唤醒等待的工作线程。2.2 MAL 发送线程MAL 发送线程从发送队列取出消息按 MAL 协议封装后写入链路。为避免单条链路阻塞影响整体性能发送线程会引入队列水位控制和写超时机制。当发送队列积压超过阈值时会触发背压或丢弃策略。发送线程关键逻辑从发送队列取出待发送 mal_msg。添加报文头、校验码等协议字段。调用 send 写入链路处理 EAGAIN 与 EINTR。更新发送统计信息触发回调。2.3 MAL 心跳线程MAL 心跳线程按固定周期 (默认 1 秒) 通过链路向对端发送心跳报文用于保活和延迟测量。心跳报文携带发送方时间戳对端回复后可计算链路往返时延 (RTT)作为链路质量评估依据。心跳线程关键逻辑遍历所有 MAL 链路。构造心跳报文附带本地时间戳。通过发送线程投递报文。统计最近一次心跳时间。2.4 MAL 检测线程MAL 检测线程周期性检查链路与对端状态。如果发现某条链路长时间没有收到对端报文会判定链路异常并触发重连。检测线程还会根据配置调整心跳超时阈值适配不同网络环境。检测线程关键逻辑扫描每条链路的最近接收时间。与配置的超时阈值比较。超时链路标记为 DOWN关闭底层 socket。通知工作线程触发重连。2.5 MAL 工作线程MAL 工作线程是 MAL 系统的执行核心负责处理上层业务投递的消息与接收线程入队的对端消息。工作线程以线程池方式运行根据消息类型分发到不同的处理函数 (如归档分发、守护控制、MPP 数据交换等)。工作线程关键逻辑从接收队列或上层接口获取消息。解析消息类型与目标会话。调用对应处理回调。根据需要构造响应消息并投递到发送队列。接收线程入队接收队列上层业务投递发送队列MAL 工作线程池归档处理守护控制MPP 数据交换复制处理2.6 MAL 定时器线程MAL 定时器线程负责管理 MAL 系统内部的定时任务包括重连退避、超时回调、统计信息刷新等。它使用定时轮或最小堆维护到期任务到期后投递到工作线程处理。定时器线程关键逻辑维护定时任务队列。计算最近一个到期任务。等待到期后取出任务并执行。支持任务取消与重新调度。三、DM MAL 线程协作流程与排查3.1 线程协作流程MAL 系统的线程协作可以分为发送路径、接收路径和管控路径三部分。发送路径由业务触发工作线程入队发送线程消费写入链路接收路径由接收线程解析报文入队工作线程处理管控路径由心跳、检测、定时器线程协同维护链路健康。业务调用 mal_send工作线程入发送队列发送线程写链路对端接收线程对端工作线程处理对端发送线程回包本地接收线程本地工作线程处理链路异常时的恢复流程如下是否检测线程发现链路超时关闭旧 socket标记链路状态为 DOWN定时器线程调度重连建立新 TCP 连接是否成功握手并恢复状态退避等待3.2 线程状态监控可以通过动态视图查询 MAL 线程的运行状态常用视图包括V$MAL_LINK_INFO查看 MAL 链路信息包括对端 IP、端口、链路状态。V$MAL_MAILBOX_INFO查看 MAL 邮箱信息包括收发计数。V$THREADS查看数据库内部线程可按 MAL_* 关键字过滤 MAL 相关线程。示例查询语句如下-- 1. 查看 MAL 链路状态 SELECT LINK_NAME, DEST_IP, DEST_PORT, LINK_STATUS FROM V$MAL_LINK_INFO; -- 2. 查看 MAL 线程 SELECT ID, NAME, THREAD_DESC, STATE FROM V$THREADS WHERE NAME LIKE MAL%; -- 3. 查看 MAL 邮箱收发统计 SELECT * FROM V$MAL_MAILBOX_INFO;3.3 常见问题排查MAL 线程相关问题往往表现为集群通信延迟、链路频繁断连或归档延迟增大。排查思路如下检查链路状态通过 V$MAL_LINK_INFO 确认链路是否处于 UP 状态。检查心跳延迟观察 RTT 是否突增判断网络是否抖动。检查发送队列若发送队列积压严重说明对端处理或网络带宽存在瓶颈。检查工作线程负载若工作线程 CPU 占用过高说明业务消息量超预期。检查系统资源关注 socket 缓冲区、文件描述符、TCP 重传率等系统指标。性能优化建议如下合理配置 MAL_CHECK_INTERVAL 与 MAL_CONN_FAIL_INTERVAL避免误判。根据集群规模调整 MAL 工作线程数避免线程切换开销。调整 socket 收发缓冲区大小降低高并发下的丢包概率。使用独立网络承载 MAL 流量避免与业务流量争抢带宽。DM MAL 系统相关线程是达梦集群高可用与高性能的基石理解其职责与协作流程有助于在排查集群通信问题、优化架构设计时快速定位根因。通过动态视图与系统指标的联动分析能够有效提升 DM 数据库集群的运维效率。