本文记录了在单台CentOS 7虚拟机上,使用四块裸设备部署达梦DM8两节点DSC(Data Sharing Cluster)集群的完整过程,包括部署、数据同步验证、故障切换测试,以及搭建过程中遇到的各种故障和解决方案。
DSC(Data Sharing Cluster)是达梦数据库的共享存储集群方案,其核心特点是:
| 对比维度 | 读写分离集群 | DSC集群 |
|---|---|---|
| 数据存储 | 主库和备库各有一份完整数据 | 所有节点共用一份数据(共享存储) |
| 节点角色 | 主库可读写,备库只读 | 所有节点平等,均可读写 |
| 故障切换 | 主库故障需切换备库角色 | 其他节点自动接管,业务无感知 |
| 硬件要求 | 无需共享存储 | 必须配置共享存储(SAN/NAS/虚拟共享磁盘) |
| 组件 | 作用 |
|---|---|
| DMCSS | 集群控制服务,监控各节点状态,处理故障 |
| DMASM | 自动存储管理,管理共享磁盘组 |
| dmserver | 数据库实例服务,每个节点一个 |
| dmasmcmd / dmasmtool | ASM管理工具,初始化磁盘、创建磁盘组 |
| DCR / Vote磁盘 | 存储集群配置和仲裁信息 |
| 项目 | 配置 |
|---|---|
| 操作系统 | CentOS 7 |
| 达梦版本 | DM8 V8 |
| 安装目录 | /home/dmdba/dmdbms |
| 用户/组 | dmdba:dinstall |
DSC集群需要至少4块裸设备,本次环境通过NAS挂载分配:
| 设备 | 大小 | 用途 |
|---|---|---|
| /dev/vdb | 500M | DCR磁盘:存储集群配置元数据 |
| /dev/vdc | 500M | Vote磁盘:用于集群节点仲裁 |
| /dev/vdd | 20G | 数据磁盘:存储数据库数据文件 |
| /dev/vde | 50G | 日志磁盘:存储联机Redo日志 |
| 节点 | 实例名 | 数据库端口 | CSS端口 | ASM端口 | ASM MAL端口 |
|---|---|---|---|---|---|
| 节点0 | DSC0 | 5238 | 11286 | 11276 | 11266 |
| 节点1 | DSC1 | 5239 | 11287 | 11277 | 11267 |
使用 5238/5239 而非 5236/5237,避免与之前的读写分离集群冲突。
su - dmdba mkdir -p /home/dmdba/DSC mkdir -p /home/dmdba/DSC/DSC0 mkdir -p /home/dmdba/DSC/DSC1
这是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搜索磁盘的路径,而非具体设备。
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)
节点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
使用 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:disk,dmdba不在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。
需要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已在后台正常运行。
使用 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 交互界面中执行)。
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两个管理员账户的密码。
需要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 保持运行。
节点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')。
Ctrl+C 停止节点0的dmserver。INSERT INTO TEST_DSC VALUES (2, 'AFTER_FAILOVER');
COMMIT;
SELECT * FROM TEST_DSC;
操作成功,证明集群在单节点故障后仍能持续服务。
运行结果如图所示:
包括节点0插入和查询,节点1查询,停止节点0的dmserver后节点1的插入查询结果,均正常
[code: -4546], File open failure/dev/vdb 属主为 root:disk,dmdba 不在 disk 组中。sudo usermod -aG disk dmdba,重新登录 dmdba。syntax errorinit dcrdisk '/dev/vdb' from '/path/to/dmdcr_cfg.ini' identified by '密码'[code: -2504] Password length invalid 或 [code: -2502] Password not accord with complexity ruleDCRpsd_123 或类似格式的密码。[FATAL] Load dcr disk or vote disk in [/dev/vdd] failedDCR_EP_ASM_LOAD_PATH 被错误地设置为设备文件而非目录。DCR_EP_ASM_LOAD_PATH 改为 /dev 目录。[code : -11041] ASM connection exceptionps -ef | grep dmasmsvr 检查进程,ss -tunlp | grep 11266 检查端口。tail -100 /home/dmdba/dmdbms/log/dm_ASM0_202607.log | grep FATAL,修正配置后重新启动。[code : -11040] Invalid disk sizecreate asmdisk 指定大小创建,再用 dmasmtool 创建磁盘组。please set [SYSDBA_PWD] and [SYSAUDITOR_PWD] values.dminit.ini 中缺少 SYSAUDITOR_PWD 参数。dminit.ini 中添加 SYSAUDITOR_PWD = Admin2026。kex_exchange_identification: read: Connection reset by peerfree -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集群的搭建过程:
dmdcr_cfg.ini、dmasvrmal.ini、dmdcr.ini,初始化DCR/Vote磁盘,启动DMCSS和ASM,创建磁盘组,初始化数据库,启动dmserver。文章
阅读量
获赞
