在数据库高可用方案中,很多人首先想到的是主备集群——主库写、备库读,故障时切换角色。但达梦还有另一条截然不同的高可用路线:DSC(Data Sharing Cluster,数据共享集群)。
DSC与主备集群的核心区别在于:主备集群是“多份数据靠日志追平”,而DSC是“多个实例围绕一份数据协同工作”。简单来说,DSC集群中的所有节点共享同一份数据文件(存放在共享存储上),每个节点运行独立的数据库实例,所有节点均可执行读写操作,不存在“主备”之分。
这种架构的优势在于:
在动手搭建之前,先理解DSC由哪些部分组成:
| 组件 | 全称 | 作用 |
|---|---|---|
| DMSERVER | 数据库实例 | 对外提供SQL服务的数据库实例,每个节点一个 |
| DMCSS | 集群同步服务(Cluster Sync Service) | 监控各节点运行状态,处理启动、故障、重加入等流程 |
| DMASM | 自动存储管理(Auto Storage Management) | 管理共享磁盘组,类似于Oracle的ASM |
| DMCSSM | 集群监视器 | 监控整个集群的状态信息,提供管理命令 |
| DCR磁盘 | 磁盘配置存储库(Disk Configuration Repository) | 存储集群配置元数据 |
| Vote磁盘 | 投票磁盘 | 用于集群节点间的仲裁选举 |
DSC集群本质上由三组服务构成:CSS组(集群控制)、ASM组(存储管理)、DB组(数据库实例)。
| 项目 | 配置 |
|---|---|
| 操作系统 | CentOS 7 |
| 达梦版本 | DM8 V8 |
| 安装目录 | /opt/dmdbms |
| 用户/组 | dmdba:dinstall |
DSC集群需要至少4块裸设备,本次通过NAS挂载分配:
| 设备 | 大小 | 用途 |
|---|---|---|
| /dev/vdb | 500M | DCR磁盘:存储集群配置元数据 |
| /dev/vdc | 500M | Vote磁盘:用于集群节点仲裁 |
| /dev/vdd | 20G | 数据磁盘:存储数据库数据文件 |
| /dev/vde | 50G | 日志磁盘:存储联机Redo日志 |
注意:配置DSC集群所需的DCR和Vote磁盘必须保存在DMASM文件系统管辖范围之外的共享存储上。达梦官方优先推荐使用DMASM来管理共享磁盘,以充分发挥集群的性能和管理优势。
| 节点 | 实例名 | 数据库端口 | CSS端口 | ASM端口 | ASM MAL端口 |
|---|---|---|---|---|---|
| 节点0 | DSC0 | 5238 | 11286 | 11276 | 11266 |
| 节点1 | DSC1 | 5239 | 11287 | 11277 | 11267 |
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.225
DCR_EP_PORT = 11286
[GRP_CSS]
DCR_EP_NAME = CSS1
DCR_EP_HOST = 192.168.200.225
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.225
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.225
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
MAL(Message Access Layer)是ASM节点间的通信配置文件,两个ASM节点使用相同内容:
cat > /home/dmdba/DSC/dmasvrmal.ini << 'EOF'
[MAL_INST0]
MAL_INST_NAME = ASM0
MAL_HOST = 192.168.200.225
MAL_PORT = 11266
[MAL_INST1]
MAL_INST_NAME = ASM1
MAL_HOST = 192.168.200.225
MAL_PORT = 11267
EOF
节点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 /opt/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
需要4个终端,按顺序启动:
终端1:节点0 DMCSS
cd /opt/dmdbms/bin
./dmcss DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini
终端2:节点0 ASM
cd /opt/dmdbms/bin
./dmasmsvr DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini
终端3:节点1 DMCSS
cd /opt/dmdbms/bin
./dmcss DCR_INI=/home/dmdba/DSC/dmdcr_DSC1.ini
终端4:节点1 ASM
cd /opt/dmdbms/bin
./dmasmsvr DCR_INI=/home/dmdba/DSC/dmdcr_DSC1.ini
注意:DMCSS会通过Vote磁盘读取和写入心跳信息,并据此判断各节点的运行状态。一旦MAL链路出现异常,DMCSS会进行裁定,并从集群中踢出故障节点。
第一步:创建ASM磁盘(指定大小)
cd /opt/dmdbms/bin
./dmasmcmd
create asmdisk '/dev/vde' 'LOG0' 51200
create asmdisk '/dev/vdd' 'DATA0' 20480
exit
第二步:创建磁盘组
./dmasmtool DCR_INI=/home/dmdba/DSC/dmdcr_DSC0.ini
create diskgroup 'DMLOG' asmdisk '/dev/vde'
create diskgroup 'DMDATA' asmdisk '/dev/vdd'
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.225
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.225
MAL_PORT = 8346
LOG_PATH = +DMLOG/DSC1_LOG01.log
LOG_PATH = +DMLOG/DSC1_LOG02.log
EOF
执行初始化:
cd /opt/dmdbms/bin
./dminit control=/home/dmdba/DSC/dminit.ini
需要2个新终端:
终端5:节点0 dmserver
cd /opt/dmdbms/bin
./dmserver /home/dmdba/DSC/DSC0/dm.ini dcr_ini=/home/dmdba/DSC/dmdcr_DSC0.ini
终端6:节点1 dmserver
cd /opt/dmdbms/bin
./dmserver /home/dmdba/DSC/DSC1/dm.ini dcr_ini=/home/dmdba/DSC/dmdcr_DSC1.ini
DSC集群中的DMCSS、DMASMSVR、DMSERVER均可注册为操作系统服务,实现开机自启动。达梦提供了统一的注册脚本dm_service_installer.sh,位于安装目录的/script/root子目录下。
重要提醒:注册服务需使用root用户执行。注册顺序必须先注册CSS服务,再注册ASM服务,最后注册DMSERVER服务,且注册ASM和DMSERVER服务时必须加-y参数,否则会报依赖错误。
1.注册节点0的服务
切换至root用户,进入脚本目录:
[root@~]# cd /opt/dmdbms/script/root
注册节点0的DMCSS服务:
[root@~]# ./dm_service_installer.sh -t dmcss -p DSC0 -dcr_ini /home/dmdba/DSC/dmdcr_DSC0.ini
注册节点0的DMASMSVR服务(必须加-y参数,指定依赖的CSS服务):
[root@~]# ./dm_service_installer.sh -t dmasmsvr -p DSC0 -y DmCSSServiceDSC0 -dcr_ini /home/dmdba/DSC/dmdcr_DSC0.ini
注册节点0的DMSERVER服务:
[root@~]# ./dm_service_installer.sh -t dmserver -p DSC0 -y DmASMSvrServiceDSC0 -dm_ini /home/dmdba/DSC/DSC0/dm.ini
2.注册节点1的服务
注册节点1的DMCSS服务:
[root@~]# ./dm_service_installer.sh -t dmcss -p DSC1 -dcr_ini /home/dmdba/DSC/dmdcr_DSC1.ini
注册节点1的DMASMSVR服务:
[root@~]# ./dm_service_installer.sh -t dmasmsvr -p DSC1 -y DmCSSServiceDSC1 -dcr_ini /home/dmdba/DSC/dmdcr_DSC1.ini
注册节点1的DMSERVER服务:
[root@~]# ./dm_service_installer.sh -t dmserver -p DSC1 -y DmASMSvrServiceDSC1 -dm_ini /home/dmdba/DSC/DSC1/dm.ini
3.验证注册结果
注册完成后,可在/opt/dmdbms/bin目录下看到生成的服务脚本:
[root@~]# ls /opt/dmdbms/bin/Dm*DSC*
DmASMSvrServiceDSC0 DmCSSServiceDSC0 DmServiceDSC0
DmASMSvrServiceDSC1 DmCSSServiceDSC1 DmServiceDSC1
注意:注册服务后,DSC集群默认开机自启。若需卸载服务,可使用dm_service_uninstaller.sh -n 服务名命令。
此后,可通过系统服务命令管理集群:
# 启动服务(需按顺序)
[dmdba@~]# /opt/dmdbms/bin/DmCSSServiceDSC0 start
[dmdba@~]# /opt/dmdbms/bin/DmASMSvrServiceDSC0 start
[dmdba@~]# /opt/dmdbms/bin/DmServiceDSC0 start
# 停止服务(需按相反顺序)
[dmdba@~]# /opt/dmdbms/bin/DmServiceDSC0 stop
[dmdba@~]# /opt/dmdbms/bin/DmASMSvrServiceDSC0 stop
[dmdba@~]# /opt/dmdbms/bin/DmCSSServiceDSC0 stop
# 查看服务状态
[dmdba@~]# systemctl status DmCSSServiceDSC0
集群启动后,可通过以下方式验证:
单机双节点部署中,两个数据库实例、两个DMCSS、两个DMASM均运行在同一台虚拟机上,不具备真正的主机级高可用能力。一旦物理机宕机,所有节点同时不可用。该方案仅适合功能验证和学习,不适用于生产环境。
DSC集群对共享存储的依赖性极高。如果共享存储出现I/O超时,可能导致ASM心跳中断,进而引发集群异常。生产环境中建议:
在DSC集群的性能调优之前,必须首先对单个实例进行性能分析和调优。如果应用在SMP环境下无法线性扩展,则在DSC下也无法线性扩展,甚至性能会更差。
如果启动过程中遇到问题,建议按以下顺序排查:
1.检查各组件日志文件(CSS日志、ASM日志、数据库日志)
2.确认共享磁盘设备权限正确(dmdba用户可读写)
3.检查防火墙是否放通了所有规划端口
4.确认DCR和Vote磁盘初始化成功
5.检查MAL网络通信是否正常
文章
阅读量
获赞
