监视器(dmmonitor)是基于监视器接口实现的一个命令行工具,是 DM 数据守护系统的重要组成部分。
通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。同时,监视器(dmmonitor)还提供了一系列命令来管理数据守护系统。
监视器的基本作用如下:
- 监控数据守护系统
接收守护进程发送的消息,显示主、备数据库状态变化,以及故障切换过程中,数据库模式、状态变化的完整过程。
- 管理数据守护系统
用户可以在监视器上输入命令,启动、停止守护进程的监控功能,执行主备库切换、备库故障接管等操作。
- 确认状态信息
用于故障自动切换的数据守护系统中,主、备库进行故障处理之前,需要通过监视器进行信息确认,确保对应的备库或者主库是真的产生异常了,避免主备库之间网络故障引发脑裂。
- 发起故障自动接管命令
用于故障自动切换的数据守护系统中,主库发生故障时,挑选符合接管条件的备库,并通知备库执行接管操作。
注意对于实时主备和读写分离集群,监视器只允许配置一个守护进程组;MPP主备允许配置多组,并且要求这些组的主库必须是同一套MPP系统;
1、监视器类型
监视器分为两种类型:普通监视器和确认监视器。监视器类型由配置文件(dmmonitor.ini)的 MON_DW_CONFIRM 参数来确定。MON_DW_CONFIRM 参数的默认值是 0,表示普通监视器;MON_DW_CONFIRM 参数值为 1 时,表示确认监视器。
用户可根据实际需要,选择是否配置监视器或配置多少个监视器。普通监视器和确认监视器可以在系统中同时存在,也可以只配置其中一种。故障自动切换模式下,必须配置确认监视器。
为了防止单实例确认监视器出现故障,建议用户将确认监视器配置多实例形式。
1.1普通监视器
一个数据守护系统中,最多允许同时启动 10 个普通监视器。多个普通监视器之间的关系为相互独立,互不干扰。
所有普通监视器都可以接收守护进程消息,获取守护系统状态,也可以执行各种监控命令。所有监视器都可以发起 Switchover 等命令,但守护进程一次只能接收一个监视器的命令,在一个监视器命令执行完成之前,守护进程收到其他监视器发起的请求,会直接报错返回。
1.2确认监视器
确认监视器和普通监视器的区别在于,除了具备普通监视器所有功能之外,确认监视器还具有状态确认和自动接管两个功能。在数据守护系统的故障自动切换模式下,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。DM 提供了两种确认监视器的配置形式,分别为单实例和多实例。
一个数据守护集群中,最多只能配置一个确认监视器。
当单实例确认监视器故障时,无法继续进行集群的故障自动接管和备库故障确认,影响正常使用,故 DM 提供了多实例确认监控器来进一步提高集群的高可用性。
1.2.1单实例
除了具备普通监视器的所有功能之外,单实例确认监视器具有状态确认和自动接管两个功能。相比于多实例确认监视器,单实例确认监视器出现故障就无法正常提供服务。
1.2.2多实例
多实例确认监控器提供的功能与单实例确认监控器相同。
多实例确认监视器采用 RAFT 协议实现。在多实例确认监视器中,只有一个实例作为确认监视器提供服务,其它实例作为备库存在而不提供服务。当确认监视器出现故障时,系统会从它的备库中选举一位作为新的确认监视器继续提供服务。
下文将从 RAFT 协议、多实例确认监视器中的各角色状态的作用和特点、多实例确认监视器中选举主监视器三个角度对多实例确认监视器进行详细的介绍。
2、配置和启动监视器
2.1普通监视器
如果配置多个普通监视器,则每一个监视器需单独配置自己的 dmmonitor.ini。
首先,通过 dmmonitor.ini 文件配置普通监视器。
配置 dmmonitor.ini,位于/dm/data 文件夹下。其中 MON_DW_IP 中的 IP 和 PORT 和 dmmal.ini 中的 MAL_HOST 和 MAL_DW_PORT 配置项保持一致。
MON_DW_CONFIRM = 0 #普通监视器
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 = 453332 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 192.168.0.141:52141
MON_DW_IP = 192.168.0.142:52142
MON_DW_IP = 192.168.0.143:52143
启动监视器:
./dmmonitor /dm/data/dmmonitor.ini
2.2确认监视器
确认监视器可配置为单实例监视器或多实例监视器。
除了 dmmonitor.ini 内容不同以外,单实例确认监视器的配置和启动步骤均与普通监视器一样。
2.2.1单实例
需设置 dmmonitor.ini 中 MON_DW_CONFIRM=1,表示配置为确认监视器。其它内容和普通监视器的 dmmonitor.ini 用法一样。
2.2.2多实例
多实例确认监视器系统中,每个实例配置一个 dmmonitor.ini。多个 dmmonitor.ini 中,除 MON_ID 参数不同以外,其他参数应完全一致。多实例确认监视器不支持动态扩展节点。
与配置单实例确认监视器相比,配置多实例监视器时组的配置信息不做更改,监视器实例的配置信息需要新增确认监视器特有的配置参数,通过组和实例的配置信息内容的不同来区分组和实例,如果用户将组和实例的配置信息混淆,则以配置信息中更加靠前的参数为准来决定当前配置属于组还是实例,不属于组或实例的配置项将会被忽略。
监视器实例的配置信息包括实例 IP 地址、监听端口号以及实例在系统中的唯一编号, 实例的 IP 地址和监听端口号不应出现冲突,否则该监视器实例可能无法正常使用。监视器实例监听的 IP 及端口号的正确性由用户保证。
与配置单实例确认监视器相比,配置多实例确认监视器时需要增加多个确认监视器参数。首先,dmmonitor.ini 中需要添加整个监视器系统中的实例总数 MON_INST_NUM、各实例通信的心跳校验间隔 MON_HB_INTERVAL、各实例通信的心跳间隔 MON_BRO_INTERVAL 和各实例通信的基础投票间隔 MON_VOTE_INTERVAL。各实例通信的心跳间隔以及基础投票间隔会在真正使用时进行调整,各实例通信心跳间隔需要比基础投票间隔小(若配置中各实例通信心跳间隔比基础投票间隔大,内部会将实例通信心跳间隔调整为与基础投票间隔相同,再进行其他的调整处理)。其次,还需要增加确认监视器 ID 号 MON_ID 和监视器系统唯一标识 MON_MID。MON_ID 用于区别所有监视器中的不同实例,同一个监视器系统中的不同监视器实例,若配置相同的 MON_ID 将导致通信无法正常建立。各实例的 MON_ID 与 MON_INST_ID 相同。多实例确认监视器系统中的所有实例需配置相同的 MON_MID,代表它们属于同一个数据守护系统。
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 状态。
注意如果需要在主库正常退出时备库进行自动接管,需要配置MON_TAKEOVER_SHUTDOWN参数。
如果主库故障前正在执行Switchover/Takeover等命令,则备库不会自动接管,需要人工干预。
确认监视器要求一开始就启动,保证出现故障情况时,确认监视器已经收到了故障主库或备库的历史消息,否则会因为条件不足无法自动处理,需要通过命令方式人工干预。
当由于一些原因导致自动接管失败时,系统可能不会再次尝试自动接管,需要人工干预。
确认监视器不要和主库部署在一台机器上,避免主库网络故障时,备库无法自动切换为主库。
确认监视器不要和备库部署在一台机器上,避免主备库之间网络异常时,确认监视器误认为主库故障,将备库切换为主库,引发双主问题。
5、监视器命令
监视器命令
命令 | 含义 |
系统全局命令 | |
help | 显示帮助信息 |
exit | 退出监视器 |
show version | 显示监视器自身版本信息 |
show global info | 显示所有组的全局信息 |
show database [group_name.]db_name | 显示指定库的详细信息 |
show [group_name] | 显示指定组的实例信息,如果未指定组名,则显示所有组信息 |
show i[nterval] n | 每隔n秒自动显示所有组的实例信息 |
q | 取消自动显示 |
list [[group_name.]db_name] | 列出指定组的库对应的守护进程配置信息,如果都未指定,则列出所有守护进程配置信息 |
show open info [group_name.]db_name | 显示指定库的Open历史信息 |
show arch send info [group_name.]db_name | 查看源库到指定组的指定库的归档同步信息(包含恢复间隔信息) |
show apply stat [group_name.]db_name | 查看指定组的指定库的日志重演信息 |
show monitor [group_name[.]] [db_name] | 列出连接到指定守护进程的所有监视器信息 |
tip | 查看系统当前运行状态 |
login[/@service_name] | 登录监视器。若指定了/@service_name,则会使用wallet方式登录监视器;若没有指定,则为默认的交互式登录 |
logout | 退出登录 |
get takeover time [group_name] | 获取备库开始自动接管需要延迟等待的时间 |
show state | 显示当前监视器所在监视器配置组的所有监视器的状态信息 |
以组为单位执行的命令 | |
startup dmwatcher [group_name] | 启动指定组的守护进程监控功能 |
stop dmwatcher [group_name] | 关闭指定组的守护进程监控功能 |
startup group [group_name] | 启动指定组的库 |
stop group [group_name] | 关闭指定组的库 |
kill group [group_name] | 强制杀掉指定组中的活动库 |
choose switchover [group_name] | 选择可切换为Primary库的备库列表 |
choose takeover [group_name] | 选择可接管故障Primary库的备库列表 |
choose takeover force [group_name] | 选择可强制接管故障Primary库的备库列表 |
set group [group_name] auto restart on | 打开指定组中所有节点的自动拉起功能 |
set group [group_name] auto restart off | 关闭指定组中所有节点的自动拉起功能 |
set group [group_name] para_name para_value | 修改指定组的所有守护进程的指定配置参数(同时修改ini文件和内存值),如果未指定组名,则通知所有组执行。 |
para_name指定参数名称,para_value指定参数值 | |
支持修改参数: DW_ERROR_TIME/INST_RECOVER_TIME/ | |
INST_ERROR_TIME/INST_AUTO_RESTART/ | |
INST_SERVICE_IP_CHECK/RLOG_SEND_THRESHOLD/RLOG_APPLY_THRESHOLD | |
set group [group_name] recover time time_value | 修改指定组中所有备库的恢复间隔为time_value指定的整数值(time_value取值范围:3~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 stat | 清理指定组中所有备库的最近N次重演信息(通知组中所有备库执行),没有指定组名则通知所有组执行,其中N值取备库dm.ini中配置的RLOG_SEND_APPLY_MON值和实际重演次数中的较小值。 |