方案 - 使用相同站点故障转移自动化部署两站点多备用集群
此场景描述了具有多个备用数据库的 Pacemaker HADR 集群的规划,配置和部署以及从其中一个辅助备用数据库进行接管的详细信息。 此设置具有三个备用数据库:一个主备用数据库和两个辅助备用数据库。
重要信息: 在 Db2® 11.5.8 及更高版本中,当使用 Pacemaker 作为集成集群管理器时,支持相互故障转移高可用性。 在 Db2 11.5.6 及更高版本中,用于自动故障转移到 HADR 备用数据库的 Pacemaker 集群管理器随 Db2打包并安装。 在 Db2 11.5.5中,包含了 Pacemaker ,并且可用于生产环境。 在 Db2 11.5.4中, Pacemaker 仅作为技术预览包含在开发,测试和概念验证环境中。
重要提示: 要以根用户身份运行 db2cm 实用程序,请确保 DB2INSTANCE 环境变量设置为实例所有者。
环境
本主题说明使用同一站点故障转移自动化的两个站点部署具有多个备用数据库的 HADR。 下表显示了示例场景中使用的主机、实例、端口和预期角色集:
Hostname | 实例名称 | 服务端口 | 预期的角色 |
---|---|---|---|
Host_A | dbinst1 | 10 | 主 |
Host_B | dbinst2 | 20 | 主体备用数据库 |
Host_C | dbinst3 | 30 | 辅助备用数据库 |
Host_D | dbinst4 | 40 | 辅助备用数据库 |
数据库 hadrdb
配置为具有概述的拓扑的多个备用数据库。 可以使用适合于特定部署的参数(例如,数据库名称)来更新所使用的所有命令。
使用归档日志记录配置数据库
只有配置了归档日志的数据库才支持 HADR。 如果数据库配置为循环日志记录 ,则必须首先更改 logarchmeth1 和 logarchmeth2 配置参数。 数据库更改为使用归档日志记录之前,需要对数据库进行脱机备份。
规划多备用设置
此方案引入了双站点多备用 Pacemaker HADR 设置。 此设置包括自动故障转移到在每个站点中启用的备用数据库,但不包括主 HADR 数据库和主备用数据库在主站点中相同域内的两个站点。 此外,两个辅助备用数据库位于灾难恢复 (DR) 站点的另一个域中。 此配置允许灾难恢复站点将主站点完全替换为在缺省情况下在任何辅助备用数据库上发出手动接管时启用的自动化。
下图图 1 描述了双站点三备用自动数据库设置。 主站点上的主虚拟 IP 可用于访问数据库,并且每个查询始终自动定向到主数据库。 每个站点中的两个主机之间支持 Pacemaker 自动化,这意味着当主站点或灾难恢复站点上的主机发生故障时, Pacemaker 会尝试恢复。
在此拓扑中配置了多个备用数据库后, Pacemaker 将使用以下取决于方案的行为来自动执行恢复:
- 主数据库故障
- 主数据库在 Host_A 上失败,然后 Host_B 外接管上的主体备用数据库自动作为主数据库。 当旧主数据库重新联机时,它将重新集成为主备用数据库。
- 主备用数据库故障
- 主体备用数据库在 Host_B上失败,然后 Pacemaker 尝试将其恢复为主体备用数据库,而所有其他数据库仍处于同一角色。
- 辅助备用数据库故障
- 辅助备用数据库在 Host_C 或 Host_D 上失败。 Pacemaker 尝试将其恢复为辅助备用数据库。 其他数据库角色保持不变。
- 在位于灾难恢复站点中的辅助数据库上强制接管
- 如果在 Host_C 或 Host_D 上发出手动接管,那么 Host_A 和 Host_B 上的数据库都将成为辅助备用数据库,而 Host_C 和 Host_D 上的数据库将成为主数据库和主备用数据库。 角色切换后,前三个失败方案仍然适用。
配置多备用设置
使用以下命令来备份预期的主 HADR 数据库:
DB2 BACKUP DB hadrdb TO backup_dir
将备份映像复制到其他主机。 在每个期望的备用主机上,发出 DROP DB
以清除可能存在的任何旧数据库并复原备份映像:
DB2 DROP DB hadrdb
DB2 RESTORE DB hadrdb FROM backup_dir
在所有备用主机上复原数据库后,如在常规 HADR 设置中一样,必须明确设置以下数据库配置参数:
- hadr_local_host
- hadr_local_svc
- hadr_remote_host
- hadr_remote_inst
- hadr_remote_svc
但是,在设置这些参数之前,用户需要确定 HADR 设置中的四个数据库的主机名,端口号和实例名称:
预期的角色 | Hostname | 端口号 | 实例名称 |
---|---|---|---|
主 | Host_A | 10 | db2inst1 |
主体备用数据库 | Host_B | 20 | db2inst2 |
辅助备用数据库 | Host_C | 30 | db2inst3 |
辅助备用数据库 | Host_D | 40 | db2inst4 |
在主数据库上,hadr_remote_host、hadr_remote_inst 和 hadr_remote_svc 配置参数的设置对应主备用数据库的主机名、实例名和端口号。 在备用数据库上,这些配置参数的值对应主数据库的主机名、端口号和实例名。
此外,主机名和端口号用于在所有数据库上设置 hadr_target_list 配置参数。 在以下示例中,对于每个主机,将按如下所示配置 hadr_target_list:
Hostname | 预期的角色 | hadr_target_list |
---|---|---|
Host_A | 主 | Host_B:20|Host_C:30|Host_D:40 |
Host_B | 主体备用数据库 | Host_A:10|Host_C:30|Host_D:40 |
Host_C | 辅助备用数据库 | Host_D:40|Host_A:10|Host_B:20 |
Host_D | 辅助备用数据库 | Host_C:30|Host_A:10|Host_B:20 |
除了 hadr_target_list 配置设置之外,用户还始终希望主数据库与主备用数据库之间的同步尽可能最接近。 由于在每个站点内都配置了自动故障转移,因此在发出接管命令时,灾难恢复站点中的数据库可以成为主数据库和主备用数据库。 因此,所有数据库都可以将 hadr_syncmode 参数设置为 SYNC。 对于辅助备用数据库,还可以将 hadr_syncmode 参数设置为 SYNC,因为在 hadr_syncmode 中设置的同步方式只能在数据库成为主数据库或主备用数据库时有效,否则辅助数据库始终具有有效的 SUPERASYNC 同步方式。
可以发出以下命令来更新每个数据库上的配置参数:
- 在 Host_A(主数据库)上:
DB2 "UPDATE DB CFG FOR hadrdb USING HADR_TARGET_LIST Host_B:20|Host_C:30|Host_D:40 HADR_REMOTE_HOST Host_B HADR_REMOTE_SVC 20 HADR_LOCAL_HOST Host_A HADR_LOCAL_SVC 10 HADR_SYNCMODE sync HADR_REMOTE_INST db2inst2"
- 在 Host_B(主备用数据库)上:
DB2 "UPDATE DB CFG FOR hadrdb USING HADR_TARGET_LIST Host_A:10|Host_C:30|Host_D:40 HADR_REMOTE_HOST Host_A HADR_REMOTE_SVC 10 HADR_LOCAL_HOST Host_B HADR_LOCAL_SVC 20 HADR_SYNCMODE sync HADR_REMOTE_INST db2inst1"
- 在 Host_C(辅助备用数据库)上:
DB2 "UPDATE DB CFG FOR hadrdb USING HADR_TARGET_LIST Host_D:40|Host_A:10|Host_B:20 HADR_REMOTE_HOST Host_A HADR_REMOTE_SVC 10 HADR_LOCAL_HOST Host_C HADR_LOCAL_SVC 30 HADR_SYNCMODE sync HADR_REMOTE_INST db2inst1"
- 在 Host_D(辅助备用数据库)上:
DB2 "UPDATE DB CFG FOR hadrdb USING HADR_TARGET_LIST Host_C:30|Host_A:10|Host_B:20 HADR_REMOTE_HOST Host_A HADR_REMOTE_SVC 10 HADR_LOCAL_HOST Host_D HADR_LOCAL_SVC 40 HADR_SYNCMODE sync HADR_REMOTE_INST db2inst1"
配置每个数据库后,将显示每个数据库:
配置参数 | Host_A | Host_B | Host_C | Host_D |
---|---|---|---|---|
hadr_target_list | Host_B:20|Host_C:30|Host_D:40 | Host_A:10|Host_C:30|Host_D:40 | Host_D:40|Host_A:10|Host_B:20 | Host_C:30|Host_A:10|Host_B:20 |
hadr_remote_host | Host_B | Host_A | Host_A | Host_A |
hadr_remote_svc | 20 | 10 | 10 | 10 |
hadr_remote_inst | db2inst2 | db2inst1 | db2inst1 | db2inst1 |
hadr_local_host | Host_A | Host_B | Host_C | Host_D |
hadr_local_svc | 10 | 20 | 30 | 40 |
已配置 hadr_syncmode | SYNC | SYNC | SYNC | SYNC |
有效 hadr_syncmode | 不适用 | SYNC | SUPERASYNC | SUPERASYNC |
注: 可以通过在每个主机上运行 db2pd -db hadrdb -hadr 命令来查看有效 hadr_syncmode 参数。
启动 HADR 数据库
通过在 Host_B、Host_C 和 Host_D 上发出以下命令,先在在备用数据库上启动 HADR:
DB2 START HADR ON DB hadrdb AS STANDBY
然后,在主数据库(在本示例中为 Host_A)上启动 HADR:
DB2 START HADR ON DB hadrdb AS PRIMARY
要验证 HADR 是否已启动并正在运行,请通过运行 db2pd -db hadrdb -hadr 命令从 Host_A 上的主数据库查询数据库的状态,该命令将返回有关所有备用数据库的信息。 例如:
db2pd -db hadrdb -hadr
Database Member 0 -- Database hadrdb -- Active -- Up 0 days 00:00:13 -- Date 2020-07-14-08.52.30.018629
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
HADR_SYNCMODE = SYNC
STANDBY_ID = 1
LOG_STREAM_ID = 0
HADR_STATE = PEER
HADR_FLAGS = TCP_PROTOCOL
PRIMARY_MEMBER_HOST = Host_A
PRIMARY_INSTANCE = db2inst1
PRIMARY_MEMBER = 0
STANDBY_MEMBER_HOST = Host_B
STANDBY_INSTANCE = db2inst2
STANDBY_MEMBER = 0
HADR_CONNECT_STATUS = CONNECTED
HADR_CONNECT_STATUS_TIME = 2020-07-14 08.52.19.818272 (1594741939)
HEARTBEAT_INTERVAL(seconds) = 30
HEARTBEAT_MISSED = 0
HEARTBEAT_EXPECTED = 0
HADR_TIMEOUT(seconds) = 120
TIME_SINCE_LAST_RECV(seconds) = 8
PEER_WAIT_LIMIT(seconds) = 0
LOG_HADR_WAIT_CUR(seconds) = 0.000
LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.007153
LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.021
LOG_HADR_WAIT_COUNT = 3
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 87040
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 369280
PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 14, 44893780
STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 44836001
HADR_LOG_GAP(bytes) = 0
STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 44836001
STANDBY_RECV_REPLAY_GAP(bytes) = 0
PRIMARY_LOG_TIME = 2020-07-14 08.52.21.000000 (1594741941)
STANDBY_LOG_TIME = 2020-07-14 08.49.57.000000 (1594741797)
STANDBY_REPLAY_LOG_TIME = 2020-07-14 08.49.57.000000 (1594741797)
STANDBY_RECV_BUF_SIZE(pages) = 512
STANDBY_RECV_BUF_PERCENT = 0
STANDBY_SPOOL_LIMIT(pages) = 13000
STANDBY_SPOOL_PERCENT = 0
STANDBY_ERROR_TIME = NULL
PEER_WINDOW(seconds) = 120
PEER_WINDOW_END = 2020-07-14 08.54.20.000000 (1594742060)
READS_ON_STANDBY_ENABLED = N
HADR_LAST_TAKEOVER_TIME = NULL
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
HADR_SYNCMODE = SUPERASYNC
STANDBY_ID = 2
LOG_STREAM_ID = 0
HADR_STATE = REMOTE_CATCHUP
HADR_FLAGS = TCP_PROTOCOL
PRIMARY_MEMBER_HOST = Host_A
PRIMARY_INSTANCE = db2inst1
PRIMARY_MEMBER = 0
STANDBY_MEMBER_HOST = Host_C
STANDBY_INSTANCE = db2inst3
STANDBY_MEMBER = 0
HADR_CONNECT_STATUS = CONNECTED
HADR_CONNECT_STATUS_TIME = 2020-07-14 08.52.20.189945 (1594741940)
HEARTBEAT_INTERVAL(seconds) = 30
HEARTBEAT_MISSED = 0
HEARTBEAT_EXPECTED = 0
HADR_TIMEOUT(seconds) = 120
TIME_SINCE_LAST_RECV(seconds) = 10
PEER_WAIT_LIMIT(seconds) = 0
LOG_HADR_WAIT_CUR(seconds) = 0.000
LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.007153
LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.021
LOG_HADR_WAIT_COUNT = 3
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 87040
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 369280
PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 14, 44893780
STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 44836001
HADR_LOG_GAP(bytes) = 0
STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 44836001
STANDBY_RECV_REPLAY_GAP(bytes) = 0
PRIMARY_LOG_TIME = 2020-07-14 08.52.21.000000 (1594741941)
STANDBY_LOG_TIME = 2020-07-14 08.49.57.000000 (1594741797)
STANDBY_REPLAY_LOG_TIME = 2020-07-14 08.49.57.000000 (1594741797)
STANDBY_RECV_BUF_SIZE(pages) = 512
STANDBY_RECV_BUF_PERCENT = 0
STANDBY_SPOOL_LIMIT(pages) = 13000
STANDBY_SPOOL_PERCENT = 0
STANDBY_ERROR_TIME = NULL
PEER_WINDOW(seconds) = 0
READS_ON_STANDBY_ENABLED = N
HADR_LAST_TAKEOVER_TIME = NULL
HADR_ROLE = PRIMARY
REPLAY_TYPE = PHYSICAL
HADR_SYNCMODE = SUPERASYNC
STANDBY_ID = 3
LOG_STREAM_ID = 0
HADR_STATE = REMOTE_CATCHUP
HADR_FLAGS = TCP_PROTOCOL
PRIMARY_MEMBER_HOST = Host_A
PRIMARY_INSTANCE = db2inst1
PRIMARY_MEMBER = 0
STANDBY_MEMBER_HOST = Host_D
STANDBY_INSTANCE = db2inst4
STANDBY_MEMBER = 0
HADR_CONNECT_STATUS = CONNECTED
HADR_CONNECT_STATUS_TIME = 2020-07-14 08.52.19.403210 (1594741939)
HEARTBEAT_INTERVAL(seconds) = 30
HEARTBEAT_MISSED = 0
HEARTBEAT_EXPECTED = 0
HADR_TIMEOUT(seconds) = 120
TIME_SINCE_LAST_RECV(seconds) = 11
PEER_WAIT_LIMIT(seconds) = 0
LOG_HADR_WAIT_CUR(seconds) = 0.000
LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.007153
LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.021
LOG_HADR_WAIT_COUNT = 3
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 87040
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 369280
PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 14, 44893780
STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 44836001
HADR_LOG_GAP(bytes) = 0
STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 44836001
STANDBY_RECV_REPLAY_GAP(bytes) = 0
PRIMARY_LOG_TIME = 2020-07-14 08.52.21.000000 (1594741941)
STANDBY_LOG_TIME = 2020-07-14 08.49.57.000000 (1594741797)
STANDBY_REPLAY_LOG_TIME = 2020-07-14 08.49.57.000000 (1594741797)
STANDBY_RECV_BUF_SIZE(pages) = 512
STANDBY_RECV_BUF_PERCENT = 0
STANDBY_SPOOL_LIMIT(pages) = 13000
STANDBY_SPOOL_PERCENT = 0
STANDBY_ERROR_TIME = NULL
PEER_WINDOW(seconds) = 0
READS_ON_STANDBY_ENABLED = N
HADR_LAST_TAKEOVER_TIME = NULL
在 HADR 运行后,需要为两个站点上的所有主机创建 Pacemaker 资源以进行集群管理。 由于只能在活动站点 (主站点) 上创建 Pacemaker 资源,因此用户必须首先以 root 用户身份在主站点上创建 Pacemaker 资源:
- 通过运行以下命令来创建集群和以太网资源:
db2cm -create -cluster -domain db2ha1 -host Host_A -publicEthernet eth1 -host Host_B -publicEthernet eth1
- 通过运行以下命令来创建实例资源:
和db2cm -create -instance db2inst1 -host Host_A
db2cm -create -instance db2inst2 -host Host_B
- 在 Host_A 上,通过运行以下命令来创建数据库资源:
db2cm -create -db hadrdb -instance db2inst1
- 在 主机 A 上,通过运行以下操作创建主虚拟 IP(IP 地址可以在与主机相同的子网中):
db2cm -create -primaryVIP x.x.x.x -db hadrdb -instance db2inst1
- 在 Host_A 上,通过运行以下操作来创建备用虚拟 IP(IP 地址可以在与主机相同的子网中):
db2cm -create -standbyVIP x.x.x.x -db hadrdb -instance db2inst1
成功完成上述步骤后,可以通过运行 crm status 命令来验证 Pacemaker 资源:
Online: [ Host_A Host_B ]
Full list of resources:
db2_Host_A_eth1 (ocf::heartbeat:db2ethmon): Started Host_A
db2_Host_B_eth1 (ocf::heartbeat:db2ethmon): Started Host_B
db2_Host_B_db2inst2_0 (ocf::heartbeat:db2inst): Started Host_B
db2_Host_A_db2inst1_0 (ocf::heartbeat:db2inst): Started Host_A
Clone Set: db2_db2inst1_db2inst2_hadrdb-clone [db2_db2inst1_db2inst2_hadrdb] (promotable)
Promoted: [ Host_A ]
Unpromoted: [ Host_B ]
db2_db2inst1_db2inst2_hadrdb-primary-VIP (ocf::heartbeat:IPaddr2): Started Host_A
db2_db2inst1_db2inst2_hadrdb-standby-VIP (ocf::heartbeat:IPaddr2): Started Host_B
接下来,在灾难恢复站点上创建 Pacemaker 资源。
- 在 Host_C 上手动发出接管命令,以使站点 2 成为主站点,Host_C 现在托管主数据库。
DB2 TAKEOVER HADR ON DB hadrdb
- 在将主机名和实例名替换为 Host_C 和 Host_D 的名称时,重复 Host_C 上的先前步骤。 通过运行 crm status 来验证资源的状态。
- 在 Pacemaker 资源联机后,在 Host_A 上手动发出接管,以将所有数据库接管回原始主站点:
DB2 TAKEOVER HADR ON DB hadrdb
现在,灾难恢复站点的 crm status 输出可以如下所示:
Online: [ Host_C Host_D ]
Full list of resources:
db2_Host_C_eth1 (ocf::heartbeat:db2ethmon): Started Host_C
db2_Host_D_eth1 (ocf::heartbeat:db2ethmon): Started Host_D
db2_Host_D_db2inst4_0 (ocf::heartbeat:db2inst): Started Host_D
db2_Host_C_db2inst3_0 (ocf::heartbeat:db2inst): Started Host_C
Clone Set: db2_db2inst3_db2inst4_hadrdb-clone [db2_db2inst3_db2inst4_hadrdb] (promotable) (unmanaged)
db2_db2inst3_db2inst4_hadrdb (ocf::heartbeat:db2hadr): Promoted Host_C (unmanaged)
db2_db2inst3_db2inst4_hadrdb (ocf::heartbeat:db2hadr): Unpromoted Host_D (unmanaged)
db2_db2inst3_db2inst4_hadrdb-primary-VIP (ocf::heartbeat:IPaddr2): Started Host_C
db2_db2inst3_db2inst4_hadrdb-standby-VIP (ocf::heartbeat:IPaddr2): Started Host_D
主数据库与主备用数据库之间的故障转移
当 Host_A 上的主数据库发生故障时, Pacemaker 会自动将 Host_B 接管上的主备用数据库作为主数据库,然后尝试将旧主数据库恢复为主备用数据库,如下图所示:
在此情况下,配置参数 hadr_remote_host、hadr_remote_svc 和 hadr_remote_inst 在 Host_C 和 Host_D 上更改,并且更新为指向 Host_B 上的新主服务器。
配置参数 | Host_A | Host_B | Host_C | Host_D |
---|---|---|---|---|
hadr_target_list | Host_B:20|Host_C:30|Host_D:40 | Host_A:10|Host_C:30|Host_D:40 | Host_D:40|Host_A:10|Host_B:20 | Host_C:30|Host_A:10|Host_B:20 |
hadr_remote_host | Host_B | Host_A | Host_B | Host_B |
hadr_remote_svc | 20 | 10 | 20 | 20 |
hadr_remote_inst | db2inst2 | db2inst1 | db2inst2 | db2inst2 |
hadr_local_host | Host_A | Host_B | Host_C | Host_D |
hadr_local_svc | 10 | 20 | 30 | 40 |
已配置 hadr_syncmode | SYNC | SYNC | SYNC | SYNC |
有效 hadr_syncmode | SYNC | 不适用 | SUPERASYNC | SUPERASYNC |
多备用 Pacemaker HADR 设置中的站点之间的接管
在整个主站点将进行维护或计划停运的情况下,通过发出手动接管命令,灾难恢复站点可以接管为主站点,以确保数据库始终保持可用。 在发出接管之前,用户需要通过运行以下命令来查询两个辅助备用数据库以确定哪个具有最多日志数据:
db2pd -hadr -db hadrdb | grep STANDBY_LOG_FILE,PAGE,POS
以下是从 Host_C 运行该命令的样本输出:
STANDBY_LOG_FILE,PAGE,POS = S0000001.LOG, 142, 72318245
以下是从 Host_D 运行该命令的样本输出:
STANDBY_LOG_FILE,PAGE,POS = S0000001.LOG, 134, 63254745
要检查备用数据库是否是最新的,请首先检查它的日志文件名中是否有最大的日志序列,然后检查它是否具有最大的页号,最后检查它是否具有最大的位置值。 如果所有三个值都相同,那么可以选取任何辅助备用数据库。
在此示例中,Host_C 上的数据库确定为最新的数据库,因此它可以通过在 Host_C 上运行接管命令成为主数据库:
DB2 TAKEOVER HADR ON DB hadrdb
接管成功完成后, Host_C 上的数据库现在将成为新的主数据库,而 Host_D 的数据库将成为新的主体备用数据库,因为它首先位于 Host_C上的数据库的 hadr_target_list 上。 现在可以使用新的主站点上的主 VIP 来访问数据库。
设置将类似于下图:
Host_C 上 hadr_remote_host, hadr_remote_svc和 hadr_remote_inst 的值将重新配置为指向 Host_D。 同时,Host_D 上的这些参数将重新配置为指向 Host_C。 不会更改 Host_A 和 Host_B 上的配置值,因为它们仍然处于脱机状态并且不可用。 将显示每个数据库的配置值:
配置参数 | Host_A | Host_B | Host_C | Host_D |
---|---|---|---|---|
hadr_target_list | Host_B:20|Host_C:30|Host_D:40 | Host_A:10|Host_C:30|Host_D:40 | Host_D:40|Host_A:10|Host_B:20 | Host_C:30|Host_A:10|Host_B:20 |
hadr_remote_host | Host_C | Host_C | Host_D | Host_C |
hadr_remote_svc | 30 | 30 | 40 | 30 |
hadr_remote_inst | db2inst3 | db2inst3 | db2inst4 | db2inst3 |
hadr_local_host | Host_A | Host_B | Host_C | Host_D |
hadr_local_svc | 10 | 20 | 30 | 40 |
已配置 hadr_syncmode | SYNC | SYNC | SYNC | SYNC |
有效 hadr_syncmode | SUPERASYNC | SUPERASYNC | 不适用 | SYNC |
在多备用 Pacemaker HADR 设置中的站点之间进行故障转移
在整个主站点 Host_A 和 Host_B 都关闭的情况下,灾难恢复站点需要接管作为主站点并接受客户机流量。 在发出接管之前,用户需要通过运行以下命令来查询两个辅助备用数据库以确定哪个具有最多日志数据:
db2pd -hadr -db hadrdb | grep STANDBY_LOG_FILE,PAGE,POS
在此示例中,Host_C 被确定为最新的最新版本,因此可以使用以下命令将其作为新主项进行选取:
DB2 TAKEOVER HADR ON DB hadrdb BY FORCE
成功完成接管后, Host_C 上的数据库将成为新的主数据库,而 Host_D 上的数据库将成为新的主要备用数据库,因为它是 Host_C上数据库的 hadr_target_list 上的第一个数据库。 现在可以使用新的主站点上的主 VIP 来访问 Host_C 上的数据库。
Host_C 上 hadr_remote_host, hadr_remote_svc和 hadr_remote_inst 的值将重新配置为指向 Host_D。 同时,Host_D 上的这些参数将重新配置为指向 Host_C。 不会更改 Host_A 和 Host_B 上的配置值,因为它们仍然处于脱机状态并且不可用。 将显示每个数据库的配置值:
配置参数 | Host_A(不可用) | Host_B(不可用) | Host_C | Host_D |
---|---|---|---|---|
hadr_target_list | Host_B:20|Host_C:30|Host_D:40 | Host_A:10|Host_C:30|Host_D:40 | Host_D:40|Host_A:10|Host_B:20 | Host_C:30|Host_A:10|Host_B:20 |
hadr_remote_host | Host_B | Host_A | Host_D | Host_C |
hadr_remote_svc | 20 | 10 | 40 | 30 |
hadr_remote_inst | db2inst2 | db2inst1 | db2inst4 | db2inst3 |
hadr_local_host | Host_A | Host_B | Host_C | Host_D |
hadr_local_svc | 10 | 20 | 30 | 40 |
已配置 hadr_syncmode | SYNC | SYNC | SYNC | SYNC |
有效 hadr_syncmode | 不适用 | 不适用 | 不适用 | SYNC |
经过一定时间后,旧主站点将重新联机,这意味着 Host_A 和 Host_B 将再次可用。 原始主站点恢复后,Host_A 和 Host_B 变为可用,数据库无法启动,因为并非所有日志都传播到 Host_C。 必须使用以下步骤手动重新集成它们:
- 通过在 Host_A 和 Host_B 上发出以下命令来取消激活这两个主机上的数据库:
DB2 DEACTIVATE DB hadrdb
- 通过运行以下命令在 Host_A 和 Host_B 上停止 HADR,以禁用它们之间的自动化:
DB2 STOP HADR ON DB hadrdb
- 通过运行以下命令来删除 Host_A 和 Host_B 上的数据库:
DB2 DROP DB hadrdb
- 通过运行以下命令来联机备份 Host_C 上新的主数据库:
DB2 BACKUP DB hadrdb online
- 使用 scp 命令将备份映像复制到 Host_A 和 Host_B 。
- 通过运行以下命令,在 Host_A 和 Host_B 上使用备份映像来复原数据库:
DB2 RESTORE DB hadrdb
- 通过在每个主机上运行以下命令,重新配置 Host_A 和 Host_B 上已复原的数据库:在 Host_A 上:
在 Host_B 上:DB2 "UPDATE DB CFG FOR hadrdb USING HADR_TARGET_LIST Host_B:20|Host_C:30|Host_D:40 HADR_REMOTE_HOST Host_C HADR_REMOTE_SVC 30 HADR_LOCAL_HOST Host_A HADR_LOCAL_SVC 10 HADR_SYNCMODE sync HADR_REMOTE_INST db2inst3"
DB2 "UPDATE DB CFG FOR hadrdb USING HADR_TARGET_LIST Host_A:10|Host_C:30|Host_D:40 HADR_REMOTE_HOST Host_C HADR_REMOTE_SVC 30 HADR_LOCAL_HOST Host_B HADR_LOCAL_SVC 20 HADR_SYNCMODE sync HADR_REMOTE_INST db2inst3"
- 在 Host_A 和 Host_B 上启动 HADR,以通过运行以下操作将其重新融入辅助备用数据库:
DB2 START HADR ON DB hadrdb AS STANDBY
成功运行先前的命令后,Host_A 和 Host_B 可以成功成为辅助备用数据库。 下图说明了新设置:
可以将这两个数据库上的 hadr_remote_host, hadr_remote_svc和 hadr_remote_inst 的值重新配置为指向新的主数据库,并且这两个数据库的有效 hadr_syncmode 现在可以变为 SUPERASYNC。 将显示每个数据库的配置:
配置参数 | Host_A | Host_B | Host_C | Host_D |
---|---|---|---|---|
hadr_target_list | Host_B:20|Host_C:30|Host_D:40 | Host_A:10|Host_C:30|Host_D:40 | Host_D:40|Host_A:10|Host_B:20 | Host_C:30|Host_A:10|Host_B:20 |
hadr_remote_host | Host_C | Host_C | Host_D | Host_C |
hadr_remote_svc | 30 | 30 | 40 | 30 |
hadr_remote_inst | db2inst3 | db2inst3 | db2inst4 | db2inst3 |
hadr_local_host | Host_A | Host_B | Host_C | Host_D |
hadr_local_svc | 10 | 20 | 30 | 40 |
已配置 hadr_syncmode | SYNC | SYNC | SYNC | SYNC |
有效 hadr_syncmode | SUPERASYNC | SUPERASYNC | 不适用 |