最近在客户现场完成了一个达梦数据库主备集群的扩容项目,将原有的1主1备架构升级为1主2备。整个过程踩了不少坑,也积累了一些实战经验,今天就把完整的操作步骤和注意事项整理出来,供有类似需求的同行参考。
达梦数据库作为国产数据库的代表产品,在企业级应用中越来越常见。其主备集群架构通过数据实时同步和自动故障切换,能够有效保障业务连续性。但随着业务增长,单备库架构在容灾能力和读性能扩展上逐渐显现不足,这时就需要考虑增加备库节点。
重要提示:生产环境部署时,强烈建议将心跳IP与业务IP进行网段和网卡隔离。这样可以避免业务流量与集群心跳通信相互干扰,确保集群状态检测的准确性和通信稳定性。
在开始扩容前,我们需要做好详细的规划。下表是我们这次扩容项目的环境配置:
| 配置项 | 主库 | 原备库 | 新增备库 |
|---|---|---|---|
| 业务IP | 192.168.100.147 | 192.168.100.148 | 192.168.100.149 |
| 心跳IP | 192.168.100.147 | 192.168.100.148 | 192.168.100.149 |
| 实例名 | dmpri | dmstb | dmstb2 |
| 实例端口 | 5236 | 5236 | 5236 |
| MAL端口 | 5336 | 5336 | 5336 |
| MAL守护进程端口 | 5436 | 5436 | 5436 |
| 守护进程端口 | 5536 | 5536 | 5536 |
| OGUID | 45331 | 45331 | 45331 |
| 守护组 | GRP1 | GRP1 | GRP1 |
| 安装目录 | /DM8/dmapp | /DM8/dmapp | /DM8/dmapp |
| 实例目录 | /DM8/dmdata | /DM8/dmdata | /DM8/dmdata |
| 归档上限 | 51200 | 51200 | 51200 |
在新增备库服务器上部署达梦软件前,需要确保:
在新增备库服务器上安装达梦数据库软件:
bash复制# 创建dmdba用户和组
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
echo "dmdba" | passwd --stdin dmdba
# 创建安装目录并授权
mkdir -p /DM8/dmapp /DM8/dmdata /DM8/dmbak /DM8/dmarc
chown -R dmdba:dinstall /DM8
# 以dmdba用户安装达梦软件
su - dmdba
./DMInstall.bin -i
安装过程中需要注意:
在dmdba用户的.bash_profile中添加:
bash复制export DM_HOME=/DM8/dmapp
export PATH=$DM_HOME/bin:$PATH
export LD_LIBRARY_PATH=$DM_HOME/bin:$LD_LIBRARY_PATH
为方便后续操作,我们先定义一些变量:
bash复制var_dm_pri_name=dmpri # 主库实例名
var_dm_stb_name1=dmstb # 原备库实例名
var_dm_stb_name2=dmstb2 # 新增备库实例名
bash复制# 使用drman工具执行全库备份
BACKUP DATABASE BACKUPSET '/DM8/dmbak/${var_dm_pri_name}';
# 将备份文件拷贝到新备库服务器
scp -r /DM8/dmbak/${var_dm_pri_name}/* dmdba@192.168.100.149:/DM8/dmbak/${var_dm_stb_name2}
注意:如果近期已有全备,可以直接使用,不必重新备份。但需要确保备份时间点之后的所有归档日志都完整保留。
bash复制# 初始化备库实例
dminit PATH=/DM8/dmdata/ DB_NAME=${var_dm_stb_name2} INSTANCE_NAME=${var_dm_stb_name2} \
PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CHARSET=1
# 恢复数据
dmrman CTLSTMT="RESTORE DATABASE '/DM8/dmdata/${var_dm_stb_name2}/dm.ini' FROM BACKUPSET '/DM8/dmbak/${var_dm_stb_name2}'"
dmrman CTLSTMT="RECOVER DATABASE '/DM8/dmdata/${var_dm_stb_name2}/dm.ini' FROM BACKUPSET '/DM8/dmbak/${var_dm_stb_name2}'"
dmrman CTLSTMT="RECOVER DATABASE '/DM8/dmdata/${var_dm_stb_name2}/dm.ini' UPDATE DB_MAGIC"
bash复制vi /DM8/dmdata/${var_dm_stb_name2}/dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /DM8/dmarc/${var_dm_stb_name2}
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = ${var_dm_pri_name}
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME
ARCH_DEST = ${var_dm_stb_name1}
bash复制vi /DM8/dmdata/${var_dm_stb_name2}/dm.ini
ALTER_MODE_STATUS = 0 # 不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 # 不允许备库 OFFLINE 表空间
MAL_INI = 1 # 打开 MAL 系统
ARCH_INI = 1 # 打开归档配置
bash复制vi /DM8/dmdata/${var_dm_stb_name2}/dmmal.ini
MAL_CHECK_INTERVAL = 10 # MAL 链路检测时间间隔(秒)
MAL_CONN_FAIL_INTERVAL = 10 # 判定 MAL 链路断开的时间(秒)
MAL_BUF_SIZE = 512 # 单个 MAL 缓存大小(MB)
MAL_SYS_BUF_SIZE = 2048 # MAL 总大小限制(MB)
MAL_COMPRESS_LEVEL = 0 # MAL 消息压缩等级(0不压缩)
[MAL_INST1]
MAL_INST_NAME = ${var_dm_pri_name}
MAL_HOST = 192.168.100.147
MAL_PORT = 5336
MAL_INST_HOST = 192.168.100.147
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST2]
MAL_INST_NAME = ${var_dm_stb_name1}
MAL_HOST = 192.168.100.148
MAL_PORT = 5336
MAL_INST_HOST = 192.168.100.148
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST3]
MAL_INST_NAME = ${var_dm_stb_name2}
MAL_HOST = 192.168.100.149
MAL_PORT = 5336
MAL_INST_HOST = 192.168.100.149
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
bash复制vi /DM8/dmdata/${var_dm_stb_name2}/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL # 全局守护类型
DW_MODE = AUTO # 故障自动切换
DW_ERROR_TIME = 20 # 远程守护进程故障认定时间(秒)
INST_ERROR_TIME = 20 # 本地实例故障认定时间(秒)
INST_RECOVER_TIME = 60 # 主库守护进程启动恢复间隔(秒)
INST_OGUID = 45331 # 守护系统唯一OGUID值
INST_INI = /DM8/dmdata/${var_dm_stb_name2}/dm.ini
INST_AUTO_RESTART = 1 # 打开实例自动启动
INST_STARTUP_CMD = /DM8/dmapp/bin/dmserver
RLOG_SEND_THRESHOLD = 0 # 主库发送日志到备库时间阈值
RLOG_APPLY_THRESHOLD = 0 # 备库重演日志时间阈值
bash复制# 切换到root用户注册服务
/DM8/dmapp/script/root/dm_service_installer.sh -t dmserver -p ${var_dm_stb_name2} -dm_ini /DM8/dmdata/${var_dm_stb_name2}/dm.ini
/DM8/dmapp/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /DM8/dmdata/${var_dm_stb_name2}/dmwatcher.ini
# 启动新备库服务
DmService${var_dm_stb_name2} start mount
# 设置OGUID并转换为备库模式
disql SYSDBA/SYSDBA@192.168.100.149:5236
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(45331);
select OGUID from v$instance;
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
在主库和原备库上执行:
sql复制SF_MAL_CONFIG(1,0);
SF_MAL_INST_ADD('MAL_INST3','${var_dm_stb_name2}','192.168.100.149',5336,'192.168.100.149',5236,5436,0,5536);
SF_MAL_CONFIG_APPLY();
SF_MAL_CONFIG(0,0);
ALTER DATABASE ADD ARCHIVELOG 'DEST= ${var_dm_stb_name2}, TYPE= REALTIME';
在主库、原备库和监控服务器上追加监控配置:
bash复制echo 'MON_DW_IP = 192.168.100.149:5436 #dmstb2' >> /DM8/dmapp/bin/dmmonitor.ini
echo 'MON_DW_IP = 192.168.100.149:5436 #dmstb2' >> /DM8/dmapp/bin/dmmonitor_manual.ini
bash复制# 在主库和原备库上重启守护进程
/DM8/dmapp/bin/DmWatcherServiceWatcher restart
# 将监控配置文件拷贝到新备库
scp -r /DM8/dmapp/bin/dmmonitor.ini dmdba@192.168.100.149:/DM8/dmapp/bin
scp -r /DM8/dmapp/bin/dmmonitor_manual.ini dmdba@192.168.100.149:/DM8/dmapp/bin
# 在新备库上启动守护进程
/DM8/dmapp/bin/DmWatcherServiceWatcher start
# 在监控服务器上重启监控服务
/DM8/dmapp/bin/DmMonitorServiceMonitor restart
在监控服务器上执行:
bash复制choose switchover GRP1
应该能看到所有三个实例都正常运行:
code复制Can choose one of the following instances to do switchover:
1: DMPRI
2: DMSTB
3: DMSTB2
验证集群的自动切换能力:
bash复制switchover GRP1.DMPRI
系统会提示确认:
code复制此操作需谨慎, 将会导致主库发生切换, 是否继续使用GRP1.DMPRI执行SWITCHOVER操作(YES/NO/Y/N)?
输入yes后,监控日志会显示详细的切换过程。成功后会看到类似输出:
code复制[monitor] 2024-12-16 19:38:30: 实例DMPRI切换成功
[monitor] 2024-12-16 19:39:30: 所有组中的活动实例运行正常!
现象:备库启动后,监控显示MAL链路无法建立。
排查步骤:
select * from v$archive_dest_status;解决方案:
bash复制# 在主库上重新配置MAL
SF_MAL_CONFIG(1,0);
SF_MAL_INST_ADD('MAL_INST3','dmstb2','192.168.100.149',5336,'192.168.100.149',5236,5436,0,5536);
SF_MAL_CONFIG_APPLY();
SF_MAL_CONFIG(0,0);
现象:备库数据落后于主库。
排查步骤:
select * from v$archived_log;select * from v$logmnr_contents;解决方案:
sql复制-- 增大MAL缓冲区大小
SP_SET_PARA_VALUE(2, 'MAL_BUF_SIZE', 1024);
SP_SET_PARA_VALUE(2, 'MAL_SYS_BUF_SIZE', 4096);
-- 调整归档发送参数
ALTER SYSTEM SET 'RLOG_SEND_THRESHOLD'=0 SCOPE=BOTH;
现象:服务器重启后,备库实例未自动启动。
排查步骤:
解决方案:
bash复制# 修改dmwatcher.ini
vi /DM8/dmdata/dmstb2/dmwatcher.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /DM8/dmapp/bin/dmserver /DM8/dmdata/dmstb2/dm.ini
# 重启守护进程
/DM8/dmapp/bin/DmWatcherServiceWatcher restart
完成扩容后,可以通过以下优化提升集群性能:
归档优化:
网络优化:
参数调优:
sql复制-- 增大日志缓冲区
SP_SET_PARA_VALUE(2, 'RLOG_BUF_SIZE', 1024);
-- 优化并行恢复
SP_SET_PARA_VALUE(2, 'PARALLEL_RECOVER', 4);
-- 调整检查点间隔
SP_SET_PARA_VALUE(2, 'CHECKPOINT_INTERVAL', 1800);
监控配置:
在实际生产环境中,我们通过以上优化措施,将主备同步延迟从最初的分钟级降低到了秒级以内,大大提高了系统的可用性。