文章
· 四月 27, 2023 阅读大约需 3 分钟

第四十一章 配置镜像 - 使用 ^ZMIRROR 例程

第四十一章 配置镜像 - 使用 ^ZMIRROR 例程

用户定义的 ^ZMIRROR 例程允许为特定镜像事件(例如故障转移成员成为主要成员)实现自己的自定义、特定于配置的逻辑和机制。

^ZMIRROR 例程包含以下入口点。如果它们被省略,它们都提供适当的默认值。

  • $$CanNodeStartToBecomePrimary^ZMIRROR() — 当实例确定
    • 另一个故障转移成员当前未充当主要成员,并且在没有手动干预的情况下无法成为主要成员。
    • 本地成员有资格成为主要成员,即将开始接管过程。

CanNodeStartToBecomePrimary 为逻辑提供了一个入口点,以阻止故障转移成员自动成为主节点(无论是在启动时还是作为备份连接时),以提供对故障转移的手动控制,并且不是大多数 ^ZMIRROR 例程的一部分。

CanNodeStartToBecomePrimary 返回 1 时,本地实例已完全初始化为主要故障转移成员,可以继续成为主要成员的过程:所有镜像数据库都是可读写的,ECP 会话已恢复或回滚,本地事务(如果有)来自以前的主要已回滚。由于不允许用户登录,超级服务器连接被阻止,ECP 仍处于恢复状态,因此没有完成新的工作。

如果此入口点返回 0 (False),则实例进入重试循环,在该循环中它继续每 30 秒调用 CanNodeStartToBecomePrimary,直到

- CanNodeStartToBecomePrimary 返回1,本地成员继续成为主要成员的过程。

- 该实例检测到另一个故障转移成员已成为主要成员(必须通过手动干预),此时本地成员成为备用成员。
  • $$CheckBecomePrimaryOK^ZMIRROR() — 此过程在 CanNodeStartToBecomePrimary 返回 1 (True) 后调用。

如果 CheckBecomePrimaryOK 存在并返回 1,则镜像以本地成员为主恢复操作;这是可以启动任何本地进程或执行为用户准备应用程序环境所需的任何初始化的点。但是请记住,只有运行 CheckBecomePrimaryOK 的进程才能实际写入镜像数据库,直到它返回 1 之后,此时镜像数据库才会更新以供一般使用。

CanNodeStartToBecomePrimary 一样,如果 CheckBecomePrimaryOK 返回 0 (False),实例将中止成为主节点的过程并每 30 秒重试一次 CheckBecomePrimaryOK,直到

- 入口点返回 1,镜像以本地成员为主恢复操作。

- 该实例检测到另一个故障转移成员已成为主要成员(必须通过手动干预),此时本地成员成为备用成员。

一般来说 CheckBecomePrimaryOK 是成功的;如果存在节点未成为主要成员的“常见情况”,则应由 CanNodeStartToBecomePrimary 而不是 CheckBecomePrimaryOK 处理。

如果将代码从主节点上现有的 ^%ZSTART 例程移动到 ^ZMIRROR,以便在初始化镜像之前不执行它,那么 CheckBecomePrimaryOK 是它的最佳位置。但是,如果使用 job 命令启动其他作业,这些作业应该等到 $SYSTEM.Mirror.IsPrimary() 返回 true,这将在 CheckBecomePrimaryOK 返回 1 之后发生;或者,您可以改为在 $$NotifyBecomePrimary^ZMIRROR() 中启动作业。

注意:如果 CheckBecomePrimaryOK 返回 FalseECP 会话将被重置。当一个节点成功成为主节点时,ECP 客户端重新连接并且 ECP 事务被回滚(而不是保留)。在显式执行 TRollback 命令之前,客户端作业会收到 <NETWORK> 错误。

  • $$NotifyBecomePrimary^ZMIRROR() — 在成为主要故障转移成员的过程的最后(即,在允许用户和 ECP 会话(如果有的话)已变为活动状态之后)调用此过程以供参考。此入口点不返回值。如果需要,您可以包含代码以生成任何通知或启用应用程序登录。
  • $$NotifyBecomePrimaryFailed^ZMIRROR() — 当
    • 故障转移成员启动后成为主备成员失败。
    • 备份检测到主要失败并尝试成为主要但失败。

每个事件只调用一次该入口点;一旦它被调用,它就不会被再次调用,直到成员成为主要成员或检测到主要成员。

讨论 (0)1
登录或注册以继续