基于 VMware + CentOS7 搭建达梦 DMDSC 双机共享存储集群
本文记录了基于VMware+CentOS7在windows笔记本上搭建达梦DMDSC共享存储集群的全流程,并附上注释,便于读者理解与复现。本文中IP、密码等敏感信息已用
[内容]代替,请仔细阅读。
一、环境准备
1.1 系统与软件版本
- 虚拟机操作系统:CentOS-7-x86_64-Minimal-2207-02
- 数据库版本:dm8_20250506_x86_rh7_64
- 虚拟化平台:VMware Workstation 17 pro (17.6.4 build-24832109)
1.2 创建虚拟机
创建两台虚拟机:
dsc1:[DSC1_IP]dsc2:[DSC2_IP]可以配置完dsc1后克隆dsc2
在配置过程中完成关键节点记得拍快照
💡提示:推荐创建SCSI类型磁盘,如下图。


二、磁盘规划
| 裸设备名 | 容量 | 用途 | 对应共享磁盘文件 |
|---|---|---|---|
| /dev/sdb | 10G | 数据磁盘(/dev/asmdata0) | share-data0.vmdk |
| /dev/sdc | 5G | DCR 磁盘(/dev/asmdcr) | share-dcr.vmdk |
| /dev/sdd | 5G | Vote 磁盘(/dev/asmvote) | share-vote.vmdk |
| /dev/sde | 10G | Redo 日志磁盘(/dev/asmlog0) | share-log0.vmdk |
| /dev/sdf | 10G | 归档日志磁盘(/dev/asmarch0) | share-arch0.vmdk |
三、共享磁盘配置
3.1 创建共享磁盘存放目录(物理机操作)
在物理机存放vm虚拟机的路径下找到dsc1存放路径,并在下面新建目录sharedisk
#根据自身实际修改路径 mkdir -p D:\VMwareVM\dsc1\sharedisk复制
💡提示:直接在资源管理器新建文件夹也可以,目录名也可自拟
⚠注意:需右键VMware目录→属性→安全→编辑,添加"Everyone"并赋予完全控制权限,否则会出现"文件未找到"错误

3.2 创建共享磁盘文件(物理机操作)
在VMware安装路径下打开cmd

使用VMware自带工具vmware-vdiskmanager创建共享磁盘(预分配厚置备类型,厚置备和薄置备:有何区别? – techsyncer):
# 数据磁盘(10G) .\vmware-vdiskmanager.exe -c -s 10g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-data0.vmdk" # DCR磁盘(5G) .\vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-dcr.vmdk" # vote磁盘(5G) .\vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-vote.vmdk" # redo日志磁盘(10G) .\vmware-vdiskmanager.exe -c -s 10g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-log0.vmdk" # 归档日志磁盘(10G) .\vmware-vdiskmanager.exe -c -s 10g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-arch0.vmdk"复制
.\vmware-vdiskmanager.exe:执行程序(VMware 虚拟磁盘管理工具)。-c:创建新虚拟磁盘(create)。-s 10g:指定磁盘大小为 10 GB(可用 k/m/g 单位)。-a lsilogic:指定虚拟磁盘连接的控制器类型(此处为 LSI Logic SCSI)。-t 2:指定磁盘格式/分配方式为2(预分配/单文件 thick,立即占用全部空间)。"D:\...\share-data0.vmdk":输出的 vmdk 描述文件路径(有空格时需引号);实际数据通常在同目录生成*-flat.vmdk。


3.3 配置虚拟机vmx文件
关闭dsc1和dsc2两台虚拟机。确认为关闭状态,否则修改可能不生效。

编辑两台虚拟机的配置文件(dsc1.vmx和dsc2.vmx),在末尾添加共享磁盘配置:
# shared disks configure # 共享磁盘配置区块开始 — 用于在多台 VM 之间共享同一组 VMDK diskLib.dataCacheMaxSize=0 # 禁用磁盘数据缓存;0 表示不使用宿主缓存,确保 I/O 直接写入宿主存储以降低数据不一致风险 diskLib.dataCacheMaxReadAheadSize=0 # 关闭预读(read-ahead)最大值,避免自动预读导致额外 I/O diskLib.dataCacheMinReadAheadSize=0 # 关闭预读最小阈值,配合上面完全关闭预读行为 diskLib.dataCachePageSize=4096 # 缓存页大小(字节),当启用缓存时按此粒度工作(这里为 4KB) diskLib.maxUnsyncedWrites = "0" # 不允许未同步写(unsynced writes),强制写入同步刷盘,优先数据一致性 disk.locking = "FALSE" # 禁用 VMware 文件锁定机制,允许多个 VM 打开同一 VMDK(用于测试/共享场景)。风险:可能导致并发写冲突或数据损坏 scsi1.sharedBus = "virtual" # 将 SCSI 控制器设置为虚拟共享总线,使多台 VM 能通过同一控制器共享磁盘 scsi1.present = "TRUE" # 表示该 SCSI 控制器已启用并附加到虚拟机 scsi1.virtualDev = "lsilogic" # SCSI 控制器的虚拟设备类型为 LSI Logic(Guest 端应使用对应驱动) # 数据磁盘 # 用于存放业务/数据文件的共享磁盘 scsi1:0.mode = "independent-persistent" # 磁盘为 independent-persistent,不随 VM 快照回滚或被快照影响,写入持久化 scsi1:0.deviceType = "disk" # 设备类型为磁盘(vmdk) scsi1:0.present = "TRUE" # 该磁盘条目启用并附加到 VM scsi1:0.fileName = "D:\\VMwareVM\\dsc1\\sharedisk\\share-data0.vmdk" # 指向 VMDK 描述文件路径。多台 VM 指向同一路径即可实现共享(宿主必须能访问该路径) scsi1:0.redo = "" # redo 为空表示不使用 redo/覆盖快照文件(无单独的 redo 文件) # DCR磁盘 # DCR(Distributed Consensus/Coordination)或仲裁相关磁盘 scsi1:1.mode = "independent-persistent" scsi1:1.deviceType = "disk" scsi1:1.present = "TRUE" scsi1:1.fileName = "D:\\VMwareVM\\dsc1\\sharedisk\\share-dcr.vmdk" scsi1:1.redo = "" # 同上,指向仲裁/协调用途的共享 VMDK # vote磁盘 # 用于集群投票/仲裁的小磁盘(通常很小) scsi1:2.mode = "independent-persistent" scsi1:2.deviceType = "disk" scsi1:2.present = "TRUE" scsi1:2.fileName = "D:\\VMwareVM\\dsc1\\sharedisk\\share-vote.vmdk" scsi1:2.redo = "" # redo日志磁盘 # 用于写 redo/回滚日志的共享磁盘(数据库/集群日志) scsi1:3.mode = "independent-persistent" scsi1:3.deviceType = "disk" scsi1:3.present = "TRUE" scsi1:3.fileName = "D:\\VMwareVM\\dsc1\\sharedisk\\share-log0.vmdk" scsi1:3.redo = "" # 归档日志磁盘 # 用于归档日志(archive log)存放的共享磁盘 scsi1:4.mode = "independent-persistent" scsi1:4.deviceType = "disk" scsi1:4.present = "TRUE" scsi1:4.fileName = "D:\\VMwareVM\\dsc1\\sharedisk\\share-arch0.vmdk" scsi1:4.redo = ""复制

3.4 验证配置
3.4.1 虚拟机层面验证
启动虚拟机后,通过"编辑虚拟机设置"确认新增5块共享磁盘

3.4.2 Linux系统层面验证
双节点执行以下命令,确认磁盘识别为/dev/sdb至/dev/sdf


四、安装dm8
在dsc1、dsc2两台机器上分别安装dm8。
4.1 调整最大打开文件数
ulimit -n 65536复制
4.2 创建数据库用户
useradd dmdba passwd dmdba复制
4.3 挂载安装镜像并安装
mount -o loop /home/dm8_20250506_x86_rh7_64.iso /mnt su - dmdba cd /mnt ./DMInstall.bin -i复制
4.4 安装后执行 root 安装脚本拉起服务
/home/dmdba/dmdbms/script/root/root_installer.sh复制
默认安装路径 /home/dmdba/dmdbms
参考安装流程:安装前准备 | 达梦技术文档
五、磁盘绑定(udev规则配置)
5.1 获取磁盘scsi_id(双节点执行)
查询并记录下每块磁盘的唯一 ID。
/usr/lib/udev/scsi_id -g -u /dev/sdb # 数据磁盘 /usr/lib/udev/scsi_id -g -u /dev/sdc # DCR磁盘 /usr/lib/udev/scsi_id -g -u /dev/sdd # vote磁盘 /usr/lib/udev/scsi_id -g -u /dev/sde # redo日志磁盘 /usr/lib/udev/scsi_id -g -u /dev/sdf # 归档日志磁盘复制


# 数据磁盘 36000c292a46f68fa3b77b8f0c19251ef # DCR磁盘 36000c2943fca00d21f0ab2f2ba3ec09f # vote磁盘 36000c294fb42df2d83bc3c581bcc16c4 # redo日志磁盘 36000c29e3f41d3f64f764ce892daec61 # 归档日志磁盘 36000c291061ba82232b510008694ea14复制
5.2 创建udev规则文件
vi /etc/udev/rules.d/99-dm-asmdevices.rules复制
为每块磁盘添加匹配规则,绑定别名并赋予 dmdba 权限。
# DCR磁盘 KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c2943fca00d21f0ab2f2ba3ec09f",SYMLINK+="DCR", OWNER="dmdba", GROUP="dmdba", MODE="0660", RUN+="/bin/sh -c 'chown dmdba:dmdba /dev/$name;mkdir -p /dev_DSC; ln -s /dev/DCR /dev_DSC/DCR'" # VOTE磁盘 KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c294fb42df2d83bc3c581bcc16c4",SYMLINK+="VOTE", OWNER="dmdba", GROUP="dmdba", MODE="0660", RUN+="/bin/sh -c 'chown dmdba:dmdba /dev/$name; ln -s /dev/VOTE /dev_DSC/VOTE'" # 数据磁盘 KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c292a46f68fa3b77b8f0c19251ef",SYMLINK+="DMDATA", OWNER="dmdba", GROUP="dmdba", MODE="0660", RUN+="/bin/sh -c 'chown dmdba:dmdba /dev/$name; ln -s /dev/DMDATA /dev_DSC/DMDATA'" # redo日志磁盘 KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29e3f41d3f64f764ce892daec61",SYMLINK+="DMLOG", OWNER="dmdba", GROUP="dmdba", MODE="0660", RUN+="/bin/sh -c 'chown dmdba:dmdba /dev/$name; ln -s /dev/DMLOG /dev_DSC/DMLOG ; chown -R dmdba:dmdba /dev_DSC '"复制
⚠警告:需要将RESULT替换为自己的实际ID。
规则解释
PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name"
在匹配前运行外部程序并取得其输出作为后续匹配依据。常用来获取设备的 WWID/唯一 ID。$name会被替换为设备名(如sdb)。RESULT=="36000c29..."
与PROGRAM的输出比较;当程序输出等于此值时条件成立。通常是设备的 WWID/唯一标识,用于精确识别具体物理/虚拟磁盘。SYMLINK+="DCR"
在/dev下创建一个符号链接/dev/DCR指向匹配的设备节点(不会删除已有节点)。+=表示追加。OWNER="dmdba"/GROUP="dmdba"
设置该设备节点的属主与属组(chown)。等效于chown dmdba:dmdba /dev/XXX。MODE="0660"
设备节点的权限,八进制表示(这里是 rw-rw----),对安全和访问控制很重要。RUN+="/bin/sh -c '...'"
触发时执行一段命令(外壳命令)。注意:RUN中的命令会由 udev 执行,不能是长期阻塞任务(会阻塞 udev 处理);复杂任务建议由 systemd 服务或后台脚本处理。常用于做额外的 chown、创建目录、建立额外软链等操作。
RUN+="..."会追加命令;命令写法需注意转义与引号。
补充说明 / 注意事项:
PROGRAM返回值通常会包含换行,RESULT必须精确匹配PROGRAM的输出(或其一部分,视写法而定),否则规则不触发。RESULT常用的是 SCSI WWID(例如3600...),比设备名稳定(设备名会随插拔变化)。修改规则后需运行
udevadm control --reload-rules并触发设备(udevadm trigger或重插设备)使其生效。避免在
RUN中执行耗时/交互性命令;若需要复杂后处理,建议使用TAG+ systemd.service配合SYSTEMD_WANTS/ENV{EMD_WANTS}。
5.3 生效规则并验证
#生效udev规则 udevadm control --reload-rules && udevadm trigger # 验证磁盘链接 ls -lth /dev_DSC复制
成功状态会显示DCR、VOTE、DMDATA、DMLOG的符号链接
六、 DCR配置与初始化
6.1 创建DCR配置文件
创建DCR配置文件dmdcr_cfg.ini定义 CSS、ASM、DB 三个组的节点信息、端口号及磁盘路径。
su - dmdba #使用dmdba用户,确保权限 mkdir -p /home/dmdba/config #新建config路径,后续配置文件基本都放这里 vi /home/dmdba/config/dmdcr_cfg.ini复制
DCR_N_GRP = 3 DCR_VTD_PATH = /dev_DSC/VOTE DCR_OGUID = 63635 [GRP] DCR_GRP_TYPE = CSS DCR_GRP_NAME = GRP_CSS DCR_GRP_N_EP = 2 DCR_GRP_DSKCHK_CNT = 60 [GRP_CSS] DCR_EP_NAME = CSS0 DCR_EP_HOST = [DSC1_IP] DCR_EP_PORT = 9836 [GRP_CSS] DCR_EP_NAME = CSS1 DCR_EP_HOST = [DSC2_IP] DCR_EP_PORT = 9837 [GRP] DCR_GRP_TYPE = ASM DCR_GRP_NAME = GRP_ASM DCR_GRP_N_EP = 2 DCR_GRP_DSKCHK_CNT = 60 [GRP_ASM] DCR_EP_NAME = ASM0 DCR_EP_HOST = [DSC1_IP] DCR_EP_PORT = 5836 DCR_EP_ASM_LOAD_PATH = /dev_DSC DCR_EP_SHM_KEY = 42424 DCR_EP_SHM_SIZE = 200 [GRP_ASM] DCR_EP_NAME = ASM1 DCR_EP_HOST = [DSC2_IP] DCR_EP_PORT = 5837 DCR_EP_ASM_LOAD_PATH = /dev_DSC DCR_EP_SHM_KEY = 42425 DCR_EP_SHM_SIZE = 200 [GRP] DCR_GRP_TYPE = DB DCR_GRP_NAME = GRP_DSC DCR_GRP_N_EP = 2 DCR_GRP_DSKCHK_CNT = 60 [GRP_DSC] DCR_EP_NAME = DSC01 DCR_EP_SEQNO = 0 DCR_EP_PORT = 5236 [GRP_DSC] DCR_EP_NAME = DSC02 DCR_EP_SEQNO = 1 DCR_EP_PORT = 5236复制
⚠警告:需要注意修改为自己的实际环境,如IP,以及确保各个端口号未占用。
6.2 初始化磁盘组(只需在节点1执行)
cd /home/dmdba/dmdbms/bin ./dmasmcmd复制
在交互界面逐行执行以下指令
create dcrdisk '/dev_DSC/DCR' 'DCR' create votedisk '/dev_DSC/VOTE' 'VOTE' create asmdisk '/dev_DSC/DMDATA' 'DMDATA' create asmdisk '/dev_DSC/DMLOG' 'DMLOG' init dcrdisk '/dev_DSC/DCR' from '/home/dmdba/config/dmdcr_cfg.ini' identified by '[数据库密码]' init votedisk '/dev_DSC/VOTE' from '/home/dmdba/config/dmdcr_cfg.ini'复制
⚠警告:需要修改自己的数据库密码,符合达梦安全性要求。

七、集群服务配置
7.1 配置MAL系统(双节点执行)
创建并编辑 dmasvrmal.ini,配置 ASM 节点 IP 与端口。
vi /home/dmdba/config/dmasvrmal.ini复制
[MAL_INST1] MAL_INST_NAME= ASM0 MAL_HOST= [DSC1_IP] MAL_PORT= 4836 [MAL_INST2] MAL_INST_NAME= ASM1 MAL_HOST= [DSC2_IP] MAL_PORT= 4837复制
7.2 配置DCR启动文件
节点1配置
su - dmdba vi /home/dmdba/config/dmdcr.ini复制
DMDCR_PATH = /dev_DSC/DCR DMDCR_MAL_PATH = /home/dmdba/config/dmasvrmal.ini DMDCR_SEQNO = 0 DMDCR_ASM_RESTART_INTERVAL = 0 DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/dmdba/config/dmdcr.ini DMDCR_DB_RESTART_INTERVAL = 0 DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver path=/home/dmdba/config/DSC01_conf/dm.ini dcr_ini=/home/dmdba/config/dmdcr.ini复制
节点2配置
su - dmdba mkdir /home/dmdba/config #dsc2还没新建,这里新建一下路径 vi /home/dmdba/config/dmdcr.ini复制
DMDCR_PATH = /dev_DSC/DCR DMDCR_MAL_PATH = /home/dmdba/config/dmasvrmal.ini DMDCR_SEQNO = 1 DMDCR_ASM_RESTART_INTERVAL = 0 DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/dmdba/config/dmdcr.ini DMDCR_DB_RESTART_INTERVAL = 0 DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver path=/home/dmdba/config/DSC01_conf/dm.ini dcr_ini=/home/dmdba/config/dmdcr.ini复制
💡提示:上面两个配置仅DMDCR_SEQNO有区别,0、1。
八、启动集群服务
8.1 启动DMCSS服务(双节点执行)
cd /home/dmdba/dmdbms/bin ./dmcss DCR_INI=/home/dmdba/config/dmdcr.ini复制


8.2 启动DMASM服务(双节点)
⚠警告:上一小节的终端窗口需要保留前台运行,此处新建两个新的终端窗口执行。
su - dmdba cd /home/dmdba/dmdbms/bin ./dmasmsvr DCR_INI=/home/dmdba/config/dmdcr.ini复制
💡提示:成功会显示"the ASM server is Ready"


8.3 创建ASM磁盘组(节点1执行)
su - dmdba cd /home/dmdba/dmdbms/bin ./dmasmtool DCR_INI=/home/dmdba/config/dmdcr.ini复制
同样在ASM中逐行执行指令
CREATE DISKGROUP DMDATA asmdisk '/dev_DSC/DMDATA' CREATE DISKGROUP DMLOG asmdisk '/dev_DSC/DMLOG'复制

九、数据库实例初始化与启动
9.1 创建初始化配置文件
编辑 dminit.ini,定义数据库名、路径、日志组、DCR 信息、两节点端口等。
su - dmdba vi /home/dmdba/config/dminit.ini复制
DB_NAME= dsc2 SYSTEM_PATH= +DMDATA/data SYSTEM= +DMDATA/data/system.dbf SYSTEM_SIZE= 128 ROLL= +DMDATA/data/roll.dbf ROLL_SIZE= 128 MAIN= +DMDATA/data/main.dbf MAIN_SIZE= 128 CTL_PATH= +DMDATA/data/dm.ctl LOG_SIZE= 2048 DCR_PATH= /dev_DSC/DCR DCR_SEQNO= 0 AUTO_OVERWRITE= 2 PAGE_SIZE = 16 EXTENT_SIZE = 16 SYSDBA_PWD=[PASSWORD] SYSAUDITOR_PWD=[PASSWORD] [DSC01] CONFIG_PATH= /home/dmdba/config/DSC01_conf PORT_NUM = 5236 MAL_HOST= [DSC1_IP] MAL_PORT= 6536 LOG_PATH= +DMLOG/log/DSC01_log1.log LOG_PATH= +DMLOG/log/DSC01_log2.log [DSC02] CONFIG_PATH= /home/dmdba/config/DSC02_conf PORT_NUM = 5237 MAL_HOST= [DSC2_IP] MAL_PORT= 6537 LOG_PATH= +DMLOG/log/DSC02_log1.log LOG_PATH= +DMLOG/log/DSC02_log2.log复制
9.2 初始化数据库实例(节点1执行)
cd /home/dmdba/dmdbms/bin ./dminit control=/home/dmdba/config/dminit.ini复制

查看节点1下生成的配置文件

9.3 复制DSC02_conf配置文件夹到节点2
终端直接复制即可,scp也可以。
9.4 启动数据库实例(双节点)
节点1
./dmserver dcr_ini=/home/dmdba/config/dmdcr.ini /home/dmdba/config/DSC01_conf/dm.ini复制
节点2
./dmse dcr_ini=/home/dmdba/config/dmdcr.ini /home/dmdba/config/DSC02_conf/dm.ini复制


十、集群监控配置
10.2 创建日志目录
mkdir -p /home/dmdba/dm/cssmlog复制
10.2 创建监视器配置文件
dmcssm.ini定义 OGUID、CSS 节点 IP、日志路径等。
vi /home/dmdba/config/dmcssm.ini复制
添加内容(OGUID需与dmdcr_cfg.ini一致)
CSSM_OGUID = 63635 CSSM_CSS_IP = [DSC1_IP]:9836 CSSM_CSS_IP = [DSC2_IP]:9837 CSSM_LOG_PATH = /home/dmdba/dm/cssmlog CSSM_LOG_FILE_SIZE = 32 CSSM_LOG_SPACE_LIMIT = 0复制
10.3 启动监视器
cd /home/dmdba/dmdbms/bin ./dmcssm /home/dmdba/config/dmcssm.ini复制
成功启动后可查看集群状态,包括各节点服务运行情况、磁盘组状态等





