使用高级灾难恢复 (DR)

本页面介绍了如何使用高级灾难恢复 (DR)。 高级灾难恢复提供以下两个主要功能:

  • 副本故障切换,您可以利用此功能在发生区域性故障时立即将主实例故障切换到灾难恢复副本。 对于 Cloud SQL for SQL Server,灾难恢复副本是可级联副本。
  • 切换,您可以利用此功能反转主实例和灾难恢复副本的角色,而不会丢失任何数据。您可以在副本故障切换后使用切换将部署恢复到其原始部署状态,也可以使用切换来测试灾难恢复。

只有 Cloud SQL 企业 Plus 版实例支持高级灾难恢复。

准备工作

如果您打算使用 Google Cloud SDK,则必须使用 502.0.0 版或更高版本。如需查看 Google Cloud SDK 的版本,请运行 gcloud --version。如需更新 Google Cloud SDK,请运行 gcloud components update

如需安装 Google Cloud SDK,请参阅安装 gcloud CLI

创建灾难恢复副本

在使用高级灾难恢复之前,请在与主实例不同的区域创建主实例的可级联副本

执行切换

创建灾难恢复副本后,您可以执行切换操作。但最佳做法是避免在以下情况下执行切换操作:

  • 主实例正在使用中。
  • 正在进行管理操作,例如自动备份或者启用或停用高可用性 (HA)。

为避免超时,请考虑在事务量较低时执行切换。

切换完成后,操作会在新的主实例升级后立即备份新的主实例(以前的灾难恢复副本)。 此备份可能需要 5 到 15 分钟才能完成,具体取决于磁盘大小。此备份完成后,如果您想在升级后的实例上使用 PITR,则必须手动启用 PITR。如需详细了解将 PITR 与高级灾难恢复搭配使用的注意事项,请参阅将 PITR 与高级灾难恢复搭配使用

切换操作完成后,您会发现复制方向反转。

将旧的主实例重新配置为读取副本后,DNS 写入端点(之前解析为旧的主实例)会解析为新的主实例。

准备工作

在执行切换操作之前,请执行以下操作:

  • 创建灾难恢复副本(如果您尚未创建)。
  • 验证主实例和灾难恢复副本是否处于在线状态。
  • 如果您使用的是 DNS 写入端点,请验证主实例和灾难恢复副本的 SSL 配置是否相同。例如,如果灾难恢复副本配置为强制执行 SSL 加密,而主实例允许使用未加密连接,则切换操作完成后,客户端将无法连接到新的主实例。
  • 按需备份主实例。此备份可作为一种预防措施,以防您需要从任何意外故障中恢复。

执行切换操作

gcloud

如需执行切换操作,请运行以下命令:

gcloud sql instances switchover REPLICA_NAME

执行以下变量替换操作:

  • REPLICA_NAME:希望供主实例用来切换角色的灾难恢复副本的名称。

Terraform

如需开始切换操作,请使用 Terraform 资源。如需将灾难恢复副本设置为新的主实例,请使用第一个示例。该示例包含注释,说明了您需要对 Terraform 配置进行哪些更改,才能切换主实例和灾难恢复副本。

resource "google_sql_database_instance" "original-primary" {
  name             = "sqlserver-primary-instance-name"
  region           = "us-east1"
  database_version = "SQLSERVER_2022_ENTERPRISE"
  instance_type    = "CLOUD_SQL_INSTANCE"
  root_password    = "INSERT-PASSWORD-HERE"
  replica_names    = ["sqlserver-replica-instance-name"]
  settings {
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
    backup_configuration {
      enabled = "true"
    }
  }
}

resource "google_sql_database_instance" "dr_replica" {
  name = "sqlserver-replica-instance-name"
  # Remove or comment out the master_instance_name
  # master_instance_name = google_sql_database_instance.original-primary.name
  region           = "us-west2"
  database_version = "SQLSERVER_2022_ENTERPRISE"
  # Change the instance type from "READ_REPLICA_INSTANCE" to "CLOUD_SQL_INSTANCE".
  instance_type = "CLOUD_SQL_INSTANCE"
  root_password = "INSERT-PASSWORD-HERE"
  # Add the original primary to the replica_names list
  replica_names = ["sqlserver-primary-instance-name"]
  # Remove or comment out the replica_configuration section
  # replica_configuration {
  #  cascadable_replica = true
  # }

  settings {
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
  }
}

进行更改后,运行 terraform plan 以更新主实例和灾难恢复副本。验证输出是否包含 Plan: 0 to add, 1 to change, 0 to destroy.。如需执行切换,请运行 terraform apply

此时,原始主实例是新主实例的副本。 不过,该更改不会自动反映在您的 Terraform 状态中。 如需将原主实例设置为 Terraform 状态中新主实例的副本,请使用第二个示例。第二个示例提供了注释,用于说明在运行第一个示例后需要进行的更改。

resource "google_sql_database_instance" "original-primary" {
  name = "sqlserver-primary-instance-name"
  # Set master_instance_name to the new primary instance, the original DR replica.
  master_instance_name = "sqlserver-replica-instance-name"
  region               = "us-east1"
  database_version     = "SQLSERVER_2022_ENTERPRISE"
  # Change the instance type from "CLOUD_SQL_INSTANCE" to "READ_REPLICA_INSTANCE".
  instance_type = "READ_REPLICA_INSTANCE"
  root_password = "INSERT-PASSWORD-HERE"
  # Remove  values from the replica_names field, but don't remove the field itself.
  replica_names = []
  # Add replica_configuration section and set cascadable_replica to true.
  replica_configuration {
    cascadable_replica = true
  }
  settings {
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
    backup_configuration {
      enabled = "true"
    }
  }
}

resource "google_sql_database_instance" "dr_replica" {
  name             = "sqlserver-replica-instance-name"
  region           = "us-west2"
  database_version = "SQLSERVER_2022_ENTERPRISE"
  # Change the instance type from "READ_REPLICA_INSTANCE" to "CLOUD_SQL_INSTANCE".
  instance_type = "CLOUD_SQL_INSTANCE"
  root_password = "INSERT-PASSWORD-HERE"
  # Add the original primary to the replica_names list
  replica_names = ["sqlserver-primary-instance-name"]
  settings {
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
  }
}

如果 Terraform 状态成功更新,当您针对第二个示例运行 terraform plan 时,会看到类似于以下内容的消息:

No changes. Your infrastructure matches the configuration.

如果您运行 terraform apply,则会收到类似于以下内容的消息:

Resources: 0 added, 0 changed, 0 destroyed.

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
  • REPLICA_NAME:灾难恢复副本的名称。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/REPLICA_NAME/switchover

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
  • REPLICA_NAME:灾难恢复副本的名称。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_NAME/switchover

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

通过调用副本故障切换执行灾难恢复

如果发生区域性故障或灾难,您可以通过对指定的灾难恢复副本调用副本故障切换操作来执行灾难恢复。如需执行副本故障切换,请提升灾难恢复副本。与切换相比,提升灾难恢复副本的过程很快。

由于灾难恢复副本会立即充当主实例,因此由于复制延迟,副本可能不会拥有旧主实例中的所有数据。因此,副本故障切换可能会导致数据丢失。

在升级过程中,副本故障切换会在灾难恢复副本成为新的主实例后立即备份新的主实例(以前的灾难恢复副本)。此备份完成后,系统将在新的主实例上完全启用时间点恢复 (PITR)。此备份可能需要 5 到 15 分钟才能完成,具体取决于新(和旧)主实例的磁盘大小。在此备份期间,PITR 不可用。

当旧的主实例恢复在线状态后,副本故障切换过程将执行备份。执行此备份后,系统会将旧的主实例重新创建为新主实例的读取副本。

如需详细了解将 PITR 与高级灾难恢复搭配使用的注意事项,请参阅将 PITR 与高级灾难恢复搭配使用

在调用副本故障切换操作后,DNS 写入端点(之前解析为旧的主实例)会解析为新主实例。

准备工作

在执行副本故障切换之前,请执行以下操作:

  • 创建灾难恢复副本(如果您尚未创建)。
  • 确保灾难恢复副本处于在线状态且运行状况良好。

执行副本故障切换操作

gcloud

如需调用副本故障切换以切换到灾难恢复副本,请使用以下命令:

gcloud sql instances promote-replica \
   REPLICA_NAME --failover

执行以下变量替换操作:

  • REPLICA_NAME:灾难恢复副本的名称

REST v1

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
  • REPLICA_NAME:灾难恢复副本的名称。
  • ENABLE_REPLICA_FAILOVER:设置为 true 以使用副本故障切换。如果设置为 false,则 API 会使用常规 promoteReplica 方法,而不使用副本故障切换。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/REPLICA_NAME/promoteReplica?failover=ENABLE_REPLICA_FAILOVER

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

REST v1beta4

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:主实例和灾难恢复副本的 Google Cloud 项目的 ID 或项目编号。
  • REPLICA_NAME:灾难恢复副本的名称。
  • ENABLE_REPLICA_FAILOVER:设置为 true 以使用副本故障切换。如果设置为 false,则 API 会使用常规 promoteReplica 方法,而不使用副本故障切换。

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_NAME/promoteReplica?failover=ENABLE_REPLICA_FAILOVER

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

检查副本故障切换的状态

副本故障切换分两个阶段进行。第一阶段是升级灾难恢复副本。第二个阶段是将旧的主实例重新创建为只读副本。

如需检查副本故障切换的状态,请检查每个阶段的状态。

  1. 检查第一个阶段的状态。

    控制台

    如需检查灾难恢复副本是否已提升为独立实例,请执行以下操作:

    1. 在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。

      转到“Cloud SQL 实例”

    2. 找到您已升级的灾难恢复副本的名称。
    3. 验证 SQL Server VERSION 是否显示在新的主实例的类型列中。

    gcloud

    您可以通过运行以下命令来检查状态:

    gcloud sql instances describe DR_REPLICA_NAME

    执行以下变量替换操作:

    • DR_REPLICA_NAME:升级后的灾难恢复副本的名称

    在输出中,检查以下字段是否出现以及副本是否已成为独立的 Cloud SQL 主实例:

    instanceType: CLOUD_SQL_INSTANCE
    

  2. 如需验证第二个阶段是否已完成,请检查实例上的操作日志中是否出现消息 RECONFIGURE_OLD_PRIMARY

    此消息是否显示取决于旧的主实例何时恢复在线状态,如果发生灾难,可能需要几分钟或几天的时间。

    如需详细了解如何检查实例的操作日志,请参阅查看实例日志

将 PITR 与高级灾难恢复搭配使用

无论是切换还是副本故障切换,如果灾难恢复副本升级为主实例,并且您想在升级的实例上使用 PITR,则必须手动启用 PITR。

启用 PITR 后,系统会应用备份配置和事务日志保留政策。如果您未为这些设置指定值,则会采用默认值 14 天。

如需了解详情,请参阅使用 PITR

在新的主实例上启用 PITR 后,您可以将实例恢复到它处于活跃主实例状态的任意时间点。

副本故障切换期间的脑裂

当使用副本故障切换升级副本时,如果主实例继续接受写入操作,则可能会发生脑裂。副本升级后,当旧的主实例再次可用时,系统会将其重新构建为升级实例的副本,并进行最终备份。此备份可用于恢复任何未写入升级副本的脑裂数据。

删除副本上的备份和事务日志

如果启用了 PITR 和备份的主实例成为只读副本,则在其充当副本期间,系统会保留并应用自其作为主实例时起的最近一次备份和 PITR 保留政策。即使新的主实例没有进行备份,系统也会根据上次配置的政策在只读副本上删除用于 PITR 的旧备份和事务日志。

例如,如果实例配置为具有每日自动备份,并保留 7 个包含 7 天 PITR 日志的备份,则当此实例成为只读副本时,任何超过 7 天的备份都将被删除,删除频率为每天一次。

如果您需要更快地删除备份,可以手动移除备份。如需了解详情,请参阅删除备份

VPC Service Controls 和高级灾难恢复建议

如果您使用 VPC Service Controls,请确保您的服务边界允许所有恢复操作(例如时间点恢复 [PITR] 操作)所需的通信,尤其是在您将 CMEK 与不同项目中的密钥搭配使用时。

高级灾难恢复操作(例如切换和副本故障切换)可以启用或重新配置 PITR 等功能,但如果服务边界未针对 CMEK 和跨项目密钥访问权限正确配置,VPC Service Controls 可能会阻止这些操作。

  • 将 KMS 密钥项目与实例保持在同一边界内:作为最佳实践,请将包含 KMS 密钥的项目与 Cloud SQL 实例包含在同一 VPC Service Controls 边界内。
  • 使用边界网桥:作为次要(不太推荐)选项,您可以使用边界网桥连接不同边界中的项目。
  • 测试:使用 VPC Service Controls 试运行模式测试您的灾难恢复程序(例如切换),并在不强制执行的情况下识别潜在的 VPC Service Controls 违规行为。

如需了解详情,请参阅配置 VPC Service Controls

限制

  • 如果主实例将用于时间点恢复 (PITR) 的事务日志存储在磁盘上,则您无法将 Cloud SQL 企业 Plus 版读取副本实例指定为灾难恢复副本。如需检查实例将用于 PITR 的日志存储在何处,请参阅检查用于 PITR 的事务日志的存储位置

  • 您不能将外部副本指定为灾难恢复副本。

  • Terraform 不支持副本故障切换操作。

  • 您无法使用 Google Cloud 控制台执行副本故障切换或切换操作。

问题排查

问题 问题排查
切换操作失败。
    确保实例满足所有规定的灾难恢复副本(可级联副本)要求
  • 检查数据库上的事务量。 如果事务量较高,则操作可能会超时。请考虑在事务负载较低时重试操作。
切换操作失败,主实例卡在只读模式下。 执行数据库重启,使主实例恢复写入模式。
切换操作已完成,但 Google Cloud 控制台未显示实例的新反转角色。 刷新浏览器以显示更新后的拓扑。
副本故障切换操作失败。
  • 确保您已为主实例创建了灾难恢复副本,并且灾难恢复副本处于在线状态。
  • 如果故障切换到灾难恢复副本的操作失败,则改为升级到常规(非灾难恢复)读取副本。

后续步骤