达梦数据库数据守护实时主备集群的介绍与搭建过程
- 1、概述
- 2、主要功能
- 2.1 实时数据同步
- 2.2 主备库切换
- 2.3 自动故障处理
- 2.4 自动数据同步
- 2.5 备库接管
- 2.6 备库强制接管
- 3、实时主备搭建
- 3.1环境说明
- 3.2数据准备
- 1.正常关闭数据库
- 2.进行脱机备份
- 3.拷贝备份文件到备机
- 4.备机进行脱机数据库还原与恢复
- 3.3 配置主库DMDB1
- 3.3.1配置dm.ini
- 3.3.2配置dmmal.ini
- 3.3.3配置dmmal.ini
- 3.3.4配置dmwatcher.ini
- 3.3.5 mount配置模式启动主库
- 3.4 配置备库DMDB2
- 3.4.1配置dm.ini
- 3.4.2配置dmmal.ini
- 3.4.3配置dmmal.ini
- 3.4.4配置dmwatcher.ini
- 3.4.5 mount配置模式启动备库
- 3.5配置监视器
- 3.6启动守护进程
- 3.7启动监视器
- 3.8测试主备切换
1、概述
DM 数据守护(Data Watch)的实现原理很简单:将主库(生产库)产生的 Redo
日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。 DM数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
DM 数据守护系统结构参考图1。主要由主库、备库、 Redo 日志、 Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。
图1
主库:
Primary 模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。
备库:
Standby 模式,提供只读数据库服务的实例。备库除了用于容灾,还可以提供备份、查询等只读功能,并且备库还支持临时表的 Insert/Delete/Update 操作。
备库支持临时表修改主要基于两个因素: 1.临时表数据的修改不会产生 Redo 日志,
主库对临时表的修改无法同步到备库; 2.可以提供更大灵活性,适应更多应用场景。
根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主
备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库。
Redo 日志:
Redo 日志记录物理数据页内容变动情况,是数据库十分重要的一个功能,在数据库系统故障(比如服务器掉电)重启时,利用 Redo 日志可以把数据恢复到故障前的状态。Redo 日志也是数据守护的实现基础,数据库中 Insert、 Delete、 Update 等 DML操作以及 Create TABLE 等 DDL 操作最终都会体现为对某一个或者多个物理数据页的修改,因此备库通过重做 Redo 日志可以与主库数据保持一致。
Redo 日志传输:
主备库之间的 Redo 日志传输,以日志包 RLOG_PKG 为单位,主库通过 MAL 系统发送Redo 日志到备库。各种不同数据守护类型的区别,就在于主库日志包 RLOG_PKG的发送时机,以及备库收到 Redo 日志后的处理策略。
Redo 日志重演:
Redo 日志重演的过程,就是备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程。 Redo 日志重演由专门的 Redo 日志重演服务完成,重演服务严格按照Redo 日志产生的先后顺序,解析 Redo 日志、修改相应的物理数据页,并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。
守护进程:
守护进程(dmwatcher)是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
监视器:
监视器(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。
MAL 系统:
MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。
OGUID:
数据守护唯一标识码,配置数据守护时,需要由用户指定 OGUID 值。其中数据库的OGUID在 MOUNT 状态下由系统函数 SP_SET_OGUID 设置,守护进程和监视器的 OGUID值在配置文件中设定。
2、主要功能
2.1 实时数据同步
主备库通过实时归档完成数据同步,实时归档要求主库将 RLOG_PKG 发送到备库后,再将 RLOG_PKG 写入本地联机 Redo 日志文件。但要注意的是,备库确认收到主库发送的Redo 日志,并不保证备库已经完成重演这些 Redo 日志,因此主备库之间的数据同步存在一定的时间差。
2.2 主备库切换
主备库正常运行过程中,可以通过监视器的 Switchover 命令,一键完成主备库角色转换。主备库切换功能可以确保在软、硬件升级,或系统维护时,提供不间断的数据库服务。
2.3 自动故障处理
备库故障,不影响主库正常提供数据库服务,守护进程自动通知主库修改实时归档为Invalid 状态,将实时备库失效。
2.4 自动数据同步
备库故障恢复后,守护进程自动通知主库发送归档 Redo 日志,重新进行主备库数据同步。并在历史数据同步后,修改主库的实时归档状态为 Valid,恢复实时备库功能。备库接管后,原主库故障恢复,守护进程自动修改原主库的模式为 Standby,并重新作为备库加入主备系统。
2.5 备库接管
主库发生故障后,可以通过监视器的 Takeover 命令,将备库切换为主库,继续对外提供服务。如果配置为自动切换模式,确认监视器可以自动检测主库故障,并通知备库接管,这个过程不需要人工干预。
2.6 备库强制接管
如果执行 Takeover 命令不成功,但主库可能由于硬件损坏等原因无法马上恢复,为了及时恢复数据库服务, DM 提供了 Takeover Force 命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的(主库到备库的归档是 Valid状态),避免引发守护进程组分裂。
3、实时主备搭建
3.1环境说明
下列机器事先都安装了DM,安装路径为’/dm/’,执行程序保存在’/dm/dmdbms/bin’目录中,数据存放路径为’/dm/data’。
各主备库的实例名建议采用“组名_守护类型_序号”的方式命名,方便按组区分不同实例,注意总长度不能超过16。本示例中组名为“GRP1”,采用实时守护类型,主库命名为“DMDB1”,备库命名为“DMDB2”。
表1配置环境说明
机器名 | IP地址 | 初始状态 | 操作系统 | 备注 |
DM1 | 192.168.56.101;192.168.0.111 | 主库 DMDB1 | Linux dm1.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux | 192.168.56.101外部服务IP;192.168.0.111内部通信IP |
DM2 | 192.168.56.102;192.168.0.112 | 备库 DMDB1 | Linux dm2.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux | 192.168.56.102外部服务IP;192.168.0.112内部通信IP |
DW_M | 192.168.0.139 | 确认监视器 | Linux |
表2 端口规划
实例名 | PORT_NUM | DW_PORT | MAL_HOST | MAL_PORTMAL_DW_PORT | MAL_DW_PORT |
DMDB1 | 32141 | 32141 | 192.168.0.111 | 61141 | 52141 |
DMDB2 | 32141 | 32141 | 192.168.0.112 | 61141 | 52141 |
3.2数据准备
配置数据守护之前,必须先同步实例数据,确保两者保持完全一致;通过脱机备份、脱机还原的方式同步主库和备库数据。具体步骤包括:
1.正常关闭数据库
2.进行脱机备份
到bin目录下使用dmrman工具进行脱机备份。
RMAN> backup database '/dm/data/DAMENG/dm.ini' full backupset '/dm/fullbak';
3.拷贝备份文件到备机
4.备机进行脱机数据库还原与恢复
RMAN> restore database '/dm/data/DAMENG/dm.ini' from backupset '/dm/fullbak';
RMAN> recover database '/dm/data/DAMENG/dm.ini' from backupset '/dm/fullbak';
RMAN> recover database '/dm/data/DAMENG/dm.ini' update db_magic;
3.3 配置主库DMDB1
DM1机器上已初始化库至目录/dm/data:
/dminit path=/dm7/data INSTANCE_NAME=DMDB1;
3.3.1配置dm.ini
vi /dm/data/DAMENG/dm.ini
主要修改前面四个参数值。
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开 归档
ALTER_MODE_SATUS= 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS= 2 #不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
INSTANCE_NAME = DMDB1 #实例名
PORT_NUM = 32141 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
3.3.2配置dmmal.ini
主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
vi /dm/data/DAMENG/dmmal.ini;
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.111 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.56.101 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.112
MAL_PORT = 61141
MAL_INST_HOST = 192.168.56.102 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
3.3.3配置dmmal.ini
vi /dm/data/DAMENG/dmarch.ini
当前实例DMDB1是主库,需要向DMDB2(实时守护类型的备库)同步数据,因此实时归档的ARCH_DEST配置为DMDB2。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMDB2 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
3.3.4配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为实时守护类型,使用自动切换模式。
vi /dm/dmdbms/data/DAMENG/dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为实时守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
3.3.5 mount配置模式启动主库
./dmserver /dm/data/DAMENG/dm.ini mount
启动命令行工具DIsql,登录主库设置OGUID值。
SQL>sp_set_oguid(453331);
修改数据库模式为主库
SQL>alter database primary;
3.4 配置备库DMDB2
3.4.1配置dm.ini
vi /dm/data/DAMENG/dm.ini
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开 归档
ALTER_MODE_SATUS= 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS= 2 #不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
INSTANCE_NAME = DMDB2 #实例名
PORT_NUM = 32141 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
3.4.2配置dmmal.ini
主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
vi /dm/data/DAMENG/dmmal.ini;
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.111 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.56.101 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.0.112
MAL_PORT = 61141
MAL_INST_HOST = 192.168.56.102 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
3.4.3配置dmmal.ini
vi /dm/data/DAMENG/dmarch.ini
当前实例DMDB1是主库,需要向DMDB2(实时守护类型的备库)同步数据,因此实时归档的ARCH_DEST配置为DMDB2。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMDB1 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
3.4.4配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为实时守护类型,使用自动切换模式。
vi /dm/dmdbms/data/DAMENG/dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为实时守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
3.4.5 mount配置模式启动备库
./dmserver /dm/data/DAMENG/dm.ini mount
启动命令行工具DIsql,登录主库设置OGUID值。
SQL>sp_set_oguid(453331);
修改数据库模式为主库
SQL>alter database standby;
3.5配置监视器
由于主库和实时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。
vi /dm/data/DAMENG/dmwatcher.ini
MON_DW_Confirm = 1 #确认监视器模式
MON_LOG_PATH = /dm/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.0.111:52141
MON_DW_IP = 192.168.0.112:52141
3.6启动守护进程
启动各个主备库上的守护进程:
./dmwatcher /dm/data/DAMENG/dmwatcher.ini
守护进程启动后,进入Startup状态,此时实例都处于Mount状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例Open,并切换为Open状态。
3.7启动监视器
./dmmonitor /dm/data/dmmonitor.ini
监视器提供一系列命令,支持当前守护系统状态查看以及故障处理,可输入help命令,查看各种命令说明使用,结合实际情况选择使用。 至此实时守护类型的数据守护系统搭建完毕,在搭建步骤和各项配置都正确的情况下,在监视器上执行show命令,可以监控到所有实例都处于Open状态,所有守护进程也都处于Open状态,即为正常运行状态。
3.8测试主备切换
登陆监视器后 执行switchover DMDB2;
主备库切换成功。
3.9 主机中建表测试主备库数据是否能同步
切换回DMDB1主库、 DMDB2备库模式;
用户登录主库执行建表语句
CREATE TABLE T1(ID INT);
INSERT INTO T1 VALUES(1);
COMMIT;
其中 COMMIT 操作将触发实时归档,发送 RLOG_PKG 到备库 DMDB2。 备库 B 收到 RLOG_PKG,响应主库 A,并启动日志重演。
DISQL登陆备库查看T1表
数据存在,测试验证成功。