本文记录了基于VMware+CentOS7在windows笔记本上搭建达梦DMDSC共享存储集群的全流程,并附上注释,便于读者理解与复现。本文中IP、密码等敏感信息已用
[内容]
代替,请仔细阅读。
创建两台虚拟机:
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 |
在物理机存放vm虚拟机的路径下找到dsc1
存放路径,并在下面新建目录sharedisk
#根据自身实际修改路径
mkdir -p D:\VMwareVM\dsc1\sharedisk
💡提示:直接在资源管理器新建文件夹也可以,目录名也可自拟
⚠注意:需右键VMware目录→属性→安全→编辑,添加"Everyone"并赋予完全控制权限,否则会出现"文件未找到"错误
在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
。
关闭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 = ""
启动虚拟机后,通过"编辑虚拟机设置"确认新增5块共享磁盘
双节点执行以下命令,确认磁盘识别为/dev/sdb至/dev/sdf
在dsc1
、dsc2
两台机器上分别安装dm8。
ulimit -n 65536
useradd dmdba passwd dmdba
mount -o loop /home/dm8_20250506_x86_rh7_64.iso /mnt
su - dmdba
cd /mnt
./DMInstall.bin -i
/home/dmdba/dmdbms/script/root/root_installer.sh
默认安装路径 /home/dmdba/dmdbms
参考安装流程:安装前准备 | 达梦技术文档
查询并记录下每块磁盘的唯一 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
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}
。
#生效udev规则
udevadm control --reload-rules && udevadm trigger
# 验证磁盘链接
ls -lth /dev_DSC
成功状态会显示DCR、VOTE、DMDATA、DMLOG的符号链接
创建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,以及确保各个端口号未占用。
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'
⚠警告:需要修改自己的数据库密码,符合达梦安全性要求。
创建并编辑 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
节点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。
cd /home/dmdba/dmdbms/bin
./dmcss DCR_INI=/home/dmdba/config/dmdcr.ini
⚠警告:上一小节的终端窗口需要保留前台运行,此处新建两个新的终端窗口执行。
su - dmdba
cd /home/dmdba/dmdbms/bin
./dmasmsvr DCR_INI=/home/dmdba/config/dmdcr.ini
💡提示:成功会显示"the ASM server is Ready"
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'
编辑 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
cd /home/dmdba/dmdbms/bin
./dminit control=/home/dmdba/config/dminit.ini
查看节点1下生成的配置文件
DSC02_conf
配置文件夹到节点2终端直接复制即可,scp也可以。
节点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
mkdir -p /home/dmdba/dm/cssmlog
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
cd /home/dmdba/dmdbms/bin
./dmcssm /home/dmdba/config/dmcssm.ini
成功启动后可查看集群状态,包括各节点服务运行情况、磁盘组状态等
文章
阅读量
获赞