前言
DMDSC 集群是一个多实例、单数据库的系统。
- 多个数据库实例可以同时访问、修改同一个数据库的数据。用户可以登录集群中的任意一个数据库实例,获得完整的数据库服务。
- 数据文件、控制文件在集群系统中只有一份,不论有几个节点,这些节点都平等地使用这些文件,这些文件保存在共享存储上。
- 每个节点有自己独立的联机日志和归档日志,联机日志和归档日志都需要保存在共享存储上。
- 达梦数据库的共享存储集群部署过程中相对复杂,大家最好先进行规划再进行部署
一、集群规划
1 集群架构
简单来说,共享存储集群(DSC)的两个数据库节点共享同一份业务数据,节点之间通过心跳网络进行通信。
2 服务器信息
1.1 演示环境
系统 | CPU | 内存 | 磁盘 | 网卡 | 数据库版本 | 服务器数量 |
---|---|---|---|---|---|---|
redhat 7.9 | 1C | 2G | 50G | 千兆 | DM8 | 2台 |
1.2 本地磁盘规划
- | A服务器(sdb1) | B服务器(sdb2) | 备注 |
---|---|---|---|
数据库安装目录 | /home/dmdba/dmdbms | /home/dmdba/dmdbms | 数据库安装路径,存放数据库运行日志等信息 |
数据库备份目录 | /opt/dm/dmbak/ | /opt/dm/dmbak/ | 用于存放数据库备份文件 |
数据库 SQL 日志目录 | /opt/dm/dmsqllog/ | /opt/dm/dmsqllog/ | 用于存放数据库 dmsql 日志 |
集群配置文件目录 | /opt/dm/dmconfig | /opt/dm/dmconfig | 用于存放数据库集群配置文件 |
系统 core 目录 | /opt/dm/core | /opt/dm/core | 用户存放系统的 core 文件 |
监控文件 nmon 目录 | /opt/dm/nmon_output | /opt/dm/nmon_output | 用于存放服务器性能监控 nmon 日志文件 |
1.3 共享磁盘规划
DMDSC 集群为了实现多实例同时访问和修改数据,需要数据文件、控制文件和日志文件都放到共享存储上。
名称 | 拟定配置 | 分区大小 | 备注 |
---|---|---|---|
DCR 盘 | /dev/raw/raw1 | 200MB | 用于存储、维护集群配置的详细信息,整个集群环境共享 DCR 配置信息 |
VOTE 磁盘 | /dev/raw/raw2 | 200MB | 记录集群成员信息,集群通过 Voting Disk 进行心跳检测,确定集群中节点的状态 |
Redo 日志盘 | /dev/raw/raw3 | 5GB | 用于存储数据库集群 Redo log |
数据盘 | /dev/raw/raw5 | 14GB | 用于存放数据 |
归档盘 | /dev/raw/raw6 | 5.6GB | 用于存储数据库集群各实例的归档日志 |
1.4 端口规划
二、集群部署
1 创建共享磁盘
1.1 window 服务器分配存储
cd E:\tools\VM
## window 直接删除文件即可
./vmware-vdiskmanager -c -s 25Gb -a lsilogic -t 2 "D:\system\share\cipan\DCS-share-25G.vmdk"
1.2 磁盘分区
磁盘分区过程中,主分区最多支持四个,所以在第四个的时候需要按为 e 作为扩展逻辑盘,且第一个逻辑盘不能存储数据,在本博文中 /dev/sdb4 不存储数据
fdisk /dev/sdb
- 裸设备绑定
cat > /etc/udev/rules.d/70-persistent-ipoib.rules << EOF
ACTION=="add",KERNEL=="sdb1",RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add",KERNEL=="sdb2",RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add",KERNEL=="sdb3",RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add",KERNEL=="sdb4",RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add",KERNEL=="sdb5",RUN+="/bin/raw /dev/raw/raw5 %N"
ACTION=="add",KERNEL=="sdb6",RUN+="/bin/raw /dev/raw/raw6 %N"
ACTION=="add",KERNEL=="raw[1-6]", OWNER="dmdba", GROUP="dinstall", MODE="660"
EOF
reboot
2 软件安装
3 集群搭建
3.1 配置 dmdcr_cfg.ini
- 使用 dmdba 用户进行实例初始化,sdb1 和 sdb2 机器配置相同
cat > /opt/dm/dmconfig/dmdcr_cfg.ini << EOF
DCR_N_GRP = 3 ##集群环境有多少个 GROUP,范围:1~16
DCR_VTD_PATH = /dev/raw/raw2 ##规划为 vote 的磁盘
DCR_OGUID = 210715 ## 消息标识,一个组里面只有一个。
[GRP] #新建一个 GROUP
DCR_GRP_TYPE = CSS ##组类型(CSS/ASM/DB)
DCR_GRP_NAME = GRP_CSS ##组名
DCR_GRP_N_EP = 2 ##组内节点个数
DCR_GRP_DSKCHK_CNT = 65 ##磁盘心跳容错时间,单位:秒
[GRP_CSS]
DCR_EP_NAME = CSS0 ##CSS 节点名
DCR_EP_HOST = 192.168.30.176 ##心跳地址
DCR_EP_PORT = 11286 ##CSS 端口
[GRP_CSS]
DCR_EP_NAME = CSS1
DCR_EP_HOST = 192.168.30.177
DCR_EP_PORT = 11286
[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 ##ASM 节点名,和 dmasvrmal 的 MAL_INST_NAME 一致
DCR_EP_SHM_KEY = 42424 ##共享内存标识
DCR_EP_SHM_SIZE = 1024 ##共享内存大小
DCR_EP_HOST = 192.168.30.176 ##心跳地址
DCR_EP_PORT = 11276 ##ASM 端口
DCR_EP_ASM_LOAD_PATH = /dev/raw
[GRP_ASM]
DCR_EP_NAME = ASM1
DCR_EP_SHM_KEY = 42425
DCR_EP_SHM_SIZE = 1024
DCR_EP_HOST = 192.168.30.177
DCR_EP_PORT = 11276
DCR_EP_ASM_LOAD_PATH = /dev/raw
[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 ##实例名,和 dm.ini 的 INSTANCE_NAME 一致
DCR_EP_SEQNO = 0 ##组内序号,不能重复
DCR_EP_PORT = 5236 ##实例端口,和 dm.ini 的 PORT_NUM 一致
DCR_CHECK_PORT = 11256 ##DCR 检查端口
[GRP_DSC]
DCR_EP_NAME = DSC1
DCR_EP_SEQNO = 1
DCR_EP_PORT = 5236
DCR_CHECK_PORT = 11256
EOF
3.2 初始化磁盘
在 sdb1 服务上进行如下操作
$DM_HOME/bin/dmasmcmd
-- asm script file
create dcrdisk '/dev/raw/raw1' 'dcr'
create votedisk '/dev/raw/raw2' 'vote'
create asmdisk '/dev/raw/raw3' 'LOG0'
create asmdisk '/dev/raw/raw5' 'DATA0'
create asmdisk '/dev/raw/raw6' 'ARCH0'
-- 检查
listdisks '/dev/raw/'
init dcrdisk '/dev/raw/raw1' from '/opt/dm/dmconfig/dmdcr_cfg.ini' identified by '123456'
init votedisk '/dev/raw/raw2' from '/opt/dm/dmconfig/dmdcr_cfg.ini'
3.3 配置 dmasvrmal.ini
- 两台服务器相同配置
cat > /opt/dm/dmconfig/dmasvrmal.ini << EOF
[MAL_INST0]
MAL_INST_NAME = ASM0
MAL_HOST = 192.168.30.176 #心跳地址
MAL_PORT = 11266 #MAL 监听端口
[MAL_INST1]
MAL_INST_NAME = ASM1
MAL_HOST = 192.168.30.177
MAL_PORT = 11266
EOF
## sdb1
cp /opt/dm/dmconfig/dmasvrmal.ini /opt/dm/dmconfig/DSC0/
## sdb2
cp /opt/dm/dmconfig/dmasvrmal.ini /opt/dm/dmconfig/DSC1/
3.4 配置 dmdcr.ini 文件
- sdb1 机器配置 dmdcr.ini, dmdcr_seqno 为 0
cat > /opt/dm/dmconfig/dmdcr.ini << EOF
DMDCR_PATH = /dev/raw/raw1
DMDCR_MAL_PATH = /opt/dm/dmconfig/DSC0/dmasvrmal.ini
DMDCR_SEQNO = 0
DMDCR_AUTO_OPEN_CHECK = 111
DMDCR_ASM_TRACE_LEVEL = 2
##DMDCR_ASM_RESTART_INTERVAL = 60 #CSS 认定 ASM 故障重启的时间
##DMDCR_ASM_STARTUP_CMD = /dm/dmdbms/dsc_config/DmAsmService_DSC0 start
##DMDCR_DB_RESTART_INTERVAL = 60 ##CSS 认定 DSC 故障重启的时间,设置为 0 不自动拉起
##DMDCR_DB_STARTUP_CMD = /dm/dmdbms/dsc_config/DmService_DSC0 start
EOF
- sdb2 机器配置 dmdcr.ini, dmdcr_seqno 为 1
cat > /opt/dm/dmconfig/dmdcr.ini << EOF
DMDCR_PATH = /dev/raw/raw1
DMDCR_MAL_PATH = /opt/dm/dmconfig/DSC1/dmasvrmal.ini
DMDCR_SEQNO = 1
DMDCR_AUTO_OPEN_CHECK = 111
DMDCR_ASM_TRACE_LEVEL = 2
##DMDCR_ASM_RESTART_INTERVAL = 60
##DMDCR_ASM_STARTUP_CMD = /dm/dmdbms/dsc_config/DmAsmServiceDSC1 start
##DMDCR_DB_RESTART_INTERVAL = 60
##DMDCR_DB_STARTUP_CMD = /dm/dmdbms/dsc_config/DmServiceDSC1 star
EOF
当前为手动拉起 db0 机器和 db1 机器的 ASM 和 DMSERVER 服务。待集群配置完成后,再修改为自动拉起(删除 dmdcr.ini 中的“##”号即可)
3.6 启动 DMCSS、DMASM 服务
- 在 2 个节点分别启动 dmcss 命令 、 dmasmsvr 命令
cd $DM_HOME/bin/
## 需要两个一起启动
nohup $DM_HOME/bin/dmcss dcr_ini=/opt/dm/dmconfig/DSC0/dmdcr.ini &
nohup $DM_HOME/bin/dmcss dcr_ini=/opt/dm/dmconfig/DSC1/dmdcr.ini &
## dmasmsvr https://blog.csdn.net/canyueduyi/article/details/125250968
nohup ./dmasmsvr DCR_INI=/opt/dm/dmconfig/DSC0/dmdcr.ini &
nohup ./dmasmsvr DCR_INI=/opt/dm/dmconfig/DSC1/dmdcr.ini &
3.7 查看磁盘组
##在 sdb1 节点启动 dmasmtool 工具
$DM_HOME/bin/dmasmtool DCR_INI=/opt/dm/dmconfig/dmdcr.ini
create diskgroup 'DMLOG' asmdisk '/dev/raw/raw3'
create diskgroup 'DMDATA' asmdisk '/dev/raw/raw5'
create diskgroup 'DMARCH' asmdisk '/dev/raw/raw6'
## 查看磁盘
ls
3.8 初始化实例
- 两台服务器的配置一致
## 添加配置
cat > /opt/dm/dmconfig/dminit.ini << EOF
DB_NAME = DSC
SYSDBA_PWD = SYSDBA_PWD
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
CTL_SIZE = 8
LOG_SIZE = 256
DCR_PATH = /dev/raw/raw1 #dcr 磁盘路径
DCR_SEQNO = 0
AUTO_OVERWRITE = 1
PAGE_SIZE = 32
EXTENT_SIZE = 16
BLANK_PAD_MODE = 1
[DSC0] #inst_name 跟 dmdcr_cfg.ini 中 DB 类型 group 中 DCR_EP_NAME 对应
CONFIG_PATH = /opt/dm/dmconfig/DSC0
PORT_NUM = 5236
MAL_HOST = 192.168.30.176
MAL_PORT = 11246
LOG_PATH = +DMLOG/DSC0_LOG01.log
LOG_PATH = +DMLOG/DSC0_LOG02.log
[DSC1]
CONFIG_PATH = /opt/dm/dmconfig/DSC1
PORT_NUM = 5236
MAL_HOST = 192.168.30.177
MAL_PORT = 11246
LOG_PATH = +DMLOG/DSC1_LOG01.log
LOG_PATH = +DMLOG/DSC1_LOG02.log
EOF
## 初始化实例
$DM_HOME/bin/dminit control=/opt/dm/dmconfig/dminit.ini
- 拷贝文件到 DSC02 节点
scp -r /opt/dm/dmconfig/DSC1 dmdba@192.168.30.177:/opt/dm/dmconfig/
3.9 配置 dmarch.ini 文件
## 修改 dm.ini , ARCH_INI 设为 1 , sdb1
vi /opt/dm/dmconfig/DSC0/dm.ini
## 创建 dmarch.ini , sdb1
cat > /opt/dm/dmconfig/DSC0/dmarch.ini << EOF
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMARCH/ARCH/DSC0/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC1
ARCH_INCOMING_PATH = +DMARCH/ARCH/DSC1/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
EOF
## 修改 dm.ini , ARCH_INI 设为 1 , sdb2
vi /opt/dm/dmconfig/DSC1/dm.ini
## 创建 dmarch.ini , sdb2
cat > /opt/dm/dmconfig/DSC1/dmarch.ini << EOF
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMARCH/ARCH/DSC1/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC0
ARCH_INCOMING_PATH = +DMARCH/ARCH/DSC0/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
EOF
3.10 启动 DMSERVER 服务
## sdb1
$DM_HOME/bin/dmserver /opt/dm/dmconfig/DSC0/dm.ini dcr_ini=/opt/dm/dmconfig/DSC0/dmdcr.ini
## sdb2
$DM_HOME/bin/dmserver /opt/dm/dmconfig/DSC1/dm.ini dcr_ini=/opt/dm/dmconfig/DSC1/dmdcr.ini
3.11 注册 CSS、ASM、DMSERVER 后台服务
##sdb1\2 机器
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmcss -dcr_ini /opt/dm/dmconfig/dmdcr.ini -p CSS
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmasmsvr -dcr_ini /opt/dm/dmconfig/dmdcr.ini -y DmCSSServiceCSS.service -p ASM
##sdb1 机器
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /opt/dm/dmconfig/DSC0/dm.ini -dcr_ini /opt/dm/dmconfig/dmdcr.ini -y DmASMSvrServiceASM.service -p DSC
##sdb2 机器
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /opt/dm/dmconfig/DSC1/dm.ini -dcr_ini /opt/dm/dmconfig/dmdcr.ini -y DmASMSvrServiceASM.service -p DSC
3.12 配置监控器
- 创建 dmcssm.ini
## A 机器、B 机器配置相同
cat > $DM_HOME/bin/dmcssm.ini << EOF
CSSM_OGUID = 210715
CSSM_CSS_IP = 192.168.30.176:11286
CSSM_CSS_IP = 192.168.30.177:11286
CSSM_LOG_PATH = ../log
CSSM_LOG_FILE_SIZE = 512
CSSM_LOG_SPACE_LIMIT = 2048
EOF
## 注册服务
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmcssm -cssm_ini /home/dmdba/dmdbms/bin/dmcssm.ini -p Monitor
3.13 授权 setcap
- 为了优化集群在操作系统假死时对节点状态的判断机制,设置 setcap 权限
##root 用户执行:
setcap cap_net_raw,cap_net_admin=eip /home/dmdba/dmdbms/bin/dmserver
setcap cap_net_raw,cap_net_admin=eip /home/dmdba/dmdbms/bin/dmasmsvr
##验证 setcap,有输出则授权成功:
getcap /home/dmdba/dmdbms/bin/dmserver
getcap /home/dmdba/dmdbms/bin/dmasmsvr
##每节点依次通过“kill -11 dmserver进程号”验证core文件可正常生成。
3.14 启动服务
- 启动监视器
## 前台启动
$DM_HOME/bin/dmcssm INI_PATH=$DM_HOME/bin/dmcssm.ini
## 后台启动
$DM_HOME/bin/DmCSSMonitorServiceMonitor start
- 启动集群
##启动:A/B 机器 CSS
A/B 机器:
$DM_HOME/bin/DmCSSServiceCSS start
$DM_HOME/bin/DmASMSvrServiceASM start
$DM_HOME/bin/DmServiceDSC start
##说明:CSS 启动后 30 秒自动拉起 ASM,60 秒自动拉起 DMSERVER。
##停止: A/B 机器 DMSERVER→A/B 机器 ASM→A/B 机器 CSS
A/B 机器:$DM_HOME/bin/DmServiceDSC stop
A/B 机器:$DM_HOME/bin/DmASMSvrServiceASM stop
A/B 机器:$DM_HOME/bin/DmCSSServiceCSS stop
3.15 验证服务
## 链接数据库
$DM_HOME/bin/disql SYSDBA/SYSDBA_PWD@192.168.30.177:5236
至此对达梦数据库的共享存储集群已经部署测试完成。