主备集群
一.数据守护
DM 数据守护 (Data Watch) 是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。通过部署 DM 数据守护,避免数据损坏、丢失,保障数据安全,并且可以快速恢复数据库服务,满足用户不间断提供数据库服务的要求。DM 数据守护提供多种解决方案,可以配置成实时主备、MPP 主备或读写分离集群。
1.实时主备
由一个主库以及一个或者多个配置了实时 (Realtime) 归档的备库组成,其主要目的是保障数据库可用性,提高数据安全性。主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的 REDO 日志,通过实时归档机制,在写入联机 REDO 日志文件之前发送到备库,实时备库通过重演 REDO 日志与主库保持数据同步。当主库出现故障时,备库在将所有 REDO 日志重演结束后,就可以切换为主库对外提供数据库服务。
2.MPP主备
在 MPP 集群的基础上,为每一个 MPP 节点配置一套实时主备系统,这些实时主备系统一起构成了 MPP 主备系统。
3.读写分离集群
由一个主库以及一个或者多个配置了即时 (Timely) 归档或实时 (Realtime) 归档的备库组成。读写分离集群通过配置事务一致模式保证主、备库数据一致性,并配合 DM 数据库管理系统的各种接口(JDBC、DPI 等),将只读操作自动分流到备库,有效降低主库的负载,提升系统吞吐量。
实现原理
将主库(生产库)产生的 REDO 日志传输到备库,备库接收并重新应用 REDO 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况。DM 数据守护系统主要由主库、备库、REDO 日志、REDO 日志传输、REDO 日志重演、守护进程 (dmwatcher)、监视器 (dmmonitor) 组成。
守护进程
守护进程 (dmwatcher) 是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
1.监控数据库实例
守护进程和实例链路建立成功后,数据库实例定时发送信息到守护进程,发送到守护进程的内容包括:实例进程 ID、实例名、数据库模式、数据库状态、FILE_SEQ、FILE_LSN、CUR_SEQ、CUR_LSN、MAL链路状态、归档状态、公钥、MPP 控制文件等信息。守护进程更新本地记录的实例信息后,同时记录该时间戳。当检测到实例进程 ID 已经不存在或者超过一段时间没有收到实例消息(INST_ERROR_TIME),则会认定实例故障。如果配置了自动重启,则会将实例重新拉起。
2.发送状态信息
守护进程将监控的数据库实例信息和守护进程自身的信息(包括守护类型、守护模式、守护状态、守护日志、监视器执行序列号、执行返回码等)捆绑在一起,定时发送给其他守护进程和所有监视器。
3.监控其他守护进程
接收并解析其他守护进程发送的消息,如果超过一段时间(DW_ERROR_TIME)没有收到远程守护进程消息,会将远程守护进程状态认定为 ERROR 状态。另外还会结合本地数据库信息和守护进程自身状态,切换数据库的运行模式和系统状态。
4.接收监视器信息
主备切换、备库接管等操作都是通过监视器命令进行,监视器将操作命令分解成多个步骤顺序执行,守护进程接收这些消息并通知实例进行相应操作。
5.主备库启动运行
数据守护系统刚启动时,所有实例处于 Mount 状态,守护进程处于 Startup 状态,启动时需要将实例转换到 Open 状态,守护进程也切换到 Open 状态,对外提供服务。
6.备库故障处理
故障自动切换模式下,备库故障后,如果主备库之间的归档状态仍然有效,主库的守护进程会先切换为 Confirm 状态,等待确认监视器的确认消息,如果确认为符合故障处理条件,主库守护进程再切换至 Failover 状态,将故障备库的归档失效。
故障手动切换模式下,备库故障后,如果主备库之间的归档状态仍然有效,会直接切换到 Failover 状态,并将故障备库的归档失效,不需要备库故障确认。备库故障后,备库的守护进程如果还处于活动状态且监控功能没有被关闭,则会切换到Startup 状态下。
备库故障重启后,如果存在活动主库,主库守护进程根据备库实例的模式、状态、备库守护进程状态、守护进程控制文件状态、备库已经同步到的 Open 记录以及备库的恢复间隔等信息判断是否可以进行故障恢复,在满足故障恢复条件的情况下,主库守护进程启动Recovery 流程,重新恢复主备库到一致状态。
7.备库异常处理
备库异常,指备库的数据库实例正常,但响应速度出现异常,这里的响应速度可能受主备库之间的网络影响,这种情况下会极大拖慢主库性能,影响主库正常处理对外的业务请求。完整的备库异常处理流程如下(Standby check 状态处理):
- 收集所有的异常备库
- 将主库守护进程上记录的这些异常备库的最近一次恢复时间修改为当前时间。
- 通知主库修改这些异常备库的归档为 Invalid 无效状态。
- 守护进程切回 Open 状态
8.主库故障处理
故障自动切换模式下,主库故障后,确认监视器会捕获到故障信息,自动选出可接管的备库,并通知备库进行接管。备库接管由确认监视器自动触发,无需用户干预。故障手动切换模式下,主库故障后,需要人工干预,通过监视器执行接管命令,将可接管备库切换为主库。
主库故障重启后,守护进程根据本地和远程库的 Open 记录、LSN 信息以及模式和状态信息来判定重启后的恢复策略,可能继续作为主库加入守护系统,也可能修改为 Standby模式,以备库身份重新加入守护系统,如果出现分裂,则需要用户干预。
9.故障恢复处理
故障恢复状态(Recovery)由守护进程自行判断是否切换,和监视器无关。完整的故障恢复流程如下:
- 通知备库丢弃 KEEP_RLOG_PKG;
- 通知主库发送归档日志,同步历史数据;
- 通知主库切换为 Suspend 状态;
- 再次通知主库发送归档日志;
- 通知主库设置备库归档为 Valid 状态;
- 通知主库切换为 Open 状态。
监视器
监视器 (dmmonitor) 用来监控守护系统内守护进程、数据库实例信息,执行用户输入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的机器上。监视器的基本作用如下:
- 监控数据守护系统
- 管理数据守护系统
- 确认状态信息
- 发起故障自动接管命令
二.配置文件
与 DM 数据守护相关的配置文件包括:
- 数据库配置文件 dm.ini
- 数据库控制文件 dm.ctl
- MAL 配置文件 dmmal.ini
- Redo 日志归档配置文件 dmarch.ini
- 守护进程配置文件 dmwatcher.ini
- 监视器配置文件 dmmonitor.ini
- 定时器配置文件 dmtimer.ini
- MPP 控制文件 dmmpp.ctl 等等
三.归档介绍
DM 数据库的归档可以分为 6 类:本地归档、远程归档、实时归档、即时归档、异步归档和同步归档。
1.本地归档
Redo 日志本地归档(Local),就是将 Redo 日志写入到本地归档日志文件的过程。配置本地归档情况下,Normal/Primary 模式库在 Redo 日志写入联机 Redo 日志文件后,将对应的 RLOG_PKG 由专门的归档线程写入本地归档日志文件中。Standby 模式库收到主库产生的 Redo 日志后,直接进行本地归档,写入本地归档日志文件中,同时启动 Redo 日志重演。
与联机 Redo 日志文件可以被覆盖重用不同,本地归档日志文件不能被覆盖,写入其中的 Redo 日志信息会一直保留,直到用户主动删除;如果配置了归档日志空间上限,系统会自动删除最早生成的归档 Redo 日志文件,腾出空间。
2.远程归档
远程归档专门用于 DMDSC 环境中,是将归档目录配置在远程节点上。远程归档采用双向配置的方式,双向配置远程归档就是两个节点将自己的远程归档相互配置在对方机器上。集群中所有的节点,都拥有一套包括所有节点的,完整的归档日志文件。
具体有两种配置方式:一是共享本地归档的远程归档,即将远程归档目录配置为另一节点的本地归档目录,以此来共享它的本地归档日志文件;二是通过 MAL 发送的远程归档,即将写入本地归档的 REDO 日志信息,通过 MAL 发送到远程节点,并写入远程节点的指定归档目录中,形成远程归档日志文件。
3.实时归档
与本地归档写入保存在磁盘中的日志文件不同,实时归档(Realtime)将主库产生的Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。
实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将 Redo日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库,不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将 Redo日志写入联机日志文件中。
4.即时归档
即时归档(Timely)在主库将 Redo 日志写入联机日志文件后,通过 MAL 系统将 Redo日志发送到备库。即时归档与实时归档的主要区别是 Redo 日志的发送时机不同。
即时归档分为两种模式:事务一致模式和高性能模式。即时归档模式根据配置文件 dmarch.ini 中的 ARCH_WAIT_APPLY 配置项(默认值为 1)来确定,1 表示事务一致模式,0 表示高性能模式。
5.异步归档
异步归档(Async)由主、备库上配置的定时器触发,根据异步备库的 KEEP LSN 信息,扫描本地归档目录获取 Redo 日志,并通过 MAL 系统将 Redo 日志发送到异步备库。
6.同步归档
同步归档(Sync)在主库归档日志刷盘后,通过 MAL 系统将 Redo 日志发送到备库。同步备库的 Redo 日志重演过程与实时归档等其他类型的归档完全一致。同步归档的执行流程为:主库在归档日志刷盘后,将 Redo 日志发送到备库,备库收到Redo 日志(RLOG_PKG)后,将其加入日志重演任务系统,并马上响应主库,不需要等待Redo 日志重演结束后再响应主库。