达梦主备集群(数据守护集群)基于实时日志传输实现高可用,核心特性:
本文采用单机双实例演示;生产推荐双物理机部署,硬件故障隔离。
| 项目 | 配置 |
|---|---|
| 操作系统 | CentOS 7 |
| 数据库版本 | DM8 V8 |
| 安装目录 | /home/dmdba/dmdbms |
| 运行用户/组 | dmdba:dinstall |
| 主库IP | 192.168.200.208 |
| 备库IP | 192.168.201.128 |
| 实例名 | 数据库PORT_NUM | MAL_INST_DW_PORT | MAL_PORT | MAL_DW_PORT |
|---|---|---|---|---|
| GRP1_RT_01(主) | 5236 | 33141 | 61141 | 52141 |
| GRP1_RT_02(备) | 5237 | 33142 | 61142 | 52142 |
端口说明:
# 主库目录
/data/dmdata/DAMENG/
├── dm.ini
├── dmmal.ini
├── dmarch.ini
├── dmwatcher.ini
├── arch/
└── log/
# 备库目录
/data/dmdata_STB/DAMENG_STB/
├── dm.ini
├── dmmal.ini
├── dmarch.ini
├── dmwatcher.ini
├── arch/
└── log/
# 公共目录
/data/dmback/ # 备份集存放
/home/dmdba/dmmonitor.ini # 监视器配置
/home/dmdba/monitor_log/ # 监视器日志
部署前创建目录并授权:
mkdir -p /data/dmdata /data/dmdata_STB /data/dmback /home/dmdba/monitor_log chown -R dmdba:dinstall /data /home/dmdba/monitor_log
单机双实例仅安装一次达梦软件;双物理机两台均安装。
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/data/dmdata \
db_name=DAMENG \
instance_name=GRP1_RT_01 \
page_size=32 \
log_size=2048 \
port_num=5236 \
case_sensitive=1 \
charset=1
关键参数:
规范:禁止独立初始化备库,必须主库备份还原保证DB_MAGIC一致
cd /home/dmdba/dmdbms/bin
./dmserver /data/dmdata/DAMENG/dm.ini
# 输出SYSTEM IS READY后输入exit退出
mkdir -p /data/dmback/full
./dmrman
BACKUP DATABASE '/data/dmdata/DAMENG/dm.ini' FULL BACKUPSET '/data/dmback/full/fullbak_first' COMPRESSED LEVEL 1;
EXIT;
./dmrman
RESTORE DATABASE '/data/dmdata_STB/DAMENG_STB/dm.ini' FROM BACKUPSET '/data/dmback/full/fullbak_first';
RECOVER DATABASE '/data/dmdata_STB/DAMENG_STB/dm.ini' FROM BACKUPSET '/data/dmback/full/fullbak_first';
RECOVER DATABASE '/data/dmdata_STB/DAMENG_STB/dm.ini' UPDATE DB_MAGIC;
EXIT;
主库 /data/dmdata/DAMENG/dm.ini
INSTANCE_NAME = GRP1_RT_01
PORT_NUM = 5236
MAL_INI = 1
ARCH_INI = 1
DW_PORT = 33141
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
备库 /data/dmdata_STB/DAMENG_STB/dm.ini
INSTANCE_NAME = GRP1_RT_02
PORT_NUM = 5237
MAL_INI = 1
ARCH_INI = 1
DW_PORT = 33142
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
故障点:dw_port与dmmal.ini MAL_INST_DW_PORT不一致 → MAL初始化失败,两端端口必须严格对应。
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.200.208
MAL_PORT = 61141
MAL_INST_HOST = 192.168.200.208
MAL_INST_PORT = 5236
MAL_INST_DW_PORT = 33141
MAL_DW_PORT = 52141
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.201.128
MAL_PORT = 61142
MAL_INST_HOST = 192.168.201.128
MAL_INST_PORT = 5237
MAL_INST_DW_PORT = 33142
MAL_DW_PORT = 52142
主库
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmdata/DAMENG/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
备库
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmdata_STB/DAMENG_STB/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
提前创建arch目录,授权dmdba。
# 主库mount启动
nohup /home/dmdba/dmdbms/bin/dmserver /data/dmdata/DAMENG/dm.ini mount \
> /data/dmdata/DAMENG/log/dmserver_mount.log 2>&1 &
# 备库mount启动
nohup /home/dmdba/dmdbms/bin/dmserver /data/dmdata_STB/DAMENG_STB/dm.ini mount \
> /data/dmdata_STB/DAMENG_STB/log/dmserver_mount.log 2>&1 &
故障:日志目录不存在会报文件找不到;必须提前mkdir创建log目录;启动必须使用绝对路径,否则nohup找不到命令。
主库执行SQL
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(453331);
ALTER DATABASE PRIMARY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
备库执行SQL
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SP_SET_OGUID(453331);
ALTER DATABASE STANDBY;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
校验命令
SELECT OGUID, MODE$ FROM V$INSTANCE;
要求:主备OGUID一致,主PRIMARY、备STANDBY。
主库
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /data/dmdata/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
备库仅修改INST_INI路径:
INST_INI = /data/dmdata_STB/DAMENG_STB/dm.ini
故障:配置中不能添加DW_PORT参数,会报ini第N行读取错误-802。
# 主库守护
nohup /home/dmdba/dmdbms/bin/dmwatcher /data/dmdata/DAMENG/dmwatcher.ini \
> /data/dmdata/DAMENG/log/dmwatcher.log 2>&1 &
# 备库守护
nohup /home/dmdba/dmdbms/bin/dmwatcher /data/dmdata_STB/DAMENG_STB/dmwatcher.ini \
> /data/dmdata_STB/DAMENG_STB/log/dmwatcher.log 2>&1 &
守护启动后实例自动由MOUNT转为OPEN。
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/monitor_log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.200.208:52141
MON_DW_IP = 192.168.201.128:52142
启动监视器
nohup /home/dmdba/dmdbms/bin/dmmonitor /home/dmdba/dmmonitor.ini \ > /home/dmdba/monitor_log/dmmonitor.log 2>&1 &
故障:MON_DW_CONFIRM=0为普通监视器,无法自动切换,必须设1。
主库执行
CREATE TABLE TEST_SYNC (ID INT PRIMARY KEY, NAME VARCHAR(50));
INSERT INTO TEST_SYNC VALUES (1, 'Hello DM8');
INSERT INTO TEST_SYNC VALUES (2, '主备同步测试');
COMMIT;
备库查询
SELECT * FROM TEST_SYNC;
能查询到数据代表同步正常。
仅实验环境操作,生产禁止kill -9杀库进程
# 查找主库进程PID
ps aux | grep "/data/dmdata/DAMENG/dm.ini" | grep -v grep
kill -9 PID
等待INST_ERROR_TIME时长后查询备库角色:
echo "SELECT INSTANCE_NAME, MODE$ FROM V\$INSTANCE;" | /home/dmdba/dmdbms/bin/disql SYSDBA/Wei050210@192.168.201.128:5237
备库变为PRIMARY即切换成功;原主库重新启动后自动转为备库。
故障说明:INST_AUTO_RESTART=1会自动重启本地实例,如需观察切换可连续kill两次主库进程。
| 故障现象 | 根因 | 解决方案 |
|---|---|---|
| dmserver MAL端口不匹配 | dm.ini DW_PORT与dmmal.ini MAL_INST_DW_PORT不一致 | 修改两端端口统一 |
| nohup日志文件不存在 | log目录未创建 | mkdir -p 提前创建 |
| nohup找不到dmserver | 使用相对路径启动 | 替换为/home/dmdba/dmdbms/bin/dmserver |
| dmwatcher报ini行读取错误-802 | dmwatcher.ini配置无效DW_PORT | 删除DW_PORT配置行 |
| 主库宕机无自动切换 | 监视器MON_DW_CONFIRM=0或未启动 | 开启确认监视器并后台运行 |
| kill后主库自动拉起,不切换 | INST_AUTO_RESTART=1 | 连续kill进程,故障超时后触发切换 |
| 端口占用启动失败 | 残留dmserver/dmwatcher进程 | pkill清理全部进程后重启 |
文章
阅读量
获赞
