本次实操在 3 台 Kylin V10 主机上部署 DEM V9.0.1,并将既有 AFC_CLUSTER 三节点接入监控。实施采用独立 DEMDB 存储库,DEM 管理端部署在 dem-node-1,三台主机分别运行 dmagent。最终完成主机、数据库、AFC 概述、实例、拓扑和会话页面验证,并用独立临时表制造可观察的监控曲线。
| 对象 | 主机/IP | 实际配置 |
|---|---|---|
| DEM 管理节点 | dem-node-1 / 192.0.2.11 |
DEM 目录 /dmdata/dem;Web 端口 32156;DEMDB 端口 5236 |
| AFC 节点 1 | dem-node-1 / 192.0.2.11 |
RAFT_01;数据库端口 1570;最终角色 LEADER |
| AFC 节点 2 | dem-node-2 / 192.0.2.12 |
RAFT_02;数据库端口 1571;最终角色 FOLLOWER |
| AFC 节点 3 | dem-node-3 / 192.0.2.13 |
RAFT_03;数据库端口 1572;最终角色 FOLLOWER |
| 操作系统 | 三节点 | Kylin Linux Advanced Server V10(Halberd),x86_64 |
| DM 软件 | 三节点 | /home/dmdba/dmdbms;构建号 03134284604-20260707-335949-20228 |
| dmagent | 三节点 | /dmdata/dmagent;Agent-V9.0.1.51914-2026.07.02-DEV |
本次没有复用现有 AFC 业务实例。DEM 的元数据和监控数据写入独立 DEMDB,目录为 /dmdata/dem_repo/DEMDB,端口为 5236。这里的“独立”是指实例、目录和端口与 AFC 业务实例分开,可以降低管理数据与业务数据混用造成的误操作风险。DEMDB 与 DEM Server 仍和 RAFT_01 同驻 dem-node-1,没有消除主机级资源竞争与单点耦合,因此不能把本次实验架构等同于生产高可用方案。
| 数据流 | 本次实际路径 |
|---|---|
| 浏览器访问 | Windows 浏览器 127.0.0.1:32157 → SSH 本地转发 → dem-node-1:32156 DEM Server |
| 管理数据 | DEM Server → DEMDB 127.0.0.1:5236 |
| 主机监控 | 受管主机 → 本机 dmagent → DEM Server → DEMDB |
| AFC 监控 | RAFT 三实例 → 各节点本机 dmagent → DEM Server → DEMDB |
官方原理:DEM 为 B/S 架构。DEM 服务器负责展示并把代理采集的数据写入存储库;dmagent 部署在受管主机上,采集主机和数据库信息并回传。[1]
安装包为 dem_setup_20260702_x86_linux_64_9.0.1.zip。先在 Windows 端计算 SHA-256,再在 Linux 端复核。两端结果一致:
d3f3b2930d2484be30271241988c09930227ade59e5e6d02860bcf6362853e80
执行用户:第 1 条在 Windows PowerShell 中执行;第 2 条在 Linux 安装介质所在节点执行。
Get-FileHash -Algorithm SHA256 -LiteralPath 'D:\dem_setup_20260702_x86_linux_64_9.0.1.zip'
sha256sum /dmdata/dem_install/dem_setup_20260702_x86_linux_64_9.0.1.zip
图 DEM-04:Linux 端 SHA-256 复核,两端结果一致
解压后确认 setup.sh、setup.pdf、官方 DEM.pdf、dmagent.pdf 和 dem.war 均存在。现有 AFC 数据目录保持不动;另外检查 5236 端口、/dmdata/dem_repo 目录和 /dmdata 磁盘空间,确保新存储库与业务实例隔离。
图 DEM-05:安装介质、安装脚本和官方文档结构
图 DEM-07:5236 端口、目标目录、既有 AFC 进程与磁盘检查
解压后的 setup.sh 没有执行位。现场只修复目标脚本,不对整个目录递归放宽权限。
执行用户:root。调整脚本属主和权限。
cd /dmdata/dem_install/dem_setup_20260702_x86_linux_64_9.0.1
chown dmdba:dinstall setup.sh
chmod 750 setup.sh
ls -l setup.sh
执行用户:root。创建目录并设置属主、权限。
mkdir -p /dmdata/dem_repo chown dmdba:dinstall /dmdata/dem_repo chmod 750 /dmdata/dem_repo
执行用户:dmdba。初始化 DEMDB。以下为隐藏输入值的公开复现写法。
read -rsp 'DEMDB SYSDBA password: ' DEMDB_SYSDBA_PASSWORD; echo
read -rsp 'DEMDB SYSAUDITOR password: ' DEMDB_SYSAUDITOR_PASSWORD; echo
/home/dmdba/dmdbms/bin/dminit \
PATH=/dmdata/dem_repo \
DB_NAME=DEMDB \
INSTANCE_NAME=DEMDB \
PORT_NUM=5236 \
SYSDBA_PWD="$DEMDB_SYSDBA_PASSWORD" \
SYSAUDITOR_PWD="$DEMDB_SYSAUDITOR_PASSWORD"
unset DEMDB_SYSDBA_PASSWORD DEMDB_SYSAUDITOR_PASSWORD
图 DEM-08:独立 DEMDB 初始化成功(原图口令已像素化)
执行用户:dmdba。备份、修改并核验本实例 dm.ini。
DM_INI=/dmdata/dem_repo/DEMDB/dm.ini
cp -p "$DM_INI" "${DM_INI}.before_dem_$(date +%Y%m%d_%H%M%S)"
sed -ri 's/^[[:space:]]*MEMORY_POOL[[:space:]]*=.*/MEMORY_POOL = 200/' "$DM_INI"
sed -ri 's/^[[:space:]]*BUFFER[[:space:]]*=.*/BUFFER = 1000/' "$DM_INI"
sed -ri 's/^[[:space:]]*SORT_BUF_SIZE[[:space:]]*=.*/SORT_BUF_SIZE = 50/' "$DM_INI"
grep -E '^[[:space:]]*(PORT_NUM|MEMORY_POOL|BUFFER|SORT_BUF_SIZE)[[:space:]]*=' "$DM_INI"
最终确认的 4 个参数如下。配置前已保留带时间戳的备份。
| 参数 | 最终值 | 作用说明 |
|---|---|---|
PORT_NUM |
5236 |
DEMDB 独立监听端口 |
MEMORY_POOL |
200 |
内存池大小,单位按 DM 参数定义 |
BUFFER |
1000 |
数据缓冲区配置 |
SORT_BUF_SIZE |
50 |
排序缓冲区配置 |
图 DEM-09:备份并调整 DEMDB 的 dm.ini 关键参数
执行用户:dmdba。启动 DEMDB,并通过 DIsql 验证。
nohup /home/dmdba/dmdbms/bin/dmserver \ /dmdata/dem_repo/DEMDB/dm.ini \ > /dmdata/dem_repo/DEMDB/dmserver_demdb.log 2>&1 &
read -rsp 'DEMDB SYSDBA password: ' DEMDB_SYSDBA_PASSWORD; echo
/home/dmdba/dmdbms/bin/disql \
"SYSDBA/${DEMDB_SYSDBA_PASSWORD}@127.0.0.1:5236" <<'SQL'
SELECT NAME, INSTANCE_NAME, HOST_NAME, STATUS$, MODE$
FROM V$INSTANCE;
SELECT PARA_NAME, PARA_VALUE, FILE_VALUE
FROM V$DM_INI
WHERE PARA_NAME IN ('PORT_NUM','MEMORY_POOL','BUFFER','SORT_BUF_SIZE')
ORDER BY PARA_NAME;
EXIT;
SQL
unset DEMDB_SYSDBA_PASSWORD
图 DEM-10:DEMDB 处于 OPEN/NORMAL,端口与参数核验通过
执行用户:dmdba。运行一体化安装器。
cd /dmdata/dem_install/dem_setup_20260702_x86_linux_64_9.0.1
./setup.sh --cli
| 安装项 | 本次实际值 |
|---|---|
| 安装目录 | /dmdata/dem |
| DEM Web 端口 | 32156 |
| 进程管理 | 手动启动 |
| 存储库地址 | 127.0.0.1:5236 |
| 自定义 JDBC URL | jdbc:dm://127.0.0.1:5236 |
| 安装前检查 | 首次 6/7;补全 JDBC URL 后 7/7 |
图 DEM-12:安装前检查 7/7 通过及配置摘要
图 DEM-13:DEM 安装完成,显示目录、端口和数据库连接摘要
执行用户:dmdba。启动 DEM Server 并检查端口、HTTP 状态。
unset JRE_HOME
/dmdata/dem/bin/start.sh
ss -lntp | grep ':32156'
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:32156/
图 DEM-14A:start.sh 使用 32156 端口并启动 Tomcat
图 DEM-14B:32156 端口处于 LISTEN
Windows 客户端不能直接路由到 192.0.2.11:32156。现场通过 192.0.2.11:12001 建立本地转发,浏览器访问本机 32157。
执行用户:Windows 当前登录用户。在 PowerShell 中保持 SSH 隧道会话运行。
ssh -N -o ExitOnForwardFailure=yes `
-L 127.0.0.1:32157:127.0.0.1:32156 `
-p 12001 root@192.0.2.11
首次转发被拒绝。服务端最终按最小范围启用本地转发,并完成备份、配置语法、服务状态和有效参数复核。
执行用户:root。修改跳板机的 /etc/ssh/sshd_config。目标配置行如下。
AllowTcpForwarding local
SSHD_CONFIG=/etc/ssh/sshd_config
cp -p "$SSHD_CONFIG" "${SSHD_CONFIG}.bak_$(date +%Y%m%d_%H%M%S)"
sed -ri 's/^[[:space:]]*AllowTcpForwarding[[:space:]]+.*/AllowTcpForwarding local/' "$SSHD_CONFIG"
sshd -t
systemctl reload sshd
systemctl is-active sshd
sshd -T | grep -Ei 'allowtcpforwarding|disableforwarding|permitopen|permitlisten'
图 DEM-15:通过本地转发访问 DEM V9.0.1 登录页
多次试错后,admin 账号失败次数达到阈值。现场停止继续猜测,在备份账号记录后,按当前版本的实际密码处理机制受控恢复,随后成功登录。
风险边界:恢复过程涉及 DEM 内部表和版本相关实现,不作为公共操作步骤。生产环境应优先使用受支持的密码重置流程或联系达梦技术支持。
图 DEM-16:成功登录后的“开发”功能入口页
现场最终没有继续使用解压异常的临时 ZIP,而是从各节点现有 DM 安装目录 /home/dmdba/dmdbms/tool/dmagent 复制到 /dmdata/dmagent。
现场先确认并删除此前失败解压留下的 /dmdata/dmagent 临时目录,再复制同版本目录。以下是对该动作整理后的安全等价写法,可避免目标已存在时形成 /dmdata/dmagent/dmagent 嵌套目录。
执行用户:root。只在确认 /dmdata/dmagent 是本次失败解压形成的临时目录后删除。
AGENT_SRC=/home/dmdba/dmdbms/tool/dmagent
AGENT_DST=/dmdata/dmagent
test "$(readlink -f "$AGENT_DST")" = "/dmdata/dmagent" || exit 1
ls -ld "$AGENT_DST"
# 人工确认该目录仅为本次失败解压留下的临时 agent 目录后再执行:
rm -rf -- "$AGENT_DST"
cp -a "$AGENT_SRC" "$AGENT_DST"
ls -ld "$AGENT_DST"
图 DEM-17(准备):DM 安装目录中的 dmagent 完整文件
执行用户:root。备份、修改并核验三台主机各自的 agent.ini。
AGENT_INI=/dmdata/dmagent/agent.ini
cp -p "$AGENT_INI" "${AGENT_INI}.before_dem_$(date +%Y%m%d_%H%M%S)"
sed -ri 's#^[[:space:]]*center_url[[:space:]]*=.*#center_url = http://192.0.2.11:32156#' "$AGENT_INI"
sed -ri 's/^[[:space:]]*service_enable[[:space:]]*=.*/service_enable = true/' "$AGENT_INI"
sed -ri 's/^[[:space:]]*gather_enable[[:space:]]*=.*/gather_enable = true/' "$AGENT_INI"
awk -F= '/^[[:space:]]*(center_url|service_enable|gather_enable)[[:space:]]*=/{print $0}' "$AGENT_INI"
图 DEM-17A:复制 dmagent 并核对 agent.ini 核心配置
执行用户:root。以隐藏输入方式传入 service key,再启动 dmagent。
cd /dmdata/dmagent
read -rsp 'DEM service key: ' DEM_SERVICE_KEY; echo
./start.sh INSTALL_SERVICE_KEY "$DEM_SERVICE_KEY"
unset DEM_SERVICE_KEY
./start.sh /dmdata/dmagent/agent.ini
成功日志包含 Agent-V9.0.1.51914-2026.07.02-DEV 和“System is ready.”。
dem-node-1 使用 /dmdata/dem/jdk/bin/java;dem-node-2 和 dem-node-3 使用 /home/dmdba/dmdbms/jdk/bin/java。没有直接修改全局 Java,而是为 dmagent 启动脚本设置可用的绝对路径。
执行用户:root。逐节点发现可用 Java,备份并调整启动脚本,然后核验语法和进程。
cd /dmdata/dmagent
cp -p start.sh start.sh.bak_java
JAVA_BIN=$(for p in /usr/bin/java /usr/local/bin/java /home/dmdba/dmdbms/jdk/bin/java /home/dmdba/dmdbms/jdk/jre/bin/java /usr/lib/jvm/*/bin/java; do [ -x "$p" ] && readlink -f "$p" && break; done)
test -n "$JAVA_BIN" || { echo 'Java not found'; exit 1; }
sed -i "/^[[:space:]]*JAVA_EXE_FULL_PATH[[:space:]]*=[[:space:]]*\"\"/a\\JAVA_EXE_FULL_PATH=\"$JAVA_BIN\"" start.sh
bash -n start.sh
"$JAVA_BIN" -version
ps -ef | grep '[D]agent.home=/dmdata/dmagent'
ps -ef | grep '[j]ava' | grep '/dmdata/dmagent'
图 DEM-18:dem-node-1 首台主机正常接入
图 DEM-19:dem-node-1、dem-node-2、dem-node-3 均已在线、连接正常
3 个 dmagent 在线后,数据库实例页面的主机下拉框仍为空。主机详情显示“内外网未配置”。本次两类通信均按规划使用同一可达管理地址,因此把各节点内网 IP 与外网 IP 都设置为对应管理 IP。
| 主机 | 内网 IP | 外网 IP |
|---|---|---|
| dem-node-1 | 192.0.2.11 |
192.0.2.11 |
| dem-node-2 | 192.0.2.12 |
192.0.2.12 |
| dem-node-3 | 192.0.2.13 |
192.0.2.13 |
图 DEM-19B:三台主机的网络配置入口
官方依据:内网 IP 用于 agent 连接数据库及集群内部通信,外网 IP 用于 DEM 中心与 agent 通信。只有当两类通信确实共用同一可达地址时才可填写同一值;多网段环境应按真实网络规划填写。[1]
本次 AFC 页面明确提示“AFC 暂不支持扫描实例添加”,因此最终选择“创建实例添加”,逐个录入 3 个节点。这只是本次 V9.0.1 环境的实际界面结果,不扩大为所有版本的产品结论。
| 实例 | 地址 | 站点类型 | 生命周期策略 |
|---|---|---|---|
RAFT_01 |
192.0.2.11:1570 |
DB |
关闭自动启动 |
RAFT_02 |
192.0.2.12:1571 |
DB |
关闭自动启动 |
RAFT_03 |
192.0.2.13:1572 |
DB |
关闭自动启动 |
三节点 DPC_MODE 均为 0;据此把站点类型校正为 DB,用户随后确认处理完成。上传文档未单独保存校正后的站点类型截图,早期把 RAFT_01 误设为 BP 的过渡截图已排除。AFC 的 Leader/Follower 角色不能直接映射为 DPC 的 BP/DB 类型。
自动启动保持关闭,服务名和启动命令留空。DEM 只负责监控,不接管既有 AFC 的启停。
图 DEM-20(前置):数据库监控的集群添加入口
图 DEM-20:AFC_CLUSTER 三节点纳管成功
SELECT STATE, LEADER
FROM V$RLOG_RAFT_INFO;
数据库侧确认 RAFT_01 为 LEADER,RAFT_02 和 RAFT_03 为 FOLLOWER。按达梦官方对 RAFT 角色的一般说明,通常存在 1 个 Leader,其余节点处于 Follower;Candidate 是选举过程中的临时角色。[4]
图 DEM-21:AFC 概述显示 RAFT VALID=Y、LEADER=1、FOLLOWER=2
判断边界:RAFT VALID=Y 是本次页面实测值。结合三实例正常、拓扑与会话采集成功,可确认本次监控接入有效;不能仅凭该字段扩展为完整健康认证。
为了观察备库重演、主备时延、事务、磁盘和网络曲线,在 RAFT_01 上创建独立临时表。测试使用独立、可清理的数据对象,没有停库、切换角色、修改 AFC 参数或制造真实故障。
执行用户:dmdba。在 RAFT_01 上执行临时负载。以下循环 90 轮,每轮结束后休眠 1 秒,总耗时会略大于 90 秒。
CREATE TABLE DEM_AFC_CURVE_TEST
(
ID BIGINT,
PAYLOAD VARCHAR(3000),
TS TIMESTAMP
);
read -rsp 'AFC SYSDBA password: ' AFC_SYSDBA_PASSWORD; echo
for i in $(seq 1 90)
do
/home/dmdba/dmdbms/bin/disql \
"SYSDBA/${AFC_SYSDBA_PASSWORD}@192.0.2.11:1570" \
>/dev/null 2>&1 <<'SQL'
BEGIN
FOR j IN 1..200 LOOP
INSERT INTO DEM_AFC_CURVE_TEST
VALUES (j, RPAD('A',3000,'A'), SYSDATE);
END LOOP;
COMMIT;
DELETE FROM DEM_AFC_CURVE_TEST;
COMMIT;
END;
/
EXIT;
SQL
sleep 1
done
unset AFC_SYSDBA_PASSWORD
图 DEM-23:事务、磁盘写和网络等资源曲线出现明显波动
本次实验环境中的三节点追平较快,因此时延和积压接近 0 并不矛盾。验证目标是确认采集链路和曲线响应,而不是人为制造长时间积压。
图 DEM-24:AFC 实例页显示三实例状态与主备角色
图 DEM-25:AFC 三节点拓扑关系
图 DEM-26A:数据库侧查询 RAFT 角色与会话数
图 DEM-26:三节点会话页显示 ACTIVE/IDLE 与 dmagent 采集 SQL
32156 监听,根路径 HTTP 状态为 200。[1] DMDEM 达梦企业管理系统使用手册。达梦官方在线手册,访问日期:2026 年 8 月 25 日。用于架构、dmagent、网络信息、数据库监控和 AFC 大盘说明。
[2] DMDEM 版本说明。达梦官方页面。V9.0.1 发版时间为 2026 年 5 月,并记录首页、时序图、实例页和拓扑图等更新。
[3] DMDEM 常见问题。达梦官方 FAQ。用于 Java 路径和 service key 的通用依据。
[4] 监视器。达梦官方文档。仅用于解释 Leader、Follower、Candidate 的一般 RAFT 角色含义。
达梦社区地址:https://eco.dameng.com
文章
阅读量
获赞
