一、守护集群原理和架构
DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案,可以在硬件故障(如磁盘损坏)、自然灾害(地震、火灾)等极端情况下,避免数据损坏、丢失,保障数据安全,与常规数据库备份、还原技术相比,可以在秒级时间内完成主备 切换,且几乎对业务无影响。
守护集群的搭建共需要三台服务器,分别用来承载主机、备机和监视器;备库与主库的数据同步通过将主库(生产库)产生的 REDO 日志传输到备库,备库接收并重新应用 REDO 日志而实现。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 REDO 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
Prinmry database:主库,提供完整数据库服务的实例,一般为生产库;
Standby database:备库,提供只读数据库服务的实例,除了用于容灾,还可以提供备份、查询等只读功能。且支持临时表的Insert/Delete/Update操作;
Online redo log:记录物理数据页面内容变动情况,在数据库系统故障时,可以利用redo log把数据库恢复到故障前的数据,主库MAL系统发送redo日志到备库,使备库数据保持与主库一致;
Log replay service:redo日志重演服务,就是备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程,重演服务严格按照 Redo 日志产生的先后顺序,解析 Redo 日志、修改相应的物理数据页,并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。
dmwatcher:守护进程,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案;2同时也是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
dmmonitor:监控数据守护系统,显示主备数据库的状态变化和故障切换的过程,方便咋主备切换前确认主库确实异常,防止出现因网络波动造成的脑裂,且可以在监视器上启动或停止守护进程的监控功能。
二、守护集群搭建
1、部署前准备:
1.1资源准备:三台服务器,分别用来运行主机、备机和监视器,并分别完成三台服务器数据库服务的安装
1.2硬件环境检查:
1检查操作系统:安装统一版本的操作系统,确保系统各节点版本以及内核版本一致
- CPU:确保各节点服务器的 CPU 一致
- 网络环境:为保证mal系统的处理能力,尽量使用千兆或千兆以上网络;使用两个交换机构建内网,以实现冗余和负载均衡;建议服务器采用两个网卡绑定为一个逻辑网卡来使用(比如 bond 方式)
- 磁盘IO:IO性能应满足系统功能和性能需求,在守护集群,尤其是生产系统中,推荐使用高性能 SSD 磁盘,以获得更佳性能,保证集群数据的实时同步
2、集群搭建:
完成三个服务器即虚拟机的创建,分别安装好数据库服务:
主库:192.168.126.15/20
备库:192.168.126.16/19
监视器:192.168.126.18/21
2.1主库配置:
实例初始化
[dmdba@~]$ /home/dmdba/dmdbms/bin/dminit PATH=/home/dmdba/dmdbms/data/ INSTANCE_NAME=GRP1_RT_1 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048
启动服务
[dmdba@~]$ /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini
前台启动服务后,进程不会结束,出现“SYSTEM IS READY”即表示启动成功,可以另外开启一个窗口登录数据库,启动服务的窗口需一直保持打开状态,窗口关闭服务停止。
登录数据库
[dmdba@~]$ cd /home/dmdba/dmdbms/bin/
[dmdba@~]$ ./disql SYSDBA/SYSDBA:5236
开启归档
[dmdba@~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/SYSDBA:5236
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/home/dmdba/dmdata/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
SQL> ALTER DATABASE OPEN;
PS:’/home/dmdba/dmdata/arch’目录为数据库安装时创建的归档保存目录,若不存在可自行创建归档保存位置。
备份数据
SQL>BACKUP DATABASE BACKUPSET '/home/dmdba/dmdata/dmbak/BACKUP_FILE';
PS:’/home/dmdba/dmdata/dmbak/'目录为安装数据库时创建的备份保存目录,若不存在可自行创建备份保存位置。
修改dm.ini
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236); 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);
关闭前台服务,即SQL>exit退出
修改dmarch.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dmdata/arch/ #本地归档存放路径,数据库安装时创建
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_2 #实时归档目标实例名
修改dmmal.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
MAL_TEMP_PATH = /home/dmdba/dmdbms/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 = GRP1_RT_1 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 192.168.126.15 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 172.16.126.15 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_2
MAL_HOST = 192.168.126.16
MAL_PORT = 5336
MAL_INST_HOST = 172.16.126.16
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
创建dmwatcher.ini
[dmdba@~]$ vi /home/dmdba/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 = /home/dmdba/dmdbms/data/DAMENG/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
拷贝备份文件到B机器
[dmdba@~]$ scp -r /home/dmdba/dmdata/dmbak/BACKUP_FILE dmdba@192.168.126.16:/home/dmdba/dmdata/dmbak
注册服务(root用户执行)
[root@~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_1 -dm_ini /home/dmdba/dmdbms/data/DAMENG/dm.ini -m mount
[root@~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdba/dmdbms/data/DAMENG/dmwatcher.ini
2.2备机配
实例初始化
[dmdba@~]$ /home/dmdba/dmdbms/bin/dminit PATH=/home/dmdba/dmdbms/data/ INSTANCE_NAME=GRP1_RT_2 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048
恢复数据(在安装目录下的bin目录下执行)
[dmdba@localhost bin]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/home/dmdba/dmdata/dmbak/BACKUP_FILE'"
[dmdba@localhost bin]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/home/dmdba/dmdata/dmbak/BACKUP_FILE'"
[dmdba@localhost bin]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
替换dmarch.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dmdata/arch/ #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_1 #实时归档目标实例名
配置dm.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dm.in
INSTANCE_NAME = GRP1_RT_2
PORT_NUM = 5236 #数据库实例监听端口
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 次的日志重演信息
配置dmmal.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
MAL_TEMP_PATH = /home/dmdba/dmdbms/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 = GRP1_RT_1 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 192.168.126.15 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 172.16.126.15 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_2
MAL_HOST = 192.168.126.16
MAL_PORT = 5336
MAL_INST_HOST = 172.16.126.16
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
配置dmwatcher.ini
[dmdba@~]$ vi /home/dmdba/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 = /home/dmdba/dmdbms/data/DAMENG/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
注册服务(root用户执行)
[root@~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_2 -dm_ini /home/dmdba/dmdbms/data/DAMENG/dm.ini -m mount
[root@~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /home/dmdbadmdbms/data/DAMENG/dmwatcher.ini
2.2配置确认监视器
创建dmmonitor.in
[dmdba@~]$ vi /home/dmdba/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = ../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.126.15:5436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 192.168.126.16:5436
2.3配置非确认监视器
集群各节点的 bin 目录中,存放非确认监视器配置文件。
在配置监视器时,一般配置好确认监视器后,建议再配置一个非确认监视器的配置文件,在主备发生切换时,可以通过前台的方式启动非确认监视器进行手动切换。非确认监视器是通过将监视器配置文件中 MON_DW_CONFIRM 参数值修改为 0 来实现
创建dmmonitor.ini
[dmdba@~]$ vi /home/dmdba/dmdbms/bin/dmmonitor_manual.ini
MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = ../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.126.15:5436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 192.168.126.16:5436
注册服务(root身份执行)
[root@~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini
3、启动服务
启动主机
[dmdba@~]$ /home/dmdba/dmdbms/bin/DmServiceGRP1_RT_1 start
[dmdba@~]$ cd /home/dmdba/dmdbms/bin/
[dmdba@~]$ ./disql sysdba/SYSDBA@172.16.126.15:5236
修改参数
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);
启动备机
[dmdba@~]$ /home/dmdba/dmdbms/bin/DmServiceGRP1_RT_2 start
[dmdba@~]$ /home/dmdba/dmdbms/bin/disql sysdba/SYSDBA@172.16.126.16: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);
启动守护进程
/home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start