DM数据守护集群搭建
文章目录
一、概述
数据守护的实现原理:将主库(生产库)产生的 Redo日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。
DM数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。
DM数据守护的主要特性包括:
- 完整功能的主库
- 活动的备库
- 多重数据保护
- 高可用
- 多种守护模式
- 故障自动重连
- 故障库自动重加入
- 历史数据自动恢复
- 自动负载均衡
- 滚动升级
- 支持DMDSC守护
- …
二、系统结构图
DM数据守护系统主要由主库、备库、Redo日志、Redo日志传输、Redo日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成,其结构参考图如下。
三、基本概念
(1)主库
Primary 模式,提供完整数据库服务的实例,一般来说主库是用来直接支撑应用系统的生产库。
(2)备库
Standby 模式,提供只读数据库服务的实例。备库除了用于容灾,还可以提供备份、查询等只读功能,并且备库还支持临时表的 Insert/Delete/Update 操作。
根据数据同步情况,备库又可以分为可切换备库和不可切换备库。可切换备库是指,主备库之间数据完全同步,主库发生故障、备库切换为主库后,不会造成任何数据丢失的备库
(3)Redo日志
Redo 日志记录物理数据页内容变动情况,是数据库十分重要的一个功能,在数据库系统故障(比如服务器掉电)重启时,利用 Redo 日志可以把数据恢复到故障前的状态。
(4)Redo日志传输
主备库之间的 Redo 日志传输,以日志包 RLOG_PKG 为单位,主库通过 MAL 系统发送Redo 日志到备库。 各种不同数据守护类型的区别,就在于主库日志包RLOG_PKG 的发送时机,以及备库收到 Redo 日志后的处理策略。
(5)Redo日志重演
Redo 日志重演的过程,就是备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程。 Redo 日志重演由专门的 Redo 日志重演服务完成,重演服务严格按照Redo 日志产生的先后顺序,解析 Redo 日志、修改相应的物理数据页,并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。
(6)守护进程
守护进程(dmwatcher)是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
- 主要功能
守护进程是管理数据守护系统的核心部件,监视器(dmmonitor)负责发起命令,守护进程负责解析、处理、 转发命令。守护进程提供了数据库监控、故障检测、故障处理、故障恢复等各种功能
守护类型
守护进程支撑两种守护类型:本地守护和全局守护
守护模式
守护进程支持两种故障切换模式:故障自动切换和故障手动切换
故障自动切换
主库发生故障时,确认监视器自动选择一个备库,切换为主库对外提供服务。故障自动切换模式,要求必须且只能配置一个确认监视器。
故障手动切换
主库发生故障时, 由用户根据实际情况, 通过监视器命令将备库切换为主库。在用户干预之前,备库可以继续提供只读服务和临时表的操作。
守护状态
守护进程状态主要有:Startup、Open、Shutdown、Switchover、Failover、Recovery等
守护进程命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tk6vySa9-1658981122612)(D:\培训笔记\linux学习报告\6.png)]
(7)监视器
监视器(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。
(8)MAL系统
MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。
(9)OGUID
数据守护唯一标识码,配置数据守护时,需要由用户指定 OGUID 值。其中数据库的OGUID在 MOUNT 状态下由系统函数SP_SET_OGUID 设置,守护进程和监视器的 OGUID值在配置文件中设定。
(10)配置文件说明
- 数据库配置文件 dm.ini
- 数据库控制文件 dm.ctl
- MAL 配置文件 dmmal.ini
- Redo 日志归档配置文件 dmarch.ini
- 守护进程配置文件 dmwatcher.ini
- 监视器配置文件 dmmonitor.ini
- 定时器配置文件 dmtimer.ini
- MPP 控制文件 dmmpp.ctl 等等
各配置文件的存放路径:
- dm.ini 存放目录没有限制,一般直接放在数据库目录中。
- dmmal.ini 、 dmarch.ini 、 dmtimer.ini 存 放 目 录 由 dm.ini 的
CONFIG_PATH 配置项指定 - dmwatcher.ini 存放目录没有限制,一般和 dm.ini 存放在同一个目录。
- dmmonitor.ini 存放目录没有限制,一般和 dm.ini 存放在同一个目录。
- dm.ctl 存放目录由 dm.ini 的 CTL_PATH 配置项指定。
- dmmpp.ctl 存放目录由 dm.ini 的 SYSTEM_PATH 配置项指定。
四、数据守护搭建
(一)配置实时主备
1、环境说明
准备三台机器 DW_P、 DW_S、 DW_M。
DW_P 和 DW_S 用来部署主备库,DW_M 用来部署确认监视器。其中 DW_P 和 DW_S 配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机, DW_M 接入内部网络。
指路==》 双网卡配置教程:https://blog.csdn.net/qq_44619675/article/details/125914854
三台机器都事先安装了 DM,我的安装路径为’/dm8’,执行程序保存在’/dm8/bin’目录中,数据存放路径为’/dm8/data’。
(1)配置环境说明
机器名 | IP地址 | 初试状态 | 操作系统 |
---|---|---|---|
DW_P | 192.168.175.121(外网) 192.168.157.121(内网) | 主库 DMDB1 | CentOS-7-x86_64-DVD-2009 |
DW_S | 192.168.175.122(外网) 192.168.157.122(外网) | 备库 DMDB2 | CentOS-7-x86_64-DVD-2009 |
DW_M | 192.168.157.123(内网) | 确认监视器 | CentOS-7-x86_64-DVD-2009 |
(2)端口规划
实例名 | PORT_NUM | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
---|---|---|---|---|---|
DMDB1 | 32141 | 32141 | 192.168.157.121 | 61141 | 52141 |
DMDB2 | 32142 | 32142 | 192.168.157.122 | 61142 | 52142 |
2、数据准备
-
配置数据守护之前,必须先通过备份还原方式同步各数据库的数据,确保各数据的数据保持完全一致。 主库可以是新初始化的数据库, 也可以是正在生产、使用中的数据库。备库在备份还原前, 需要先准备初始化一个新库。
不能使用分别初始化库或者直接拷贝数据文件的方法来直接配置数据库守护。
-
如果是初始搭建环境,可以通过对主库脱机备份、对备库脱机还原的方式来准备数据,如果主库已经处于运行状态,则可以对主库进行联机备份、 对备库脱机还原的方式来准备数据。
两种方式(即脱机和联机备份还原)都需要服务器配置本地归档
(1)脱机备份还原
-
正常关闭主机(主库+备库)数据库
指路 ==》 Linux安装DM数据库保姆级教程:https://blog.csdn.net/qq_44619675/article/details/125781019
-
主库进行脱机备份
① 进入DM安装目录的bin目录下
cd /dm8/bin
② 执行bin目录下的dmrman工具,进行脱机备份
- 打开dmrman工具
./dmrman.sh
- 脱机备份
backup database '/dm8/data/DAMENG/dm.ini' full backupset '/dm8/fullbak';
-
备库拷贝主库备份文件
scp -r 192.168.175.111:/dm8/fullbak /dm8/
IP地址是配置的主库的外网IP地址(192.168.175.111)
IP地址后面的路径是主库备份的文件路径(/dm8/fullbak)
最后的路径是拷贝在当前库的文件保存路径(/dm8/)
注:这种是备库远程拷贝主库的方式,还有从本地拷贝至远程主机的方式,教程指路:https://blog.csdn.net/phmatthaus/article/details/124674393
- 备库进行脱机数据还原与恢复
注:进行脱机还原与恢复之前必须保证备库的数据库是正常关闭的状态
① 进入DM安装目录下的bin目录下
② 执行bin目录下的dmrman工具,进行备份还原与恢复
restore database '/dm8/data/DAMENG/dm.ini' from backsupset '/dm8/fullbak';
recover database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/fullbak';
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;
(2)联机备份还原
稍后学习补充
3、配置主库
主库机器上初始化库至目录/dm8/data(安装DM数据库时已初始化过的话便可忽略此步骤)
./dminit path=/dm8/data INSTANCE_NAME=DMDB1
(1)配置dm.ini
vi /dm8/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 #接收守护进程消息超时时间
(2)配置dmmal.ini
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP, MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
vi /dm8/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.157.121 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.175.121 #实例的对外服务 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.157.122
MAL_PORT = 61142
MAL_INST_HOST = 192.168.175.122 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
(3)配置dmarch.ini
修改 dmarch.ini,配置本地归档和实时归档。除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时, 需要同步归档数据的目标实例名。
当前实例 DMDB1是主库,需要向 DMDB2(实时备库)同步数据,因此实时归档的 ARCH_DEST 配置为 DMDB2。
vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMDB2 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
(4)配置dmwatcher.ini
修改 dmwatcher.ini 配置守护进程,配置为全局守护类型,使用自动切换模式。
vi /dm8/data/DAMENG/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 = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
(5)启动主库
以Mount方式启动主库:
./dmserver /dm8/data/DAMENG/dm.ini mount
注:一定要以 Mount 方式启动数据库实例, 否则系统启动时会重构回滚表空间,生成 Redo 日志; 并且, 启动后应用可能连接到数据库实例进行操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
(6)设置OGUID
启动命令行工具Disql,登录主库设置OGUID值。
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 值。
(7)修改数据库模式
启动命令行工具Disql,登录主库修改数据库为Primar模式
SQL>alter database primary;
4、配置备库
(1)配置dm.ini
vi /dm8/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 #接收守护进程消息超时时间
(2)配置dmmal.ini
配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP, MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值,MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
vi /dm8/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.157.121 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.175.121 #实例的对外服务 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.157.122
MAL_PORT = 61142
MAL_INST_HOST = 192.168.175.122 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
(3)配置dmarch.ini
修改 dmarch.ini,配置本地归档和实时归档。除了本地归档外, 其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需要同步归档数据的目标实例名。
当前实例 DMDB2 是备库,守护系统配置完成后, 可能在各种故障处理中,DMDB2 切换为新的主库,正常情况下, DMDB1 会切换为新的备库, 需要向DMDB1 同步数据,因此实时归档的 ARCH_DEST 配置为DMDB1。
vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMDB1 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
(4)配置dmwatcher.ini
修改 dmwatcher.ini 配置守护进程, 配置为全局守护类型,使用自动切换模式。
vi /dm8/data/DAMENG/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 = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
(5)启动备库
以Mount方式启动备库
./dmserver /dm8/data/DAMENG/dm.ini mount
注:一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作, 破坏主备库的数据一致性。数据守护配置结束后, 守护进程会自动 Open 数据库。
(6)设置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);
注:系统通过 OGUID 值确定一个守护进程组,由用户保证 OGUID 值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的 OGUID 值
(7)修改数据库模式
启动命令行工具 DIsql,登录备库修改数据库为 Standby 模式。
如果当前数据库不是 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步
5、配置监视器
配置监视器时可以选择配置单实例监视器或配置多实例监视器,我这里就配置单实例监视器。
由于主库和实时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。
==注:==故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一 个。
vi /dm8/data/dmmonitor.ini
修改 dmmonitor.ini 配置确认监视器, 其中 MON_DW_IP 中的 IP 和 PORT 和dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。
MON_DW_Confirm = 1 #确认监视器模式
MON_LOG_PATH = /dm8/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.157.121:52141
MON_DW_IP = 192.168.157.122:52142
6、启动守护进程
启动各个主备库上的守护进程:
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例Open,并切换为 Open 状态。
7、启动监视器
启动监视器
./dmmonitor /dm8/data/dmmointor.ini
监视器提供一系列命令,支持当前守护系统状态查看以及故障处理,可输入 help 命令,查看各种命令使用说明,结合实际情况选择使用。
至此一主一备的实时数据守护系统搭建完毕, 在搭建步骤和各项配置都正确的情况下,在监视器上执行 show 命令,可以监控到所有实例都处于 Open 状态, 所有守护进程也都处于 Open 状态,即为正常运行状态。