暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【达梦】主备守护集群原理详解 Part6

1622

4、集群数据守护场景

(1)正常运行状态

守护系统正常运行时,同一个守护进程组中,只有一个主库,其他的都是备库。主库处于 Open 状态,主库守护进程也处于 Open 状态,本地没有守护进程控制文件,其内存值是 Valid 有效状态。所有备库也处于 Open 状态,所有备库守护进程处于 Open 状态,本地没有守护进程控制文件,其内存值是 Valid 有效状态。主库到所有备库的归档也都处于 Valid 有效状态。


(2)数据守护的启动

Normal 模式的库默认以 Open 状态启动,也可以通过增加启动参数 Mount 将数据库启动到 Mount 状态。而 Primary/Standby 模式的库启动后,自动进入 Mount 状态,因此,数据守护系统启动时,所有数据库实例处于 Mount 状态。所有守护进程处于 Startup状态。如果实例还未启动到 Mount 状态(比如还处于 After redo 状态),守护进程不会通知实例 Open。

Local 守护类型的守护进程,直接 Open 数据库实例,并修改守护进程状态为 Open。

Global 守护类型的守护进程,需要相互协调信息,自动将数据库实例切换到 Open 状态,并将守护进程状态也切换为 Open 状态。

Global 守护类型的守护进程通知本地库 Open 的总体原则:

  • 对于备库,如果可加入远程任意一个库,则允许将其 Open;
  • 对于主库,如果远程所有库都可加入自己,则允许将其 Open。


还有一些细节条件这里不再具体列出,如果通过监视器没有观察到主库或备库 Open,可以借助监视器的 Check Open 命令查找原因,根据命令返回的原因考虑是否进行人工干预,比如需要通过监视器命令强制 Open 主库或备库。


注意:

  • 手动方式启动数据守护系统时,对于守护进程,数据库实例和监视器的启动顺序没有严格要求,也可以通过监视器命令启动守护系统(前提是所有守护进程已经启动)。
  • 启动流程中,守护进程在通知主库 Open 之前,会先收集出和主库数据一致的备库(备库的 ALSN 信息和主库的 FLSN 信息相等),守护进程会将这些备库的归档设置为 Valid 有效状态,其他数据不一致的备库则设置为Invalid 无效状态。Primary 模式数据库实例切换为 Open 状态时,需要回滚活动事务、Purge 已提交事务,并重构回滚段,会引发数据变化、LSN增长。对归档无效的备库,在数据守护启动完成后,主备库数据肯定是处于不一致状态。
  • 主库守护进程 Open 主库后,会修改 INST_RECOVER_TIME 内存值为 3 秒(默认 60 秒),确保归档状态无效的备库 Open 后,尽快启动故障恢复流程,同步主库数据完成后,重新将归档设置为 Valid 状态。
  • 如果在故障恢复流程完成之前,主库故障,并且不存在归档状态有效的备库,则无法执行备库接管;备库强制接管会引发守护进程组分裂。
  • 读写分离集群,在 Timely 或 Realtime 归档变为 Valid 之前,不会在备库上创建数据库连接,只读操作也无法分流到对应的备库。


(3)强制 Open 数据库

正常情况下,守护进程 dmwatcher 可以自动 Open 数据库实例,但某些情况下(比如备库硬件故障无法启动),数据守护系统不满足启动条件,我们可以通过监视器执行 Open database 命令强制 Open 数据库实例。主备库都可以强制 Open,其执行流程如下:

1 假设需要强制 Open 数据库 A,只需要启动一个监视器,登录后输入 Open database A 即可完成强制启动。 如果数据库 A 是 Standby 模式,强制 Open 的执行流程如下:

①通知 A 的守护进程切换为 Open Force 状态

②通知 A 执行 Open 操作

③通知守护进程切换 Open 状态


2 如果数据库 A 是 Primary 模式,强制 Open 的执行流程如下:

①通知 A 的守护进程切换为 Open Force 状态

②修改 A 到所有归档目标的实时归档/即时归档状态为无效

③通知 A 执行 Open 操作

④通知守护进程切换 Open 状态


3 Primary 模式数据库实例切换为 Open 状态时,需要回滚活动事务、Purge 已提交事 务,并重构回滚段,会引发数据变化、LSN 增长。因此,这个操作可能会引发守护进程组分 裂,比如下面的场景:

①主库 A 故障

②备库 B 接管,成为主库

③B 故障

④A 重启,并强制 Open

⑤A 和 B 数据不一致,并且无法恢复到一致状态。此时,B 重启,就会产生守护进程 组分裂。


注意:

  • 强制 Open 主库前,会设置主库到所有归档目标的实时归档/即时归档为 Invalid 状态。
  • 强制 Open 主库命令,会修改主库守护进程 INST_RECOVER_TIME 内存值为3 秒(默认 60 秒),确保
  • 主库 Open 后,尽快启动故障恢复流程,同步主库数据完成后,重新将归档设置为 Valid 状态。
  • 如果在故障恢复流程完成之前,主库故障,将无法执行备库接管;备库强制接管会引发守护进程组分裂。


注意:

强制 Open 主库前,会设置主库到所有归档目标的实时归档/即时归档为 Invalid 状态。

强制 Open 主库命令,会修改主库守护进程 INST_RECOVER_TIME 内存值为3 秒(默认 60 秒),确保

主库 Open 后,尽快启动故障恢复流程,同步主库数据完成后,重新将归档设置为 Valid 状态。

如果在故障恢复流程完成之前,主库故障,将无法执行备库接管;备库强制接管会引发守护进程组分裂。


(4)关闭数据守护系统

关闭守护系统时,必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换模式,如果退出守护进程或主备库的顺序不正确,可能会引起主备切换,甚至造成守护进程组分裂。通过监视器执行 Stop Group 命令关闭数据守护系统,是最简单、安全的方式。命令执行成功后,数据库实例正常关闭。但守护进程并没有真正退出,而是将状态切换为Shutdown 状态。


Stop Group 命令内部流程如下:

①通知守护进程切换为 Shutdown 状态

②通知主库退出

③通知其他备库退出


如果使用手动方式关闭数据守护系统,请严格按照以下顺序执行:

①如果启动了确认监视器,先关闭确认监视器(防止自动接管)

②关闭备库守护进程(防止重启实例)

③关闭主库守护进程(防止重启实例)

④Shutdown 主库

⑤Shutdown 备库


如果是只关闭主库,并且不想引发备库自动接管,有以下两种方法:

方法一:

1 通过 Detach database 命令将所有备库分离

2 通过 Stop database 命令退出主库


方法二:严格按照以下顺序执行:

1 通过 Stop dmwatcher 命令关闭所有守护进程监控

2 手动正常退出主库


如果是只关闭备库,并且不想引发主库发送日志失败进入 Suspend 状态,请严格按照以下顺序执行:

1 通过 Detach database 命令将备库分离出数据守护系统

2 正常退出备库(手动退出或者通过 Stop database命令退出)


(5)主备库切换

主库维护,滚动升级等场景,可以执行 Switchover 命令,实现主备库切换。如果存在多个备库,需要先执行 Choose Switchover 命令,选出守护进程组中可以切换的备库。

Choose Switchover 命令选择可切换备库的条件如下:

主库守护进程是 Open 状态

备库守护进程是 Open 状态


主、备库的 OPEN 记录项内容相同,并且守护进程控制文件是 Valid 有效状态(内存值)

主库正常运行

备库正常运行

主库处于 Open 状态

备库处于 Open 状态

主库到备库的归档是 Valid 状态


假定选出的可切换备库是 B,Switchover 切换流程如下:

通知主备库守护进程,切换为 Switchover 状态

通知主库(A) Mount

实时或 MPP 主备环境下,通知备库(B) APPLY KEEP_RLOG_PKG

通知备库(B) Mount

通知(A) 切换为 Standby 模式

MPP 主备环境下,通知(A)修改 MPP_INI 内存值为 0

通知(B) 切换为 Primary 模式

通知(B) 修改所有归档目标的归档状态为无效

MPP 主备需要通知各组活动主库更新 dmmpp.ctl 文件,参考后文说明

通知新的备库(A) Open

通知新的主库(B) Open

通知主备库守护进程切换为 Open 状态

清理所有守护进程上记录的监视器命令执行信息


注意:

主备库切换在实现逻辑上等同于主备库正常状态 下用户主动发起的Takeover 操作。Swithover完成后,主备库之间数据是不完全同步的,要由新主库 B 的守护进程通过 Recovery 流程,重新同步数据到新备库 A。Switchover 命令会修改切换后主库守护进ZINST_RECOVER_TIME 内存值为 3 秒(默认 60 秒),确保尽快启动故障恢复流程,同步主库数据完成后,重新将归档设置为 Valid 状态。

在故障恢复流程完成之前,再次执行Switchover 命令会报错,如果主库故障,备库接管将会报错;备库强制接管会引发守护进程组分裂。

最后修改时间:2022-07-28 11:46:09
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论