目录
实时主备搭建
前言
DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数 据库异地容灾的首选方案。通过部署 DM 数据守护,可以在硬件故障(如磁盘损坏)、自然 灾害(地震、火灾)等极端情况下,避免数据损坏、丢失,保障数据安全,并且可以快速恢复数据库服务,满足用户不间断提供数据库服务的要求。与常规的数据库备份(Backup)、还原(Restore)技术相比,数据守护可以更快地恢复数据库服务。随着数据规模不断增长,通过还原手段恢复数据,往往需要数个小时、甚至更长时间,而数据守护基本不受数据 规模的影响,只需数秒时间就可以将备库切换为主库对外提供数据库服务。
DM数据守护提供多种解决方案,可以配置成实时主备、MPP主备、DMDSC主备或读写分离集群,满足用户关于系统可用性、数据安全性、性能等方面的综合需求,有效降低总体投入,获得超值的投资回报。
实时主备由一个主库以及一个或者多个配置了实时(Realtime)归档的备库组成,其 主要目的是保障数据库可用性,提高数据安全性。实时主备系统中,主库提供完整的数据库 功能,备库提供只读服务。主库修改数据产生的Redo日志,通过实时归档机制,在写入联 机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束后,就可以切换为主库对外提供数据库服务。
概述
DM 数据守护(DM Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
DM 数据守护系统结构参考图如下:主要由主库、备库、Redo 日志、Redo 日志传输、Redo日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。
主库
Primary模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。
备库
Standby 模式,提供只读数据库服务的实例。备库除了用于容灾,还可以提供备份、查询等只读功能,并且备库还支持临时表的Insert/Delete/Update 操作。
备库支持临时表修改主要基于两个因素:
- 临时表数据的修改不会产生 Redo日志,主库对临时表的修改无法同步到备库;
- 可以提供更大灵活性,适应更多应用场景。
根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库。
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)用来监控守护系统内守护进程、数据库实例信息,执行用户输 入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。
实时主备
主要功能:
- 实时数据同步
主备库通过实时归档完成数据同步,实时归档要求主库将 RLOG_PKG 发送到备库后,再将 RLOG_PKG 写入本地联机 Redo 日志文件。但要注意的是,备库确认收到主库发送的Redo 日志,并不保证备库已经完成重演这些 Redo 日志,因此主备库之间的数据同步存在一定的时间差。
- 主备库切换
主备库正常运行过程中,可以通过监视器的 Switchover 命令,一键完成主备库角色转换。主备库切换功能可以确保在软、硬件升级,或系统维护时,提供不间断的数据库服务。
- 自动故障处理
备库故障,不影响主库正常提供数据库服务,守护进程自动通知主库修改实时归档为 Invalid 状态,将实时备库失效。
- 自动数据同步
备库故障恢复后,守护进程自动通知主库发送归档 Redo 日志,重新进行主备库数据同步。并在历史数据同步后,修改主库的实时归档状态为 Valid,恢复实时备库功能。
备库接管后,原主库故障恢复,守护进程自动修改原主库的模式为 Standby,并重新作为备库加入主备系统
- 备库接管
主库发生故障后,可以通过监视器的 Takeover 命令,将备库切换为主库,继续对外提供服务,如果配置为自动切换模式,确认监视器可以自动检测主库故障,并通知备库接管,不需要人工干预。
- 备库强制接管
如果执行 Takeover 命令不成功,但主库可能由于硬件损坏等原因无法马上恢复,为了及时恢复数据库服务,DM 提供了 Takeover Force 命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的(主库到备库的归档是 Valid状态),避免引发守护进程组分裂。
- 读写分离访问
在备库查询的实时性要求不高的条件下,实时主备也可以配置接口的读写分离属性访问,实现读写分离功能特性。
归档流程
实时归档是实时主备数据同步的基础,其流程如下图所示:
主库生成联机 Redo 日志,当触发日志写文件操作后,日志线程先将 RLOG_PKG 发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合法则返回错误信息,合法则作为 KEEP_PKG 保留在内存中,原有 KEEP_PKG 的 Redo 日志加入 Apply 任务队列进行 Redo 日志重演,并响应主库日志接收成功。当有多个备库时,主库需要收到所有备库的响应消息才继续后续操作。
配置实时主备
配置实时主备,有以下几种配置方案,可以根据实际情况部署:
- 只配置主库和最多 8 个实时备库
- 只配置主库和最多 8 个异步备库
- 配置主库、最多 8 个实时备库,和最多 8 个异步备库
数据库软件安装
创建DM用户
修改/etc/security/limits.conf修改用户限制
dmdba soft nproc 10240
dmdba hard nproc 10240
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba hard data unlimited
dmdba soft data unlimited
dmdba hard fsize unlimited
dmdba soft fsize unlimited
dmdba soft core unlimited
dmdba hard core unlimited
此处选择静默安装
备库主机相同操作,此处省略
DW_P 机器上初始化主库至目录/dm8/data
./dminit path=/dm8/data page_size=32 extent_size=32 case_sensitive=N charset=1 instance_name=GRP1_RT_01
DW_S1 机器上初始化备库至目录/dm8/data
数据准备
启动一次主机
(前台启动:会详细显示启动过程,system is ready 就完成启动)
启动之后,exit关闭
进行脱机备份
./dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/data/BACKUP_FILE_01'"
拷贝备份文件到备库所在机器
scp -r BACKUP_FILE_01/ root@192.168.6.101:/dm8/data
执行脱机数据库还原与恢复
./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE_01'"
因为脱机备份没有产生任何 REDO 日志,所以此处省略恢复数据库的操作步骤。
数据库更新
./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
配置主库 GRP1_RT_01
1.配置 dm.ini,打开 ARCH_INI 参数
在 DW_P 机器上配置主库的实例名为 GRP1_RT_01,dm.ini 参数修改如下:
参数 | 设置 | 备注 |
INSTANCE_NAME | GRP1_RT_01 | |
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 次的日志发送信息 |
2.配置 dmmal.ini
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致,MAL_HOST 使用内部网络IP,MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
参数 | 设置 | 备注 |
MAL_CHECK_INTERVAL | 5 | MAL 链路检测时间间隔 |
MAL_CONN_FAIL_INTERVAL | 5 | 判定 MAL 链路断开的时间 |
[MAL_INST1] | ||
MAL_INST_NAME | GRP1_RT_01 | 实例名,和 dm.ini 中的 INSTANCE_NAME 一致 |
MAL_HOST | 192.168.6.200 | MAL 系统监听 TCP 连接的 IP 地址 |
MAL_PORT | 61141 | MAL 系统监听 TCP 连接的端口 |
MAL_INST_HOST | 192.168.6.100 | 实例的对外服务 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 | GRP1_RT_02 | 实例名,和 dm.ini 中的 INSTANCE_NAME 一致 |
MAL_HOST | 192.168.6.201 | MAL 系统监听 TCP 连接的 IP 地址 |
MAL_PORT | 61142 | MAL 系统监听 TCP 连接的端口 |
MAL_INST_HOST | 192.168.6.101 | 实例的对外服务 IP 地址 |
MAL_INST_PORT | 5236 | 实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 |
MAL_DW_PORT | 52142 | 实例本地的守护进程监听 TCP 连接的端口 |
MAL_INST_DW_PORT | 33142 | 实例监听守护进程 TCP 连接的端口 |
3.配置 dmarch.ini
参数 | 设置 | 备注 |
[ARCHIVE_REALTIME] | ||
ARCH_TYPE | REALTIME | 实时归档类型 |
ARCH_DEST | GRP1_RT_02 | 实时归档目标实例名 |
[ARCHIVE_LOCAL1] | ||
ARCH_TYPE | LOCAL | 本地归档类型 |
ARCH_DEST | /dm8/data/DAMENG/arch | 本地归档文件存放路径 |
ARCH_FILE_SIZE | 128 | 单位 Mb,本地单个归档文件最大值 |
ARCH_SPACE_LIMIT | 0 | 单位 Mb,0 表示无限制,范围 1024~2147483647M |
4.配置 dmwatcher.ini
修改 dmwatcher.ini 配置守护进程,配置为全局守护类型,使用自动切换模式。
参数 | 设置 | 备注 |
DW_TYPE | GLOBAL | 全局守护类型 |
DW_MODE | AUTO | 自动切换模式 |
DW_ERROR_TIME | 10 | 远程守护进程故障认定时间 |
INST_RECOVER_TIME | 60 | 主库守护进程启动恢复的间隔时间 |
INST_ERROR_TIME | 10 | 本地实例故障认定时间 |
INST_OGUID | 453331 | 守护系统唯一 OGUID 值 |
INST_INI | /dm8/data/DAMENG/dm.ini | dm.ini 配置文件路径 |
INST_AUTO_RESTART | 1 | 打开实例的自动启动功能 |
INST_STARTUP_CMD | /dm8/dmdba/dmdbms/bin/dmserver | 命令行方式启动 |
RLOG_SEND_THRESHOLD | 0 | 指定主库发送日志到备库的时间阈值,默认关闭 |
RLOG_APPLY_THRESHOLD | 0 | 指定备库重演日志的时间阈值,默认关闭 |
启动主库
以mount方式启动主库
./dmserver /dm8/data/DAMENG/dm.ini mount
一定要以 mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 open 数据库。
设置 OGUID
启动命令行工具 disql,登录主库设置 OGUID 值
./disql SYSDBA/SYSDBA:5236
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL>sp_set_oguid(453331);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并
确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值。
修改数据库模式
启动命令行工具 DIsql,登录主库修改数据库为 Primary 模式
SQL>alter database primary;
配置备库 GRP1_RT_02
将主库的配置文件scp到备库
需要修改:
dmarch.ini
ARCH_DEST = GRP1_RT_01
dm.ini
INSTANCE_NAME = GRP1_RT_02
不修改dmwatcher.ini,dmmal.ini
启动备库
以 mount 方式启动备库
./dmserver /dm8/data/DAMENG/dm.ini mount
设置 OGUID
启动命令行工具 DIsql,登录备库设置 OGUID 值为 453331
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL>sp_set_oguid(453331);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式
如果当前数据库不是 Normal 模式,需要先修改 dm.ini 中 ALTER_MODE_STATUS 值 为 1,允许修改数据库模式,修改 Standby 模式成功后再改回为 0。如果是 Normal 模式, 请忽略下面的第 1 步和第 3步
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); //第 1 步
SQL>alter database standby; //第 2 步
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); //第 3 步
配置监视器
由于主库和实时备库的守护进程配置为自动切换模式,因此这里必须配置确认监视器。 和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知 实时备库接管为新的主库,具有自动故障处理的功能。
修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP 和 PORT 和 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致
启动监视器
./dmmonitor /dm8/data/DAMENG/dmmonitor.ini
分别在主机和备机,启动守护
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
数据库实例
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p GRP1_RT_01
./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DAMENG/dm.ini -p GRP1_RT_02
达梦云适配技术社区
https://eco.dameng.com/