
一、 前言什么是 AFC达梦自治容灾集群DM Autonomous Failover Cluster简称 DM AFC是基于 Raft 一致性协议构建的强一致性、高可用数据库集群。与传统的“主备守护集群”不同AFC 不需要依赖外部的守护进程节点之间通过 Raft 算法**自动选举 Leader**能够容忍 (N-1)/2 个节点故障例如 3 副本可容忍 1 个节点故障且具备**数据零丢失、自动主备切换**的能力。本篇文章记录了一次在**共享的国产化 ARM 服务器鲲鹏 920银河麒麟 V10** 上从零搭建 3 副本 AFC 集群的完整测试过程。整个搭建过程遵循 **“不修改环境变量、不影响其他用户、不破坏系统配置”** 的原则通过绕开各种环境冲突成功让集群运行起来。二、 基础概念与环境规划1.核心术语**Raft 归档**核心同步方式要求**奇数个副本**3、5、7、9。**主库Leader**唯一处理读写请求的节点。**备库Follower**同步并重演日志提供只读查询参与主库选举。**Learner 副本**新节点加入时的过渡状态只接收日志不参与选举和日志提交。**影子副本**不含数据的特殊副本仅参与投票和查询用于节省存储空间本次测试未涉及。2.三机规划本次测试使用内部网段 10.36.25.x 的三台物理服务器。**31 号机器 (T01)**数据库端口 15231XMAL 通信端口 11031选举优先RAFT_VOTE_INTERVAL3000。**32 号机器 (T02)**数据库端口 15232XMAL 通信端口 11032选举次优先RAFT_VOTE_INTERVAL4000。**33 号机器 (T03)**数据库端口 15233XMAL 通信端口 11033选举延迟RAFT_VOTE_INTERVAL5000。*数据目录统一规划为/dmdata/xuboshi/afc_test/T0X/DAMENG。*三、 搭建前的“环境排雷战”### ⚠️ 避坑点 1安装包架构选错这台服务器 CPU 是 aarch64鲲鹏 ARM千万不能使用 x86 架构的 ISO 安装包。必须下载 dm8_2026xxxx_arm_kylin10_sp1_64.iso 版本否则 DMInstall.bin 将无法执行。### ⚠️ 避坑点 2旧版本达梦的环境污染因为服务器是多人共享的机器上存在旧版本的达梦如 /dmdata/lx/dm5_65/bin。旧版本达梦的库路径被写死在了二进制文件的 RPATH 中。**现象**直接使用绝对路径执行新版 dmrman 时会报 undefined symbol: utl_analyse_para_fun。**绕过方法**直接 cd 进新版本的 /bin 目录使用 ./dmrman利用当前目录的库即可完美避开环境冲突。### ⚠️ 避坑点 3多人机器残留的 dmap 进程干扰33 号机器上残留了多个其他用户启动的旧版 dmap 进程。新版本的 dmrman 执行脱机还原时默认会去连系统 dmap 的 4236 端口导致报错 DM[-141]:Can not connect to incompatible dmap。**绕过方法**达梦 dmrman 提供了 USE_AP2 参数意为“**使用自身进程执行完全不依赖外部的 dmap 进程**”。加入此参数后无论系统里有多少其他进程都不会再干扰。四、 AFC 三副本集群搭建实操实操版Step 1三节点数据库初始化在 31、32、33 三台机器分别执行 dminit 初始化。这里设置 LOG_SIZE256联机日志 256MB减小体积。bash# 以 31 号机器为例/dmdata/xuboshi/opt/dmdbms/bin/dminit PATH/dmdata/xuboshi/afc_test/T01 PORT_NUM15231 INSTANCE_NAMET01 SYSDBA_PWDDameng123 SYSAUDITOR_PWDDameng123 LOG_SIZE256Step 2配置 dm.ini 开启归档并限制资源在三台机器 DAMENG/dm.ini 末尾追加或修改iniARCH_INI 1ALTER_MODE_STATUS 0BUFFER 50MAX_BUFFER 100Step 331 号节点备份与分发进入新版 bin 目录脱机备份 T01然后通过 scp 把备份推送给 T02 和 T03。bashcd /dmdata/xuboshi/opt/dmdbms/bin./dmrman USE_AP2 CTLSTMTBACKUP DATABASE /dmdata/xuboshi/afc_test/T01/DAMENG/dm.ini FULL TO BACKUP_T01 BACKUPSET /dmdata/xuboshi/afc_test/T01/DAMENG/BACKUP_T01# 推送备份到另外两台机器scp -r /dmdata/xuboshi/afc_test/T01/DAMENG/BACKUP_T01 dmdba10.36.25.32:/dmdata/xuboshi/afc_test/T02/DAMENG/scp -r /dmdata/xuboshi/afc_test/T01/DAMENG/BACKUP_T01 dmdba10.36.25.33:/dmdata/xuboshi/afc_test/T03/DAMENG/Step 432、33 节点还原巧妙使用 USE_AP2 避开干扰在 32、33 机器上同样切到新版本 bin 目录使用 USE_AP2 进行脱机还原和魔数恢复。bashcd /dmdata/xuboshi/opt/dmdbms/bin./dmrman USE_AP2 CTLSTMTRESTORE DATABASE /dmdata/xuboshi/afc_test/T02/DAMENG/dm.ini FROM BACKUPSET /dmdata/xuboshi/afc_test/T02/DAMENG/BACKUP_T01./dmrman USE_AP2 CTLSTMTRECOVER DATABASE /dmdata/xuboshi/afc_test/T02/DAMENG/dm.ini UPDATE DB_MAGICStep 5核心配置 dmarch.ini三节点分别独立写入**这是最核心的一步注意 ARCH_DEST_ID 必须对应对方的 RAFT_SELF_ID **以 **32号机器T02** 的配置为例其它节点只需修改 XMAL_IP、PORT、SELF_ID 和 VOTE_INTERVAL。iniXMAL_HB_INTERVAL 5RAFT_HB_INTERVAL 150RAFT_VOTE_INTERVAL 4000 # T01是3000, T03是5000XMAL_IP 10.36.25.32XMAL_PORT 11032RAFT_SELF_ID 2[ARCHIVE_RAFT1]ARCH_TYPE RAFTARCH_DEST T01ARCH_DEST_IP 10.36.25.31ARCH_DEST_PORT 11031ARCH_DEST_ID 1 # 必须匹配 T01 的 SELF_ID[ARCHIVE_RAFT2]ARCH_TYPE RAFTARCH_DEST T03ARCH_DEST_IP 10.36.25.33ARCH_DEST_PORT 11033ARCH_DEST_ID 3 # 必须匹配 T03 的 SELF_ID[ARCHIVE_LOCAL]ARCH_TYPE LOCALARCH_DEST /dmdata/xuboshi/afc_test/T02/DAMENG/archARCH_FILE_SIZE 64ARCH_SPACE_LIMIT 0Step 6启动三节点见证“自动选主”分别在 3 个 SSH 窗口中以 mount 模式启动 dmserver 进程。bashcd /dmdata/xuboshi/opt/dmdbms/bin./dmserver /dmdata/xuboshi/afc_test/T01/DAMENG/dm.ini mount三台机器启动后Raft 协议会在 5~10 秒内自动完成选举。使用 disql 验证bash./disql sysdba/Dameng123localhost:15231执行SELECT INSTANCE_NAME, RAFT_STAT, SYS_MODE, SYS_STATUS FROM V$GLOBAL_RAFT_INFO;看到 RAFT_STAT 分别为 LEADER 和 FOLLOWER且状态均为 OPEN说明**集群搭建成功**。五、 高可用与强一致测试验证1. 强一致性读写测试在 LEADER 上执行sqlCREATE TABLE test_afc (id int, name varchar(20));INSERT INTO test_afc VALUES (1, dm_afc_test);COMMIT;在 FOLLOWER备库上执行 SELECT * FROM test_afc;不需要任何同步命令**备库能立刻查询到这条数据**证明 Raft 强同步机制生效。2.高可用自动切换测试在 LEADER 节点的 dmserver 前台窗口按下 **Ctrl C** 强制停掉主库等待约 5~10 秒。再次查询 V$GLOBAL_RAFT_INFO会发现**剩下的节点中有一台自动变为了 LEADER**之前建的表数据完好无损实现了“秒级自动故障转移”。3.备库只读限制尝试在 FOLLOWER 上执行 INSERT 语句会提示 备库上只允许执行只读操作符合预期。六、 总结与清理1.学习心得1**奇数副本是铁律**3、5、7、9决不能让节点数变成偶数。2**环境隔离是关键**在公共机器上运行达梦**绝对路径执行**和 **USE_AP2 脱机操作**是解决旧环境污染的神器。3**配置细节定生死**dmarch.ini 中的 ARCH_DEST_ID 必须和对方的 RAFT_SELF_ID 对齐漏掉它或者写错达梦就会抛出 archive_dest can not be self instance 的顽固报错。2.测试环境清除干净无痕由于测试过程没有注册任何系统服务、没有改动全局环境变量清除极其简单1在所有三个前台 dmserver 窗口按 Ctrl C 停掉服务。2执行 rm -rf /dmdata/xuboshi/afc_test 删除整个测试目录。本文原创于达梦技术社区https://eco.dameng.com/达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台达梦数据库产品体验站DM8在线试玩达梦数据库全系列产品免费下载官方权威的快速上手文档和产品手册最活跃的达梦技术社区面向全行业ISV厂商免费的云适配服务。https://eco.dameng.com/