注册
达梦DM8两节点DSC集群搭建完整实战
专栏/技术分享/ 文章详情 /

达梦DM8两节点DSC集群搭建完整实战

何处惹尘埃 2026/07/17 327 3 0
摘要

达梦DM8两节点DSC集群搭建完整实战

本文记录了在单台CentOS 7虚拟机上,使用四块裸设备部署达梦DM8两节点DSC(Data Sharing Cluster)集群的完整过程,包括部署、数据同步验证、故障切换测试,以及搭建过程中遇到的各种故障和解决方案。

一、DSC集群概述

1.1 什么是DSC集群?

DSC(Data Sharing Cluster)是达梦数据库的共享存储集群方案,其核心特点是:

  • 一份数据,多个实例:所有节点共享同一份数据文件(存放在共享存储上),每个节点运行独立的数据库实例。
  • 对等架构:所有节点均为主库(Primary),均可执行读写操作,不存在"主备"之分。
  • 高可用 + 高性能:单节点故障时,其他节点自动接管服务;同时可通过增加节点提升系统吞吐量。

1.2 DSC vs 读写分离集群

对比维度 读写分离集群 DSC集群
数据存储 主库和备库各有一份完整数据 所有节点共用一份数据(共享存储)
节点角色 主库可读写,备库只读 所有节点平等,均可读写
故障切换 主库故障需切换备库角色 其他节点自动接管,业务无感知
硬件要求 无需共享存储 必须配置共享存储(SAN/NAS/虚拟共享磁盘)

1.3 核心组件

组件 作用
DMCSS 集群控制服务,监控各节点状态,处理故障
DMASM 自动存储管理,管理共享磁盘组
dmserver 数据库实例服务,每个节点一个
dmasmcmd / dmasmtool ASM管理工具,初始化磁盘、创建磁盘组
DCR / Vote磁盘 存储集群配置和仲裁信息

二、环境准备

2.1 硬件与软件环境

项目 配置
操作系统 CentOS 7
达梦版本 DM8 V8
安装目录 /home/dmdba/dmdbms
用户/组 dmdba:dinstall

2.2 裸设备规划

DSC集群需要至少4块裸设备,本次环境通过NAS挂载分配:

设备 大小 用途
/dev/vdb 500M DCR磁盘:存储集群配置元数据
/dev/vdc 500M Vote磁盘:用于集群节点仲裁
/dev/vdd 20G 数据磁盘:存储数据库数据文件
/dev/vde 50G 日志磁盘:存储联机Redo日志

2.3 端口规划(单机双节点)

节点 实例名 数据库端口 CSS端口 ASM端口 ASM MAL端口
节点0 DSC0 5238 11286 11276 11266
节点1 DSC1 5239 11287 11277 11267

使用 5238/5239 而非 5236/5237,避免与之前的读写分离集群冲突。

三、完整部署步骤(含故障提醒)

3.1 创建配置文件目录

su - dmdba mkdir -p /home/dmdba/DSC mkdir -p /home/dmdba/DSC/DSC0 mkdir -p /home/dmdba/DSC/DSC1

3.2 创建 dmdcr_cfg.ini

这是DSC集群的核心配置文件,定义了三类组(CSS、ASM、DB)及其节点信息。

cat > /home/dmdba/DSC/dmdcr_cfg.ini << 'EOF' DCR_N_GRP = 3 DCR_VTD_PATH = /dev/vdc DCR_OGUID = 210715 [GRP] DCR_GRP_TYPE = CSS DCR_GRP_NAME = GRP_CSS DCR_GRP_N_EP = 2 DCR_GRP_DSKCHK_CNT = 65 [GRP_CSS] DCR_EP_NAME = CSS0 DCR_EP_HOST = 192.168.200.18 DCR_EP_PORT = 11286 [GRP_CSS] DCR_EP_NAME = CSS1 DCR_EP_HOST = 192.168.200.18 DCR_EP_PORT = 11287 [GRP] DCR_GRP_TYPE = ASM DCR_GRP_NAME = GRP_ASM DCR_GRP_N_EP = 2 DCR_GRP_DSKCHK_CNT = 61 [GRP_ASM] DCR_EP_NAME = ASM0 DCR_EP_SHM_KEY = 42424 DCR_EP_SHM_SIZE = 1024 DCR_EP_HOST = 192.168.200.18 DCR_EP_PORT = 11276 DCR_EP_ASM_LOAD_PATH = /dev [GRP_ASM] DCR_EP_NAME = ASM1 DCR_EP_SHM_KEY = 42425 DCR_EP_SHM_SIZE = 1024 DCR_EP_HOST = 192.168.200.18 DCR_EP_PORT = 11277 DCR_EP_ASM_LOAD_PATH = /dev [GRP] DCR_GRP_TYPE = DB DCR_GRP_NAME = GRP_DSC DCR_GRP_N_EP = 2 DCR_GRP_DSKCHK_CNT = 57 [GRP_DSC] DCR_EP_NAME = DSC0 DCR_EP_SEQNO = 0 DCR_EP_PORT = 5238 DCR_CHECK_PORT = 11256 [GRP_DSC] DCR_EP_NAME = DSC1 DCR_EP_SEQNO = 1 DCR_EP_PORT = 5239 DCR_CHECK_PORT = 11257 EOF

问题:DCR_EP_ASM_LOAD_PATH 应指向目录而非设备文件

  • 现象:ASM启动时出现 [FATAL] Load dcr disk or vote disk in [/dev/vdd] failed
  • 原因:该参数错误地设置为 /dev/vdd(设备),导致ASM误将其当作DCR磁盘读取。
  • 解决:改为 /dev 目录,ASM会扫描该目录下所有设备。
  • 根源:该参数定义的是ASM搜索磁盘的路径,而非具体设备。

3.3 创建 dmasvrmal.ini

MAL(Message Access Layer)是ASM节点间的通信配置文件,两个ASM节点使用相同内容。

cat > /home/dmdba/DSC/dmasvrmal.ini << 'EOF' [MAL_INST0] MAL_INST_NAME = ASM0 MAL_HOST = 192.168.200.18 MAL_PORT = 11266 [MAL_INST1] MAL_INST_NAME = ASM1 MAL_HOST = 192.168.200.18 MAL_PORT = 11267 EOF

问题:单机部署时两个ASM端口不能相同

  • 现象:ASM启动时提示端口已被占用
  • 原因:同一IP下,两个ASM节点的MAL_PORT配置相同
  • 解决:将节点1的MAL_PORT改为不同端口(如11267)

3.4 创建节点的 dmdcr.ini

节点0配置文件(dmdcr_DSC0.ini):

cat > /home/dmdba/DSC/dmdcr_DSC0.ini << 'EOF' DMDCR_PATH = /dev/vdb DMDCR_MAL_PATH = /home/dmdba/DSC/dmasvrmal.ini DMDCR_SEQNO = 0 DMDCR_ASM_RESTART_INTERVAL = 0 DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/dmdba/DSC/dmdcr_DSC0.ini DMDCR_DB_RESTART_INTERVAL = 0 DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver dcr_ini=/home/dmdba/DSC/dmdcr_DSC0.ini DMDCR_AUTO_OPEN_CHECK = 111 DMDCR_ASM_TRACE_LEVEL = 2 EOF

节点1配置文件(dmdcr_DSC1.ini):

cat > /home/dmdba/DSC/dmdcr_DSC1.ini << 'EOF' DMDCR_PATH = /dev/vdb DMDCR_MAL_PATH = /home/dmdba/DSC/dmasvrmal.ini DMDCR_SEQNO = 1 DMDCR_ASM_RESTART_INTERVAL = 0 DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/dmdba/DSC/dmdcr_DSC1.ini DMDCR_DB_RESTART_INTERVAL = 0 DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver dcr_ini=/home/dmdba/DSC/dmdcr_DSC1.ini DMDCR_AUTO_OPEN_CHECK = 111 DMDCR_ASM_TRACE_LEVEL = 2 EOF

3.5 初始化DCR和Vote磁盘

使用 dmasmcmd 工具初始化集群元数据磁盘。

cd /home/dmdba/dmdbms/bin ./dmasmcmd

交互界面中依次执行:

create dcrdisk /dev/vdb dcr
create votedisk /dev/vdc vote
init dcrdisk '/dev/vdb' from '/home/dmdba/DSC/dmdcr_cfg.ini' identified by 'DCRpsd_123'
init votedisk '/dev/vdc' from '/home/dmdba/DSC/dmdcr_cfg.ini'
exit

问题1:dmdba 用户无权限操作 /dev/vdb

  • 现象:[code: -4546], File open failure
  • 原因:/dev/vdb 属主为 root:diskdmdba 不在 disk 组中。
  • 解决:sudo usermod -aG disk dmdba,重新登录 dmdba。
  • 根源:CentOS 7中裸设备默认只允许 root 或 disk 组成员访问。

问题2:init dcrdisk 报语法错误

  • 现象:syntax error
  • 原因:路径或密码未用单引号括起来。
  • 解决:使用 init dcrdisk '/dev/vdb' from '/path/to/dmdcr_cfg.ini' identified by '密码'

问题3:密码复杂度不满足要求

  • 现象:[code: -2504] Password length invalid[code: -2502] Password not accord with complexity rule
  • 原因:达梦要求DCR初始化密码至少8位,包含大小写字母、数字和特殊字符。
  • 解决:使用符合要求的密码,如 DCRpsd_123

3.6 启动DMCSS和DMASM服务

需要4个终端,按顺序启动:

终端1:节点0 DMCSS

cd /home/dmdba/dmdbms/bin ./dmcss DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini

看到 DMCSS IS READY 保持运行。

终端2:节点0 ASM

cd /home/dmdba/dmdbms/bin ./dmasmsvr DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini

看到 the ASM server is Ready 保持运行。

终端3:节点1 DMCSS

cd /home/dmdba/dmdbms/bin ./dmcss DCR_INI=/home/dmdba/DSC/dmdcr_DSC1.ini

看到 DMCSS IS READY 保持运行。

终端4:节点1 ASM

cd /home/dmdba/dmdbms/bin ./dmasmsvr DCR_INI=/home/dmdba/DSC/dmdcr_DSC1.ini

看到 the ASM server is Ready 保持运行。

问题1:ASM启动后端口未监听

  • 现象:ASM显示 the ASM server is Ready,但 ss -tunlp 看不到对应端口。
  • 原因:ASM进程启动后立即崩溃退出(通常因DCR读取失败),终端输出尚未刷新。
  • 解决:查看ASM日志定位崩溃原因:tail -100 /home/dmdba/dmdbms/log/dm_ASM0_202607.log | grep FATAL,根据日志修正配置后重新启动。
  • 根源:ASM启动过程中遇到严重错误会执行 SYSTEM SHUTDOWN ABORT 强制退出。

问题2:dmasmtool 报 ASM connection exception

  • 现象:[code : -11041] ASM connection exception
  • 原因:ASM进程未正常启动或MAL端口未监听。
  • 排查:ps -ef | grep dmasmsvr 检查进程,ss -tunlp | grep 11266 检查端口。
  • 解决:确保ASM进程正常运行并监听对应端口。

问题3:终端2的ASM卡住无输出

  • 现象:ASM启动后只显示前几行,长时间无新输出。
  • 原因:进程还在运行但未返回控制台(通常不影响功能)。
  • 解决:另开终端执行 ss -tunlp | grep 11266 检查端口是否已监听,若端口已监听,则ASM已在后台正常运行。

3.7 创建ASM磁盘组

使用 dmasmcmd 创建ASM磁盘,再使用 dmasmtool 创建磁盘组。

创建ASM磁盘(指定大小):

cd /home/dmdba/dmdbms/bin ./dmasmcmd

交互界面中执行:

create asmdisk '/dev/vde' 'LOG0' 51200
create asmdisk '/dev/vdd' 'DATA0' 20480
exit

大小单位MB:50G = 51200MB,20G = 20480MB。

问题:create diskgroup 报 Invalid disk size

  • 现象:[code : -11040] Invalid disk size
  • 原因:ASM无法自动识别磁盘大小,需要先用 dmasmcmd 创建ASM磁盘并指定大小。
  • 解决:先用 create asmdisk 指定大小创建,再用 dmasmtool 创建磁盘组。

创建磁盘组:

./dmasmtool DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini

交互界面中执行:

create diskgroup 'DMLOG' asmdisk '/dev/vde'
create diskgroup 'DMDATA' asmdisk '/dev/vdd'

成功后用 lsdsk 验证(在 dmasmtool 交互界面中执行)。

3.8 创建 dminit.ini 并初始化数据库

cat > /home/dmdba/DSC/dminit.ini << 'EOF' DB_NAME = DSCDB SYSDBA_PWD = Admin2026 SYSAUDITOR_PWD = Admin2026 SYSTEM_PATH = +DMDATA/data SYSTEM = +DMDATA/data/SYSTEM.dbf SYSTEM_SIZE = 1024 ROLL = +DMDATA/data/ROLL.dbf ROLL_SIZE = 10000 MAIN = +DMDATA/data/MAIN.dbf MAIN_SIZE = 1024 CTL_PATH = +DMDATA/data/dm.ctl CTL_SIZE = 8 LOG_SIZE = 2048 DCR_PATH = /dev/vdb DCR_SEQNO = 0 AUTO_OVERWRITE = 2 PAGE_SIZE = 32 EXTENT_SIZE = 16 BLANK_PAD_MODE = 1 CHARSET = 1 [DSC0] CONFIG_PATH = /home/dmdba/DSC/DSC0 PORT_NUM = 5238 MAL_HOST = 192.168.200.18 MAL_PORT = 8344 LOG_PATH = +DMLOG/DSC0_LOG01.log LOG_PATH = +DMLOG/DSC0_LOG02.log [DSC1] CONFIG_PATH = /home/dmdba/DSC/DSC1 PORT_NUM = 5239 MAL_HOST = 192.168.200.18 MAL_PORT = 8346 LOG_PATH = +DMLOG/DSC1_LOG01.log LOG_PATH = +DMLOG/DSC1_LOG02.log EOF

执行初始化:

cd /home/dmdba/dmdbms/bin ./dminit control=/home/dmdba/DSC/dminit.ini

看到 create dm database success 表示成功。

问题:dminit 报密码未设置

  • 现象:please set [SYSDBA_PWD] and [SYSAUDITOR_PWD] values.
  • 原因:dminit.ini 中缺少 SYSAUDITOR_PWD 参数。
  • 解决:在 dminit.ini 中添加 SYSAUDITOR_PWD = Admin2026
  • 根源:达梦要求同时设置SYSDBA和SYSAUDITOR两个管理员账户的密码。

3.9 启动数据库服务

需要2个新终端:

终端5:节点0 dmserver

cd /home/dmdba/dmdbms/bin ./dmserver /home/dmdba/DSC/DSC0/dm.ini dcr_ini=/home/dmdba/DSC/dmdcr_DSC0.ini

看到 SYSTEM IS READY 保持运行。

终端6:节点1 dmserver

cd /home/dmdba/dmdbms/bin ./dmserver /home/dmdba/DSC/DSC1/dm.ini dcr_ini=/home/dmdba/DSC/dmdcr_DSC1.ini

看到 SYSTEM IS READY 保持运行。

3.10 验证数据同步

节点0创建表并插入数据:

cd /home/dmdba/dmdbms/bin ./disql SYSDBA/Admin2026@localhost:5238

执行:

CREATE TABLE TEST_DSC (ID INT, NAME VARCHAR(50)); INSERT INTO TEST_DSC VALUES (1, 'DSC_INSERT'); COMMIT; SELECT * FROM TEST_DSC;

节点1查询验证:

cd /home/dmdba/dmdbms/bin ./disql SYSDBA/Admin2026@localhost:5239

执行:

SELECT * FROM TEST_DSC;

应该看到 (1, 'DSC_INSERT')

3.11 测试故障切换

  1. 在终端5按 Ctrl+C 停止节点0的dmserver。
  2. 在节点1(5239)执行:
INSERT INTO TEST_DSC VALUES (2, 'AFTER_FAILOVER'); COMMIT; SELECT * FROM TEST_DSC;

操作成功,证明集群在单节点故障后仍能持续服务。

运行结果如图所示:
包括节点0插入和查询,节点1查询,停止节点0的dmserver后节点1的插入查询结果,均正常
截屏20260715 11.59.43.png

截屏20260715 11.45.30.png

四、故障排查记录汇总

故障1:dmdba 用户无权限操作块设备

  • 现象[code: -4546], File open failure
  • 原因/dev/vdb 属主为 root:diskdmdba 不在 disk 组中。
  • 解决sudo usermod -aG disk dmdba,重新登录 dmdba。
  • 根源:CentOS 7中裸设备默认只允许 root 或 disk 组成员访问。

故障2:init dcrdisk 报语法错误

  • 现象syntax error
  • 原因:路径或密码未用单引号括起来。
  • 解决:使用 init dcrdisk '/dev/vdb' from '/path/to/dmdcr_cfg.ini' identified by '密码'

故障3:密码复杂度不满足要求

  • 现象[code: -2504] Password length invalid[code: -2502] Password not accord with complexity rule
  • 原因:达梦要求密码至少8位,包含大小写字母、数字和特殊字符。
  • 解决:使用 DCRpsd_123 或类似格式的密码。

故障4:ASM启动时报 Load dcr disk or vote disk failed

  • 现象[FATAL] Load dcr disk or vote disk in [/dev/vdd] failed
  • 原因DCR_EP_ASM_LOAD_PATH 被错误地设置为设备文件而非目录。
  • 解决:将 DCR_EP_ASM_LOAD_PATH 改为 /dev 目录。

故障5:dmasmtool 报 ASM connection exception

  • 现象[code : -11041] ASM connection exception
  • 原因:ASM进程未正常启动或MAL端口未监听。
  • 排查ps -ef | grep dmasmsvr 检查进程,ss -tunlp | grep 11266 检查端口。

故障6:ASM启动后端口未监听

  • 现象:ASM显示 Ready 但端口未监听。
  • 原因:ASM进程启动后立即崩溃退出。
  • 解决:查看日志 tail -100 /home/dmdba/dmdbms/log/dm_ASM0_202607.log | grep FATAL,修正配置后重新启动。

故障7:单机部署时端口冲突

  • 现象:ASM启动时报端口已被占用。
  • 原因:两个节点的MAL_PORT配置相同。
  • 解决:节点1的MAL_PORT改为不同端口(如11267)。

故障8:create diskgroup 报 Invalid disk size

  • 现象[code : -11040] Invalid disk size
  • 原因:ASM无法自动识别磁盘大小。
  • 解决:先用 create asmdisk 指定大小创建,再用 dmasmtool 创建磁盘组。

故障9:dminit 报密码未设置

  • 现象please set [SYSDBA_PWD] and [SYSAUDITOR_PWD] values.
  • 原因dminit.ini 中缺少 SYSAUDITOR_PWD 参数。
  • 解决:在 dminit.ini 中添加 SYSAUDITOR_PWD = Admin2026

故障10:SSH连接被重置

  • 现象kex_exchange_identification: read: Connection reset by peer
  • 原因:虚拟机资源不足导致SSH服务无响应。
  • 排查free -h 检查内存,uptime 检查负载,systemctl status sshd 检查SSH服务。
  • 解决:等待资源释放或重启虚拟机。

五、启停顺序总结

启动顺序

顺序 操作 命令
1 节点0 DMCSS ./dmcss DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini
2 节点0 ASM ./dmasmsvr DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini
3 节点1 DMCSS ./dmcss DCR_INI=/home/dmdba/DSC/dmdcr_DSC1.ini
4 节点1 ASM ./dmasmsvr DCR_INI=/home/dmdba/DSC/dmdcr_DSC1.ini
5 节点0 dmserver ./dmserver /home/dmdba/DSC/DSC0/dm.ini dcr_ini=/home/dmdba/DSC/dmdcr_DSC0.ini
6 节点1 dmserver ./dmserver /home/dmdba/DSC/DSC1/dm.ini dcr_ini=/home/dmdba/DSC/dmdcr_DSC1.ini

停止顺序(反向)

顺序 操作
1 停止节点0 dmserver → 节点1 dmserver
2 停止节点0 ASM → 节点1 ASM
3 停止节点0 DMCSS → 节点1 DMCSS

六、总结

本文完整记录了达梦DM8两节点DSC集群的搭建过程:

  1. 部署集群:配置 dmdcr_cfg.inidmasvrmal.inidmdcr.ini,初始化DCR/Vote磁盘,启动DMCSS和ASM,创建磁盘组,初始化数据库,启动dmserver。
  2. 验证同步:在两个节点上分别执行建表、插入、查询,确认数据实时同步。
  3. 故障切换:停止一个节点的dmserver,另一节点继续提供读写服务。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服