之前整理的几篇博客如下:
DM7 达梦 数据库 数据守护(Data Watch) (1) — 基本概念
https://www.cndba.cn/dave/article/3665
DM7 达梦 数据库 数据守护(Data Watch) (2) — 主备类型
https://www.cndba.cn/dave/article/3666
DM7 达梦 数据库 数据守护(Data Watch) (3) — 守护进程
https://www.cndba.cn/dave/article/3667
1 监视器概述
监视器(dmmonitor)是基于监视器接口实现的一个命令行工具,是 DM 数据守护系统的重要组成部分。
通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态、以及主备库数据同步情况等信息。同时,监视器(dmmonitor)还提供了一系列命令来管理数据守护系统。
监视器的基本作用如下:
1)监控数据守护系统
接收守护进程发送的消息,显示主、备数据库状态变化,以及故障切换过程中,数据库模式、状态变化的完整过程。
2)管理数据守护系统
用户可以在监视器上输入命令,启动、停止守护进程的监控功能,执行主备库切换、备库故障接管等操作。
3)确认状态信息
用于故障自动切换的数据守护系统中,主、备库进行故障处理之前,需要通过监视器进行信息确认,确保对应的备库或者主库是真的产生异常了,避免主备库之间网络故障引发脑裂。
4)发起故障自动接管命令
用于故障自动切换的数据守护系统中,主库发生故障时,挑选符合接管条件的备库,并通知备库执行接管操作。
对于实时主备和读写分离集群,监视器只允许配置一个守护进程组;MPP 主备允许配置多组,并且要求这些组的主库必须是同一套 MPP 系统;
对于本地守护类型,允许和实时主备/读写分离集群/MPP 主备配置到同一组作为异步备库,如果不作为某个实例的异步备库,只是普通的单机配置为本地守护类型,则需要单独成组,并且监视器也不允许配置多组。
2 监视器类型
监视器支持两种运行模式:监控模式和确认模式。监视器运行模式由配置文件(dmmonitor.ini)的 MON_DW_CONFIRM 参数来确定。MON_DW_CONFIRM 参数的默认值是 0,表示监控模式;MON_DW_CONFIRM 参数值为 1 时,表示监视器运行在确认模式下。
为了区分监视器的两种模式,我们将运行在确认模式下的监视器称为确认监视器。
2.1 监控模式
一个数据守护系统中,最多允许同时启动 10 个监视器,所有监视器都可以接收守护进程消息,获取守护系统状态。所有监视器都可以发起 Switchover 等命令,但守护进程一次只能接收一个监视器的命令,在一个监视器命令执行完成之前,守护进程收到其他监视器发起的请求,会直接报错返回。
2.2 确认模式
和监控模式一样,确认监视器接收守护进程消息,获取数据守护系统状态,也可以执行各种监控命令。区别在于,除了具备监控模式监视器所有功能之外,确认监视器还具有状态确认和自动接管两个功能。此外,一个数据守护系统中,只能配置 1 个确认监视器。故障自动切换模式的数据守护系统,必须部署一个确认监视器,否则在出现实例故障时,会导致数据库服务中断。
3 状态确认
故障自动切换模式数据守护系统中,主库守护进程监测到备库故障时,需要向确认监视器求证,确认备库是真的故障了,再启动故障处理流程将归档失效,避免引发脑裂。比如,主库网络故障,主库直接将归档失效继续以 Primary 模式提供服务;同时,确认监视器认为主库故障,将备库切换为 Primary 模式,守护进程组中同时出现多个主库,引发脑裂。
状态确认只对故障自动切换数据守护系统有效,手动切换模式下,不需要状态确认。主库守护进程在满足一定条件时,会切换到 Confirm 状态,向确认监视器进行求证。
主库守护进程切换到 Confirm 之后,根据不同的场景决定是否切换为 Failover 状态并启动故障处理流程,这里列举出几种常见的场景处理(注意前提是主库的守护进程已经处于 Confirm 状态):
1.主库网络故障,主库到备库、主库到确认监视器的连接异常。这种情况下主库守护进程,一直保持 Confirm 状态,不会启动故障处理流程。
2.备库故障或者备库网络故障,主库守护进程会切换为 Failover 状态,启动故障处理流程。
3.主备库之间网络故障,但与确认监视器之间的网络正常,确认监视器确认主库满足Failover 执行条件,主库守护进程会切换为 Failover 状态,启动故障处理流程,否则主库守护进程一直保持在 Confirm 状态。
4 自动接管
故障自动切换模式下,确认监视器检测到主库故障后,根据收到的主备库 LSN、归档状态、MAL 链路状态等信息,确定一个接管备库,并将其切换为主库。确认监视器启动自动接管流程的主要场景有三种,任何一种都会导致备库自动接管。场景如下:
1.主库数据库实例异常终止,主库守护进程正常。
2.主库硬件故障、或者数据库实例和守护进程同时故障。
3.主库网络故障,主备库之间、主库与监视器之间连接异常。
若想实现备库自动接管,主库,归档状态,备库都必须符合一定条件才行。条件如下:
主库:
- 主库是 Primary 模式、Open 状态时,产生故障。
- 主库守护进程故障,故障前是 Open/Recovery 状态。
- 故障主库与接管备库和确认监视器之间的 MAL 链路断开。
归档状态:
故障主库到接管备库的归档状态为 Valid。
备库:
接管备库是 Standby 模式、Open 状态;接管备库的 dmwatcher.ctl 控制文件状态为 Valid;故障主库和接管备库的 dmwatcher.ctl 控制文件相同。
如果主库故障前,正在执行 Switchover/Takeover 等命令,则备库不会自动接管,需要人工干预。
确认监视器要求一开始就启动,保证出现故障情况时,确认监视器已经收到了故障主库或备库的历史消息,否则会因为条件不足无法自动处理,需要通过命令方式人工干预。
确认监视器不要和主库部署在一台机器上,避免主库网络故障时,备库无法自动切换为主库。
确认监视器不要和备库部署在一台机器上,避免主备库之间网络异常时,确认监视器误认为主库故障,将备库切换为主库,引发双主问题。
5 监视器 LOG 日志
监视器 LOG 日志,记录监视器自己的信息和守护进程的本地信息,在 LOG 日志中分别[monitor] 和 [ 守护进程对应的实例名 ] 开头。监视器 LOG 日志的命名格式为“dmmonitor_年月日时分秒.log”,例如“dmmonitor_20160418230523.log”。LOG日志的路径通过 dmmonitor.ini 文件中 MON_LOG_PATH 来设置。
6 监视器命令
监视器提供以下命令来管理守护系统:
命令 | 含义 |
---|---|
系统全局命令 | |
help | 显示帮助信息 |
exit | 退出监视器 |
show version | 显示监视器自身版本信息 |
show [group_name] | 显示指定组的实例信息,如果未指定组名,则显示所有组信息 |
show i[nterval] n | 每隔n秒自动显示所有组的实例信息 |
q | 取消自动显示 |
list [[group_name.]inst_name] | 列出指定组的实例对应的守护进程配置信息,如果都未指定,则列出所有守护进程配置信息 |
show dmwatcher ctl [group_name.] inst_name | 显示指定守护进程的控制文件内容 |
show arch send info [group_name.]inst_name | 查看源实例到指定组的指定实例的归档同步信息(包含恢复间隔信息) |
show apply info [group_name.]inst_name | 查看指定组的指定实例的日志重演信息 |
show monitor [group_name[.]] [inst_name] | 列出连接到指定守护进程的所有监视器信息 |
tip | 查看系统当前运行状态 |
login | 登录监视器 |
logout | 退出登录 |
以组为单位执行的命令 | |
startup dmwatcher [group_name] | 启动指定组的守护进程监控功能 |
stop dmwatcher [group_name] | 关闭指定组的守护进程监控功能 |
startup instance [group_name] | 启动指定组的实例 |
stop instance [group_name] | 关闭指定组的实例 |
kill instance [group_name] | 强制杀掉指定组中的活动实例 |
choose switchover [group_name] | 选择可切换为Primary实例的实例列表 |
choose takeover [group_name] | 选择可接管故障Primary实例的实例列表 |
choose takeover force [group_name] | 选择可强制接管故障Primary实例的实例列表 |
set group [group_name] para_name value | 修改指定组的所有守护进程的指定配置参数(同时修改ini文件和内存值),如果未指定组名,则通知所有组执行。 支持修改参数: DW_ERROR_TIME/INST_RECOVER_TIME/INST_ERROR_TIME/INST_AUTO_RESTART/INST_SERVICE_IP_CHECK |
set group [group_name] recover time value | 修改指定组中所有备库的恢复间隔为time_value指定的整数值(time_value取值:0~86400,单位为秒)(只修改守护进程内存值),如果未指定组名,则通知所有组执行 |
set group [group_name] arch invalid | 修改指定组中所有备库的归档为无效状态,如果未指定组名,则通知所有组执行 |
clear group [group_name] arch send info | 清理指定组中所有备库实例的最近N次归档发送信息(通知主库执行),没有指定组名则通知所有组执行,其中N值取主库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际归档发送次数中的较小值。 |
clear group [group_name] apply info | 清理指定组中所有备库实例的最近N次重演信息(通知组中所有备库执行),没有指定组名则通知所有组执行,其中N值取备库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际重演次数中的较小值。 |
以实例为单位执行的命令 | |
check recover [group_name.]inst_name | 检查指定组的指定实例是否满足自动恢复条件 |
check open [group_name.]inst_name | 检查指定组的指定实例是否满足自动OPEN条件 |
open instance [group_name.] inst_name | 强制open指定组的指定实例 |
switchover [group_name[.]] [inst_name] | 切换指定组的指定实例为Primary实例 |
takeover [group_name[.]] [inst_name] | 使用指定组的指定实例接管故障Primary实例 |
takeover force [group_name[.]] [inst_name] | 使用指定组的指定实例强制接管故障Primary实例 |
set instance [group_name.]inst_name recover time time_value | 修改指定组的指定实例的恢复间隔为time_value指定的整数值(time_value取值:0~86400,单位为秒)(只修改守护进程内存值) |
set instance [group_name.]inst_name arch invalid | 修改指定组的指定实例的归档为无效状态 |
detach instance [group_name.]inst_name | 将指定的备库实例或本地守护类型的实例分离出守护进程组 |
attach instance [group_name.]inst_name | 将分离出去的备库实例或本地守护类型的实例重新加回到守护进程组 |
clear instance [group_name.]inst_name arch send info | 清理指定备库实例的最近N次归档发送信息(通知主库执行),其中N值取主库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际归档发送次数中的较小值。 |
clear instance [group_name.]inst_name apply info | 清理指定备库实例的最近N次apply信息(通知备库执行),其中N值取备库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际重演次数中的较小值。 |
只允许在MPP主备环境下使用的命令 | |
show mpp | 显示MPP节点信息 |
startup dmwatcher all | 启动所有组的守护进程监控功能 |
stop dmwatcher all | 关闭所有组的守护进程监控功能 |
startup instance all | 启动所有组的实例 |
stop instance all | 关闭所有组的实例 |
kill instance all | 强制杀掉所有组中的活动实例 |
check mppctl | 检查MPP控制文件是否处于一致状态 |
recover mppctl | 恢复MPP控制文件到一致状态 |
命令中参数 GROUP_NAME 和 INST_NAME 的使用说明:
对于读写分离集群和实时主备,因为监视器只允许配置一组,所以下面命令中的组名[group_name]都可以不指定;对于 MPP 主备,因为有多个组,所以需要指定组名。但是 set group 相关的命令不受此限制,如果不指定[group_name],则所有组全部执行。
[inst_name]在有多个实例时需要指定实例名。
组名和实例名均不唯一的情况下,需要全部指定。组名和实例名用符号“.”分隔。