三节点AFC集群搭建操作指南
一、 前言:什么是 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)**:数据库端口 `15231`,XMAL 通信端口 `11031`,选举优先(RAFT_VOTE_INTERVAL=3000)。
**32 号机器 (T02)**:数据库端口 `15232`,XMAL 通信端口 `11032`,选举次优先(RAFT_VOTE_INTERVAL=4000)。
**33 号机器 (T03)**:数据库端口 `15233`,XMAL 通信端口 `11033`,选举延迟(RAFT_VOTE_INTERVAL=5000)。
*数据目录统一规划为:`/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_AP=2` 参数,意为“**使用自身进程执行,完全不依赖外部的 dmap 进程**”。加入此参数后,无论系统里有多少其他进程,都不会再干扰。
四、 AFC 三副本集群搭建实操(实操版)
Step 1:三节点数据库初始化
在 31、32、33 三台机器分别执行 `dminit` 初始化。这里设置 `LOG_SIZE=256`(联机日志 256MB)减小体积。
```bash
# 以 31 号机器为例
/dmdata/xuboshi/opt/dmdbms/bin/dminit PATH=/dmdata/xuboshi/afc_test/T01 PORT_NUM=15231 INSTANCE_NAME=T01 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123 LOG_SIZE=256
```
Step 2:配置 dm.ini 开启归档并限制资源
在三台机器 `DAMENG/dm.ini` 末尾追加或修改:
```ini
ARCH_INI = 1
ALTER_MODE_STATUS = 0
BUFFER = 50
MAX_BUFFER = 100
```
Step 3:31 号节点备份与分发
进入新版 `bin` 目录,脱机备份 T01,然后通过 `scp` 把备份推送给 T02 和 T03。
```bash
cd /dmdata/xuboshi/opt/dmdbms/bin
./dmrman USE_AP=2 CTLSTMT="BACKUP 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 dmdba@10.36.25.32:/dmdata/xuboshi/afc_test/T02/DAMENG/
scp -r /dmdata/xuboshi/afc_test/T01/DAMENG/BACKUP_T01 dmdba@10.36.25.33:/dmdata/xuboshi/afc_test/T03/DAMENG/
```
Step 4:32、33 节点还原(巧妙使用 `USE_AP=2` 避开干扰)
在 32、33 机器上,同样切到新版本 `bin` 目录,使用 `USE_AP=2` 进行脱机还原和魔数恢复。
```bash
cd /dmdata/xuboshi/opt/dmdbms/bin
./dmrman USE_AP=2 CTLSTMT="RESTORE DATABASE '/dmdata/xuboshi/afc_test/T02/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/xuboshi/afc_test/T02/DAMENG/BACKUP_T01'"
./dmrman USE_AP=2 CTLSTMT="RECOVER DATABASE '/dmdata/xuboshi/afc_test/T02/DAMENG/dm.ini' UPDATE DB_MAGIC"
```
Step 5:核心配置 `dmarch.ini`(三节点分别独立写入)
**这是最核心的一步,注意 `ARCH_DEST_ID` 必须对应对方的 `RAFT_SELF_ID` !**
以 **32号机器(T02)** 的配置为例,其它节点只需修改 `XMAL_IP`、`PORT`、`SELF_ID` 和 `VOTE_INTERVAL`。
```ini
XMAL_HB_INTERVAL = 5
RAFT_HB_INTERVAL = 150
RAFT_VOTE_INTERVAL = 4000 # T01是3000, T03是5000
XMAL_IP = 10.36.25.32
XMAL_PORT = 11032
RAFT_SELF_ID = 2
[ARCHIVE_RAFT1]
ARCH_TYPE = RAFT
ARCH_DEST = T01
ARCH_DEST_IP = 10.36.25.31
ARCH_DEST_PORT = 11031
ARCH_DEST_ID = 1 # 必须匹配 T01 的 SELF_ID
[ARCHIVE_RAFT2]
ARCH_TYPE = RAFT
ARCH_DEST = T03
ARCH_DEST_IP = 10.36.25.33
ARCH_DEST_PORT = 11033
ARCH_DEST_ID = 3 # 必须匹配 T03 的 SELF_ID
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/xuboshi/afc_test/T02/DAMENG/arch
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
```
Step 6:启动三节点见证“自动选主”
分别在 3 个 SSH 窗口中,以 `mount` 模式启动 `dmserver` 进程。
```bash
cd /dmdata/xuboshi/opt/dmdbms/bin
./dmserver /dmdata/xuboshi/afc_test/T01/DAMENG/dm.ini mount
```
三台机器启动后,Raft 协议会在 5~10 秒内自动完成选举。使用 `disql` 验证:
```bash
./disql sysdba/Dameng123@localhost:15231
```
执行:`SELECT INSTANCE_NAME, RAFT_STAT, SYS_MODE, SYS_STATUS FROM V$GLOBAL_RAFT_INFO;`
看到 `RAFT_STAT` 分别为 `LEADER` 和 `FOLLOWER`,且状态均为 `OPEN`,说明**集群搭建成功**。

五、 高可用与强一致测试验证
1. 强一致性读写测试
在 `LEADER` 上执行:
```sql
CREATE 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_AP=2` 脱机操作**是解决旧环境污染的神器。
(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/
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)