故障转移账户对象¶
本主题介绍在不同 区域 用于灾难恢复的多个账户之间对复制的账户对象进行故障转移所需的步骤。
有关故障转移机制的用途以及何时使用该机制的信息,请参阅 业务连续性和灾难恢复简介。
先决条件¶
在同一组织内的一组账户中、在一个云服务提供商的多个区域或不同的云服务提供商之间启用复制。
创建一个主故障转移组,该组可用于定义要复制的对象类型,并指定要复制的目标账户。您可选择将复制的对象划分到多个故障转移组中,例如,某些数据库的复制频率应高于其他数据库。
在至少一个辅助账户中,为每个主故障转移组创建至少一个辅助故障转移组(副本)。
刷新(同步)每个副本,使其与故障转移组中对象的最新更新保持一致。执行初始刷新,并设置计划,定期为每个辅助账户提供最新变更。
有关说明,请参阅 复制账户对象和数据库。
将目标账户提升为源账户¶
您可以使用 Snowsight 或 SQL 将目标账户提升为源账户(故障转移)。
有关可以在故障转移组中指定的对象类型的更多信息,请参阅 复制组和故障转移组。
使用 Snowsight 将目标账户提升为源账户¶
备注
只有账户管理员才能使用 Snowsight 编辑复制组或故障转移组(请参阅 使用 Snowsight 进行复制配置的限制)。
为获得最一致且可靠的故障转移体验,请选择所有适用的故障转移组和连接,并同时提升它们的优先级。我们将此操作称为 批量故障转移。
要使用 Snowsight 将目标账户提升为源账户,请按以下步骤操作:
登录到 Snowsight。确保使用目标账户登录。
在导航菜单中,选择 Admin » Accounts。
依次选择 Replication、Initiate failover。这样做会弹出一个对话框,供您做出剩余的选择。
选择要提升的任何故障转移组。 故障转移完成后,这些故障转移组中指定的对象在新提升的主账户上变为可写。这些对象在原来为主账户但现为辅助账户的账户上变为只读状态。
选择 Next。
选择要提升的任何连接。故障转移后,这些连接将连接到您正在提升为新主账户的账户。
选择 Next。
选择确认窗口中的 Fail over。
如果您选择的故障转移组正在进行任何刷新操作,您可以等待这些刷新完成,或者如果故障转移紧急且需优先处理,请选择其他方法。
默认操作是等待刷新完成。这样,当批量故障转移运行时,主系统和辅助系统都处于一致状态。Snowflake 使用您当前选定的仓库来轮询正在进行的刷新状态。如果您没有选定的仓库,请立即使用 Select warehouse 选项进行选择。
或者,您可以通过选择 Show advanced options 立即继续进行故障转移。
要仅对当前未刷新状态的故障转移组进行故障转移,请选择 Exit with current progress。在这种情况下,您需要在后续对批量故障转移过程中跳过的组执行额外的刷新操作。
要取消刷新操作并继续故障转移,请选择 Cancel refreshes and force failover。在这种情况下,您可能需要清理辅助系统上因刷新中断而导致的任何不一致之处。
如果所有故障转移组的故障转移操作均未完成,您可以再次执行批量故障转移。或者,您可以按照 使用 Snowsight 将单个故障转移组提升为主故障转移组: 中的过程,逐个对剩余的故障转移组执行故障转移。
使用 Snowsight 将单个故障转移组提升为主故障转移组:¶
备注
只有账户管理员才能使用 Snowsight 编辑复制组或故障转移组(请参阅 使用 Snowsight 进行复制配置的限制)。
要将单个故障转移组提升为主故障转移组,请使用 Snowsight,并按照以下步骤操作:
登录到 Snowsight。确保使用目标账户登录。
在导航菜单中,选择 Admin » Accounts。
依次选择 Replication、Groups。
找到要提升的故障转移组,并选择位于该行最后一列的 More 菜单 (...)。
选择 Fail over,然后在确认窗口中选择 Fail over。
小技巧
通常在遇到某个组的故障转移失败时,您需要仅针对该组重新尝试故障转移操作。要将整个账户提升为主账户,请选择多个故障转移组和连接并执行批量故障转移。有关更多信息,请参阅 使用 Snowsight 将目标账户提升为源账户。
使用 SQL 将目标账户提升为源账户¶
要使用 SQL 将目标账户提升为源账户,您要登录到目标账户并执行 ALTER FAILOVER GROUP ... PRIMARY 命令。
将辅助故障转移组提升为主要故障转移组¶
备注
本节中的示例必须由具有 FAILOVER 权限的角色执行。
以下示例将当前 myorg 组织中的 myaccount2 提升为源账户。
登录到目标账户
myaccount2。列出账户中的故障转移组:
SHOW FAILOVER GROUPS;
对要提升为主故障转移组的每个辅助故障转移组,执行以下语句:
ALTER FAILOVER GROUP myfg PRIMARY;
备注
在源区域发生部分中断期间,复制服务可能仍可用,并且可能仍刷新目标区域中的辅助故障转移组。
为确保数据完整性,如果正在进行刷新操作,Snowflake 会阻止故障转移。这意味着,如果复制操作正在刷新辅助故障转移组,则无法将其提升为主故障转移组。在这种情况下,ALTER FAILOVER GROUP ...PRIMARY 命令将返回错误。
解决因刷新操作正在进行而引起的故障转移语句失败的问题¶
如果正在对尝试提升的辅助故障转移组执行刷新操作,则故障转移语句将生成以下错误:
Replication group "<GROUP_NAME>" cannot currently be set as primary because it is being
refreshed. Either wait for the refresh to finish or cancel the refresh and try again.
要成功进行故障转移,必须完成以下步骤。
选择并完成以下选项之一:
重要
在 SECONDARY_DOWNLOADING_METADATA 或 SECONDARY_DOWNLOADING_DATA 阶段暂停刷新操作可能会导致目标账户的状态不一致。有关更多信息,请参阅 查看正在进行的刷新操作的当前阶段。
暂停以后的故障转移组刷新操作。如果刷新操作正在进行,则必须等待该操作完成,然后才能进行故障转移:
ALTER FAILOVER GROUP myfg SUSPEND;
暂停以后的刷新操作,并且 取消当前正在进行的计划刷新操作(如果有的话)。
如果正在进行的刷新操作是手动触发的,请参阅 取消未自动安排的正在进行的刷新操作。
ALTER FAILOVER GROUP myfg SUSPEND IMMEDIATE;
备注
在语句返回的时间与取消刷新操作完成的时间之间可能会有稍许延迟。
验证故障转移组
myfg未进行任何刷新操作。以下查询不应返回任何结果:SELECT phase_name, start_time, job_uuid FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg')) WHERE phase_name <> 'COMPLETED' and phase_name <> 'CANCELED';
要查看故障转移组
myfg的已取消刷新操作,可以执行以下语句:SELECT phase_name, start_time, job_uuid FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg')) WHERE phase_name = 'CANCELED';
现在,可以将辅助故障转移组
myfg提升为主故障转移组:ALTER FAILOVER GROUP myfg PRIMARY;
恢复目标账户中的计划复制¶
故障转移时,所有辅助故障转移组上的计划刷新都会暂停。ALTER FAILOVER GROUP ...RESUME 必须在具有辅助故障转移组的每个 目标账户 中执行,以恢复自动刷新。
ALTER FAILOVER GROUP myfg RESUME;
查看正在进行的刷新操作的当前阶段¶
在刷新操作的大部分阶段,都可以安全地取消刷新操作。不过,在 SECONDARY_DOWNLOADING_METADATA 或 SECONDARY_DOWNLOADING_DATA 阶段取消刷新操作可能会导致目标账户的状态不一致。 如果刷新操作已启动其中一个阶段,则无论源账户是否可用,都会继续完成该阶段。在进行故障切换之前,允许该阶段完成,可确保副本处于一致的状态。在副本处于一致状态后,可以恢复或重放引入和转换管道,将副本更新为当前状态。
要查看故障转移组正在进行的刷新操作的当前阶段,请使用 Information Schema REPLICATION_GROUP_REFRESH_PROGRESS、REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB、REPLICATION_GROUP_REFRESH_PROGRESS_ALL 表函数。
例如,要查看故障转移组 myfg 正在进行的刷新操作的当前阶段,请执行以下语句:
SELECT phase_name, start_time, end_time
FROM TABLE(
INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_PROGRESS('myfg')
);
有关刷新操作阶段的列表,请参阅该函数的 使用说明。
取消未自动安排的正在进行的刷新操作¶
要取消并非由复制计划自动触发的正在进行的刷新操作,必须使用 SYSTEM$CANCEL_QUERY 函数:
使用以下选项之一查找用于运行刷新操作的查询 ID 或 JOB_UUID:
查找所有正在运行的刷新操作的查询 IDs:
SELECT query_id, query_text FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE query_type = 'REFRESH REPLICATION GROUP' AND execution_status = 'RUNNING' ORDER BY start_time;
使用 QUERY_TEXT 列从列表中确定用于故障转移组刷新操作的 QUERY_ID。
查找特定故障转移组
myfg正在进行的刷新操作的 JOB_UUID:SELECT phase_name, start_time, job_uuid FROM TABLE(INFORMATION_SCHEMA.REPLICATION_GROUP_REFRESH_HISTORY('myfg')) WHERE phase_name <> 'COMPLETED' and phase_name <> 'CANCELED';
使用 SYSTEM$CANCEL_QUERY 函数以及 QUERY_ID 或 JOB_UUID 取消刷新操作:
SELECT SYSTEM$CANCEL_QUERY('<QUERY_ID | JOB_UUID>');
返回以下输出结果:
query [<QUERY_ID>] terminated.取消正在进行的刷新操作后,继续执行 后续步骤。
在新提升的源账户中重新打开 Snowpipe Streaming 的活动通道¶
主数据库中由 Snowpipe Streaming 填充的表会复制 到辅助数据库。故障转移后,为表重新打开活动的 Snowpipe Streaming 通道,并为通道重新插入任何缺失的数据行:
通过调用 openChannel (https://javadoc.io/doc/net.snowflake/snowflake-ingest-sdk/latest/net/snowflake/ingest/streaming/SnowflakeStreamingIngestClient.html) API 可重新打开表的活动通道。
提取偏移令牌:
调用 getLatestCommittedOffsetToken (https://javadoc.io/doc/net.snowflake/snowflake-ingest-sdk/latest/net/snowflake/ingest/streaming/SnowflakeStreamingIngestChannel.html#getLatestCommittedOffsetToken()) API 或
执行 SHOW CHANNELS 命令检索表中活动通道的列表。
从提取的偏移令牌中为通道重新插入数据行。
备注
这些步骤仅适用于支持 Snowflake Ingest SDK 的 Snowpipe Streaming;不适用于支持 Kafka Connector 的 Snowpipe Streaming。故障转移后,按照 以下步骤 重新启动 Kafka Connector。
Snowpipe Streaming 和 Kafka Connector¶
如果使用 Kafka Connector 和 Snowpipe Streaming,请在故障转移后按照以下步骤操作:
更新 Kafka Connector 配置,以指向新提升的源账户。
执行 SHOW CHANNELS 命令,检索活动通道列表和偏移令牌。每个通道都属于 Kafka 主题中的一个分区。
为每个分区(通道)手动重置 Kafka 主题中的偏移。
重新启动 Kafka Connector。
有关更多信息,请参阅: