文章目录
- 第四十一章 配置镜像 - 使用 ^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
返回 False
,ECP
会话将被重置。当一个节点成功成为主节点时,ECP
客户端重新连接并且 ECP
事务被回滚(而不是保留)。在显式执行 TRollback
命令之前,客户端作业会收到 <NETWORK>
错误。
$$NotifyBecomePrimary^ZMIRROR()
— 在成为主要故障转移成员的过程的最后(即,在允许用户和ECP
会话(如果有的话)已变为活动状态之后)调用此过程以供参考。此入口点不返回值。如果需要,您可以包含代码以生成任何通知或启用应用程序登录。$$NotifyBecomePrimaryFailed^ZMIRROR()
— 当- 故障转移成员启动后成为主备成员失败。
- 备份检测到主要失败并尝试成为主要但失败。
每个事件只调用一次该入口点;一旦它被调用,它就不会被再次调用,直到成员成为主要成员或检测到主要成员。