达梦实时主备集群是数据守护(Data Watch)的一种高可用解决方案,由一个主库和一个或多个配置了实时(REALTIME)归档的备库组成。其核心原理是:主库修改数据产生的Redo日志,在写入联机日志文件之前发送到备库,备库通过重演Redo日志与主库保持数据同步。
本文以一主一备+确认监视器的架构为例进行配置:
| 角色 | 主机名 | IP地址 | 心跳IP | 实例名 | 端口 |
|---|---|---|---|---|---|
| 主库 | dm4 | 192.168.163.130 | 192.168.163.133 | dmprod1 | 5246 |
| 备库 | dm5 | 192.168.163.132 | 192.168.163.134 | dmprod2 | 5246 |
| 确认监视器 | dm1 | 192.168.163.128 | - | - |
端口规划:
| 端口类型 | 主库值 | 备库值 | 说明 |
|---|---|---|---|
| PORT_NUM | 5246 | 5246 | 数据库服务端口 |
| MAL_PORT | 61141 | 61141 | MAL系统通信端口 |
| MAL_DW_PORT | 52141 | 52141 | 守护进程通信端口 |
| MAL_INST_DW_PORT | 33141 | 33141 | 实例监听守护进程端口 |
分别在主备库上初始化实例:
#安装略,目录保持一致,增加了以下环境变量
export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
# 主库
dminit path=/dmdata/data page_size=32 instance_name=dmprod1 extent_size=32 log_size=2048 PORT_NUM=5246 sysdba_pwd=Dameng123 SYSAUDITOR_PWD=Dameng123
# 备库
dminit path=/dmdata/data page_size=32 instance_name=dmprod2 extent_size=32 log_size=2048 PORT_NUM=5246 sysdba_pwd=Dameng123 SYSAUDITOR_PWD=Dameng123
步骤1:初始化实例
#前台方式启动数据库
dmserver /dmdata/data/DAMENG/dm.ini
#配置归档
[dmdba@~]$ disql sysdba/"Dameng123"@localhost:5236
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdata/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
SQL> ALTER DATABASE OPEN;
SQL> checkpoint(100);
#DM[603]:no log generates while the backupset [/dmdata/dmbak/fullbak0611] created
#才开启归档,直接备份可能没有归档日志导致还原时失败,这里checkpoint下让归档落地
SQL> backup database backupset '/dmdata/dmbak/full_bak_0609'
#修改数据库配置
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5246);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);
#关闭实例
退出前台即可
步骤2:修改dmarch.ini,主要增加实时归档配置
[dmdba@~]$ vi /dmdata/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch/ #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = dmprod2 #实时归档目标实例名
步骤3:创建 dmmal.ini
[dmdba@~]$ vi /dmdata/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
MAL_TEMP_PATH = /dmdata/data/malpath/ #临时文件目录
MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB
MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB
MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩
[MAL_INST1]
MAL_INST_NAME = dmprod1 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 192.168.163.133 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.163.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5246 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = dmprod2
MAL_HOST = 192.168.163.134
MAL_PORT = 61141
MAL_INST_HOST = 192.168.163.132
MAL_INST_PORT = 5246
MAL_DW_PORT = 52141
MAL_INST_DW_PORT = 33141
SF_MAL_INST_ADD('MAL_INST3','dmprod3','192.168.163.136',61141,'192.168.163.135',5246,54141,0,33141);
ALTER DATABASE ADD ARCHIVELOG 'DEST=dmprod3, TYPE=REALTIME';
步骤4:创建dmwatcher.ini
[dmdba@~]$ vi /opt/dmdbms/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME = 20 #远程守护进程故障认定时间
INST_ERROR_TIME = 20 #本地实例故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /dmdata/data/DAMENG/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/DmServicedmprod1 start #服务名方式启动
#INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
步骤5:将备份配置传到备考
[dmdba@dm4 DAMENG]$ scp -r /dmdata/dmbak/full_bak_0609/ dmdba@192.168.163.132:/dmdata/dmbak/
#将dmserver和dmwatcher注册成systemd服务
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p dmprod1 -dm_ini /dmdata/data/DAMENG/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
[dmdba@~]$ dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/full_bak_0609'"
[dmdba@~]$ dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/full_bak_0609'"
[dmdba@~]$ dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
[dmdba@~]$ vi /dmdata/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch/ #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = dmprod1 #实时归档目标实例名
修改参数如下
INSTANCE_NAME = dmprod2
PORT_NUM = 5246 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志重演信息
#和主库配置一样即可
#将dmserver和dmwatcher注册成systemd服务
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p dmprod2 -dm_ini /dmdata/data/DAMENG/dm.ini -m mount
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
##A 机器
[dmdba@~]$ dmserver /dmdata/data/DAMENG/dm.ini mount
#另开窗口
[dmdba@~]$ disql sysdba/"Dameng123"@localhost:5246
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
##B 机器
[dmdba@~]$ /opt/dmdbms/bin/DmServiceGRP1_RT_02 start
[dmdba@~]$ /opt/dmdbms/bin/disql SYSDBA/*****@172.16.1.2:5236
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
##A/B机器分别执行
dmwatcher /dmdata/data/DAMENG/dmwatcher.ini
由于守护进程配置为自动切换模式(DW_MODE = AUTO),必须部署确认监视器来实现自动故障切换。
vi /home/dmdba/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /home/dmdba/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB
[GRP1]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
MON_DW_IP = 192.168.163.133:52141 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 192.168.163.134:52141
#注册服务
/home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini
配置非确认监视器:集群各节点的 bin 目录中,存放非确认监视器配置文件。
在配置监视器时,一般配置好确认监视器后,建议再配置一个非确认监视器的配置文件,在主备发生切换时,
可以通过前台的方式启动非确认监视器进行手动切换。非确认监视器是通过将监视器配置文件中 MON_DW_CONFIRM 参数值修改为 0 来实现,示例如下:
vi /home/dmdba/dmdbms/bin/dmmonitor_normal.ini
MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /home/dmdba/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB
[GRP1]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
MON_DW_IP = 192.168.163.133:52141 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 192.168.163.134:52141
| 命令 | 含义 |
|---|---|
list |
查看守护进程的配置信息 |
show global info |
查看所有实例组的信息 |
tip |
快速查看当前运行状态 |
login |
登录(执行切换操作前必须登录) |
logout |
退出登录 |
choose switchover GDW1 |
主库正常时,查看可切换为主库的备库列表 |
switchover GDW1.实例名 |
主库正常时,将指定实例切换为主库 |
choose takeover GDW1 |
主库故障时,查看可接管的备库列表 |
takeover GDW1.实例名 |
主库故障时,让指定备库接管 |
takeover force GDW1.实例名 |
强制接管,不管数据是否完整(慎用) |
重要提醒:启动顺序有严格要求,必须先启动数据库实例,再启动守护进程,最后启动监视器。
dmmonitor /home/dmdba/dmdbms/bin/dmmonitor
#如果观察无问题,实例open,状态一主一备,则退出监视器
#上面命令行启动的守护进程先退出备在退出主,数据库实例也是先退出主,在退出备
#然后用systemd启动服务,先主后备启动数据库实例,再先主后备启动守护进程,最后启动监视器
systemctl start DmServicedmprod1.service
systemctl start DmServicedmprod2.service
systemctl start DmWatcherServiceWatcher.service
systemctl start DmWatcherServiceWatcher.service
systemctl start DmMonitorServiceMonitor.service
达梦社区技术 https://eco.dameng.com
文章
阅读量
获赞
