2.2.1 守护进程
守护进程(dmwatcher)是DM数据守护系统不可或缺的核心部件,是数据库实例和监视器之间信息流转的桥梁。数据库实例向本地守护进程发送信息,接收本地守护进程的消息和命令;监视器(dmmonitor)接收守护进程的消息,并向守护进程发送命令;数据库实例与监视器之间没有直接的消息交互;守护进程解析并执行监视器发起的各种命令(Switchover/Takeover/Open Force等),并在必要时通知数据库实例执行相应的操作。
1. 主要功能
守护进程是管理数据守护系统的核心部件,负责解析、处理监视器发起的命令,提供了数据库监控、故障检测、故障处理、故障恢复等功能。
1)监控数据库实例
守护进程负责监控数据库运行状态,在必要时重启数据库服务。守护进程和实例链路建立成功后,数据库实例定时发送信息到守护进程,发送到守护进程的内容包括实例进程ID、实例名、数据库模式、数据库状态、FILE_LSN、CUR_LSN、MAL链路状态、归档状态、公钥、MPP控制文件等信息。
守护进程在更新本地记录的实例信息后,同时记录该时间戳。当检测到实例进程ID已经不存在或超过一段时间(INST_ERROR_TIME)没有收到实例消息时,会认定实例故障。如果配置了自动重启,则实例将会重启。
【注意】对于DMDSC来说,自动重启由DMCSS工具检测执行,单机的自动重启由守护进程检测执行。守护进程采用超时机制判断实例是否故障,即当前时间和上次收到消息的时间差是否超过故障认定时间(INST_ERROR_TIME),因此不建议在数据守护系统运行过程中调整操作系统时间,避免差值过大,误判实例故障。
2)发送状态信息
守护进程将监控的数据库实例信息和守护进程自身的信息(包括守护类型、守护模式、守护状态、守护日志、监视器执行序列号、执行返回码等)捆绑在一起,定时发送给其他守护进程和所有监视器。
3)监控其他守护进程
接收并解析其他守护进程发送的消息,如果超过一段时间(DW_ERROR_TIME)没有收到远程守护进程消息,会将远程守护进程状态认定为ERROR状态。另外,会结合本地数据库信息和守护进程自身状态,切换数据库的运行模式和系统状态。
【注意】在监控其他守护进程时,同样不建议在数据守护系统运行过程中调整操作系统时间。
4)接收监视器消息
主备库切换、备库接管等操作都是通过监视器命令进行的,监视器将操作命令分解成多个步骤顺序执行。守护进程接收这些消息并通知实例进行相应操作,如执行SQL语句修改实例模式、状态、INI参数、设置归档状态等一系列动作。这些步骤依次执行完成后,即可完成主备库切换或备库接管等操作。
例如,主备库切换操作,监视器首先通知待切换主备库的守护进程修改状态为Switchover状态,设置成功以后,其他监视器将不能再进行命令操作。守护进程收到监视器将实例改为Mount状态的命令,转发到本地实例执行,实例执行完成后返回执行结果。执行结果包含在实例向守护进程发送的消息中,守护进程根据消息中的执行码判断是否执行成功,再响应到监视器上。
【注意】监视器和守护进程之间也是采用超时机制判断对方是否故障的,因此同样不建议在数据守护系统运行过程中调整操作系统时间,避免差值过大,误判监视器故障。
5)主备库启动运行
数据守护系统刚启动时,所有实例处于Mount状态,守护进程处于Startup状态,在启动时需要将实例转换到Open状态,守护进程也应切换到Open状态,以对外提供服务。
6)备库故障处理
在故障自动切换模式下,备库在发生故障后,如果主备库之间的归档状态仍然有效,主库的守护进程会先切换为Confirm状态,等待确认监视器的确认消息,如果确认为符合故障处理条件,主库守护进程再切换至Failover状态,将故障备库的归档失效。
在故障手动切换模式下,备库在发生故障后,如果主备库之间的归档状态仍然有效,会直接切换到Failover状态,并将故障备库的归档失效,不需要备库故障确认。
备库在发生故障后,备库的守护进程如果还处于活动状态且监控功能没有被关闭,则会切换到Startup状态。
备库在故障重启后,如果存在活动主库,则主库守护进程根据备库实例的模式、状态、备库守护进程状态、守护进程控制文件信息及备库的恢复时间间隔信息判断,是否可以进行故障恢复。在满足故障恢复条件的情况下,启动Recovery流程,重新恢复主备库到一致状态。
如果一直没有观察到主库守护进程发起Recovery流程,则可以借助监视器的Checkrecover命令查找备库不满足条件的原因,并进行对应的处理。
【注意】在读写分离集群中,主库向即时备库发送归档日志失败后,会直接修改归档状态无效,并将数据库修改为Suspend状态。如果主备库之间出现网络故障,并且在网络故障期间,主库没有修改操作触发归档日志发送,则主库会一直保持Open状态。如果网络故障期间备库接管,网络恢复后,dmwatcher会通知主库强制Halt。
7)备库异常处理
备库异常是指备库的数据库实例正常,但响应速度出现异常。这里的响应速度可能受主备库之间的网络影响,如网络不稳定、网速大幅下降;也可能受备库自身的软硬件影响,如操作系统原因或磁盘读写速度异常降低等异常情况,导致响应主库的速度变慢。备库异常情况会极大地影响主库性能,影响主库正常处理对外的业务请求。
守护进程提供RLOG_SEND_THRESHOLD参数用于监控主备库之间的日志发送速度,此参数必须配置为大于0的值,否则守护进程不会打开监控功能。
主库守护进程在Open状态下对日志发送速度进行检测,一旦检测到异常,则主库守护进程会切换到Standby Check状态,并通知主库将异常备库的归档失效,暂停到此备库的数据同步,避免影响主库性能。
完整的备库异常处理流程如下(Standby Check状态处理)。
(1)收集所有的异常备库。
(2)将主库守护进程上记录的这些异常备库的最近一次恢复时间修改为当前时间,恢复时间间隔仍然为dmwatcher.ini中配置的INST_RECOVER_TIME值。这一步骤的目的是防止修改备库归档状态为Invalid后,主库立即启动Recovery状态,但是还未获取到备库最新的LSN信息,导致Recovery无法正确执行的情况发生。
(3)通知主库修改这些异常备库的归档状态为Invalid。
(4)守护进程切换回Open状态。
8)主库故障处理
在故障自动切换模式下,主库在发生故障后,确认监视器会捕获故障信息,自动选出可接管的备库,并通知备库进行接管。备库接管由确认监视器自动触发,不需要用户干预。
在故障手动切换模式下,主库在发生故障后,需要人工干预,通过监视器执行接管命令,将可接管备库切换为主库。
在故障自动切换模式下,可以实时处理故障,但对网络稳定性要求更高,需要确保主备库之间及主备库与守护进程之间的网络稳定可靠,否则可能会误判主库故障,备库自动接管后,出现多个Open状态的主库,引发脑裂。
在故障手动切换模式下,备库不会自动接管,当出现节点故障或网络故障时,由用户根据各种故障情况进行人工干预。
因此,故障手动切换模式可以更好地保护数据的一致性,建议尽量使用故障手动切换模式的数据守护。
主库故障重启后,守护进程根据控制文件中的接管记录,以及是否存在其他Primary实例来判定重启后的恢复策略,可能重新作为主库加入数据守护系统,也可能修改为Standby模式,以备库身份重新加入数据守护系统,如果出现组分裂,则需要用户干预才可以重加入数据守护系统。
9)故障恢复处理
故障恢复状态(Recovery)由守护进程自行判断是否切换,和监视器无关。如果符合以下条件,主库的守护进程可自动进入Recovery状态,进行数据恢复。
(1)本地主库[Primary, Open]守护进程Open状态。
(2)远程备库[Standby, Open]归档状态Invalid,守护进程Open状态。
(3)远程备库[Standby, Open]的APPLY_LSN和SSLSN相等,没有待重做日志。
(4)控制文件判断可加入,本地LSN更大等。
(5)远程备库[Standby, Open]达到了设置的启动恢复时间间隔。
2. 守护类型
守护进程支持两种守护类型:本地守护和全局守护。
1)本地守护
本地守护提供最基本的守护进程功能,负责监控本地数据库服务。如果实例使用Mount方式启动,守护进程会通知实例自动Open;如果连续一段时间没有收到来自其监控数据库的消息,则认定数据库出现故障,根据配置(INST_AUTO_RESTART)确定是否使用配置的启动命令重启数据库服务。
异步备库采用的是本地守护类型。
2)全局守护
在实时主备、MPP主备和读写分离集群系统中,需要将守护进程配置为全局守护类型。守护进程根据数据库服务器配置的归档类型及MPP_INI参数情况,自动识别具体的集群类型(实时主备、MPP主备或读写分离集群),全局守护类型在本地守护类型的基础上,通过和远程守护进程的交互,增加了主备库切换、主备库故障检测、备库接管、数据库故障重加入等功能。
配置全局守护类型后,守护进程守护数据库实例,必须配置实时归档或即时归档,否则dmwatcher会启动失败。
3. 故障切换模式
守护进程支持两种故障切换模式:故障自动切换和故障手动切换。
在故障自动切换模式下,当主库发生故障时,确认监视器自动选择一个备库,切换为主库并对外提供服务。故障自动切换模式要求必须且只能配置一个确认监视器。
在故障手动切换模式下,当主库发生故障时,由用户根据实际情况,通过监视器命令将备库切换为主库。在用户干预之前,备库可以继续提供只读服务和临时表的操作。
实时主备、MPP主备、读写分离集群可以配置为故障自动切换模式或故障手动切换模式。在这两种数据守护模式下,守护系统的启动流程、数据同步和故障处理机制存在一定的差异,主要差异如表2-12所示。
表2-12 数据守护模式比较
4. 守护状态
守护进程包括以下状态。
(1)Startup状态。守护进程启动状态,需要根据远程守护进程发送的状态信息,结合本地数据库的初始模式、状态和数据同步情况,确定本地数据库的启动模式和状态后,进入Open状态。
(2)Open状态。守护进程正常工作,监控数据库,并定时发送数据库的状态信息,接收其他守护进程发送的信息,接收监视器发送的用户请求。
(3)Shutdown状态。守护进程停止监控数据库状态,也不提供主备库切换功能。
(4)Switchover状态。在主备库都正常的情况下,手动切换主备库过程中设置为Switchover状态。
(5)Failover状态。远程备库发生故障后,本地主库执行故障处理时,守护进程设置为Failover状态。
(6)Recovery状态。故障恢复同步历史数据过程中设置为Recovery状态。
(7)Confirm状态。通过监视器确认远程主备库是否活动的过程中,守护进程设置为Confirm状态。
(8)Takeover状态。主库确认故障后,备库手动接管或监视器通知自动接管过程中,守护进程设置为Takeover状态。
(9)Open Force状态。主库没有收到远程所有实例消息,或者组中没有活动主库,需要借助监视器命令强制Open主库或备库实例时,守护进程设置为Open Force状态。
(10)Error状态。超过一段时间(DW_ERROR_TIME)没有接收到远程守护进程消息时,本地守护进程或监视器认定远程守护进程故障,修改远程守护进程为Error状态。
(11)Login Check状态。监视器执行命令登录校验时,守护进程所处的状态。
(12)Mppctl Update状态。修改主库MPP控制文件(dmmpp.ctl)时,守护进程所处的状态,只在MPP主备系统出现。
(13)Change Arch状态。Set Arch Invalid命令执行时守护进程所处的状态。
(14)Standby Check状态。主库守护进程监控到备库异常后,切换到此状态并通知主库修改此备库归档无效。
(15)Clear Send Info状态。清理主库上的归档发送信息时,守护进程所处的状态。
(16)Clear Rapply Info状态。清理备库上的重演信息时,守护进程所处的状态。
(17)Unify_ep状态。统一DMDSC库节点实例状态,或者各实例状态已经一致时,守护进程在Startup状态或Open状态下通知实例执行相关操作,都进入Unify_ep状态执行。
(18)Css Process状态。监视器发起的对DMDSC库的部分命令,如启动、关闭、强杀DMDSC库,或者打开、关闭节点实例的自动拉起功能等命令,需要借助DMCSS执行时,守护进程会切换到此状态。
守护进程所有状态变换和它监控的数据库的状态变换都会生成相应的日志信息,写入“../log”目录下以“dm_dmwatcher_实例名_当前年月.log”方式命名的日志文件中。用户可以通过查看日志文件,分析数据库和守护进程的运行状态及监控故障处理过程。
守护系统主要工作在Startup状态和Open状态下,几乎任何状态都可能转换到这两种状态,并且这两种状态之间也可以相互转换。另外,当远程守护故障时,任何状态都可以转换到Error状态。数据守护进程的状态转换(除Error状态外)如图2-6所示。
图2-6 数据守护进程状态转换