為 Microsoft SQL Server 持久磁碟啟用災難復原功能

本教學課程說明如何跨兩個 Google Cloud 區域啟用永久磁碟非同步複製 (PD 非同步複製),做為災難復原 (DR) 解決方案,以及如何在發生災難時啟動 DR 執行個體。

就本文而言,「災難」是指主要資料庫高可用性 (HA) 叢集發生故障或無法使用的事件。如果主要資料庫所在的區域發生故障或無法存取,主要資料庫就會發生故障。

本教學課程適用於資料庫架構師、管理員和工程師。

災難復原 Google Cloud

在 Google Cloud中,DR 的重點是確保處理作業持續進行,特別是在區域發生故障或無法存取時。災難復原 (DR) 網站有多種部署選項,具體取決於復原點目標 (RPO) 和復原時間目標 (RTO) 的需求。本教學課程涵蓋其中一個選項,也就是將虛擬機器 (VM) 磁碟從主要區域複製到 DR 區域。

非同步永久磁碟複製的災難復原

永久磁碟非同步複製 (PD 非同步複製) 提供低 RPO 和 RTO 區塊儲存空間複製功能,適用於跨區域主動對被動 DR。

PD 非同步複製是一種儲存空間選項,可在兩個區域之間非同步複製資料。如果發生區域性服務中斷 (這種情況相當少見),您可以透過 PD Async Replication 將資料容錯移轉至次要區域,並在該區域重新啟動工作負載。

永久磁碟非同步複製功能會將資料從附加至執行中工作負載的磁碟 (稱為主要磁碟),複製到位於其他區域的獨立磁碟。接收複製資料的磁碟稱為次要磁碟。

為確保附加至每個 SQL Server 節點的所有磁碟副本都包含同一時間點的資料,這些磁碟會新增至一致性群組。一致性群組可讓您跨多個磁碟執行 DR 和 DR 測試。

災難復原架構

對於 PD 非同步複製,下圖顯示的最低架構支援主要區域中的資料庫 HA,以及從主要區域到 DR 區域的磁碟複製。

主要和待命執行個體位於 R1 地區的兩個可用區,基礎磁碟會使用非同步複製功能複製到 R2 地區。

圖 1. 使用 Microsoft SQL Server 和 PD 非同步複製的災難復原架構

架構的運作方式如下:

  • 兩個 Microsoft SQL Server 執行個體 (主要執行個體和待命執行個體) 屬於可用性群組,且位於相同地區 (R1),但不同可用區 (可用區 A 和 B)。R1 中的兩個執行個體會使用同步提交模式協調狀態。由於同步模式支援高可用性,並可維持資料狀態一致,因此採用這種模式。
  • SQL 節點的磁碟會新增至一致性群組,並複製到 DR 地區 R2。基礎架構會以非同步方式複製資料。
  • 只有磁碟會複製到 R2 區域。在 DR 期間,系統會建立新的 VM,並將現有的複製磁碟連接至 VM,以便將節點上線。

災難復原程序

當某個區域無法使用時,就會啟動 DR 程序。DR 程序會規定必須採取的手動或自動作業步驟,以減輕區域故障的影響,並在可用區域中建立執行中的主要執行個體。

基本的資料庫災難復原程序包含下列步驟:

  1. 執行主要資料庫執行個體的第一個區域 (R1) 無法使用。
  2. 營運團隊會確認並正式承認發生災害,並決定是否需要容錯移轉。
  3. 如果需要容錯移轉,系統會終止從主要區域到 DR 區域的磁碟複製作業。系統會根據磁碟副本建立新的 VM,並將其上線。
  4. 系統會驗證 DR 地區 (R2) 中的新主要資料庫,並將其上線,以啟用連線。
  5. 使用者會在新的主要資料庫上繼續處理作業,並存取 R2 中的主要執行個體。

雖然這個基本程序會再次建立可運作的主要資料庫,但不會建立完整的高可用性架構,也就是新的主要資料庫沒有待命節點。

主要和待命執行個體位於 R1 地區的兩個可用區,基礎磁碟會使用非同步複製功能複製到 R2 地區。

圖 2:使用永久磁碟非同步複製功能進行災難復原後,部署 SQL Server

改用復原的區域

主要區域 (R1) 恢復連線後,您就可以規劃及執行容錯回復程序。容錯回復程序包含本教學課程中列出的所有步驟,但在此情況下,R2 是來源,R1 是復原區域。

選擇 SQL Server 版本

本教學課程支援下列 Microsoft SQL Server 版本:

  • SQL Server 2016 Enterprise 版
  • SQL Server 2017 Enterprise 版
  • SQL Server 2019 Enterprise 版
  • SQL Server 2022 Enterprise 版

本教學課程會使用 SQL Server 中的 AlwaysOn 可用性群組功能。

如果您不需要高可用性 Microsoft SQL Server 主要資料庫,且單一資料庫執行個體就足以做為主要資料庫,則可以使用下列版本的 SQL Server:

  • SQL Server 2016 Standard 版
  • SQL Server 2017 Standard 版
  • SQL Server 2019 Standard 版
  • SQL Server 2022 Standard 版

SQL Server 2016、2017、2019 和 2022 版的映像檔已安裝 Microsoft SQL Server Management Studio,因此您不需要另外安裝。不過,在實際執行環境中,建議您在每個區域的獨立 VM 上安裝一個 Microsoft SQL Server Management Studio 執行個體。如果您設定高可用性環境,請為每個區域安裝一次 Microsoft SQL Server Management Studio,確保在其他區域無法使用時,該環境仍可運作。

設定 Microsoft SQL Server 的災難復原

本教學課程使用 Microsoft SQL Server Enterprise 的 sql-ent-2022-win-2022 映像檔。

如需完整清單,請參閱「OS 映像檔」。

設定雙例項高可用性叢集

如要為 SQL Server 設定磁碟複製到 DR 區域,請先在某個區域中建立兩個執行個體的高可用性叢集。一個執行個體做為主要執行個體,另一個執行個體則做為待命執行個體。如要完成這個步驟,請按照「設定 SQL Server AlwaysOn 可用性群組」中的操作說明進行。 本教學課程使用 us-central1 做為主要區域 (稱為 R1)。如果您已按照「設定 SQL Server AlwaysOn 可用性群組」一文中的步驟操作,應該已在同一個區域 (us-central1) 中建立兩個 SQL Server 執行個體。您會在 us-central1-a 中部署主要 SQL Server 執行個體 (node-1),並在 us-central1-b 中部署待命執行個體 (node-2)。

啟用磁碟非同步複製功能

建立並設定所有 VM 後,請為附加至 VM 的所有磁碟建立一致性群組,啟用跨區域的磁碟複製功能。資料會從來源磁碟複製到指定區域中新建立的空白磁碟。

  1. 為 SQL 節點和網域控制站建立一致性群組。 區域磁碟的限制之一,是一致性群組無法跨區域。

    gcloud compute resource-policies create disk-consistency-group node-1-disk-const-grp \
    --region=$REGION
    
    gcloud compute resource-policies create disk-consistency-group node-2-disk-const-grp \
    --region=$REGION
    
    gcloud compute resource-policies create disk-consistency-group witness-disk-const-grp \
    --region=$REGION
    
  2. 將主要和待命 VM 的磁碟新增至對應的一致性群組。

    gcloud compute disks add-resource-policies node-1 \
    --zone=$REGION-a \
    --resource-policies=node-1-disk-const-grp
    
    gcloud compute disks add-resource-policies node-1-datadisk \
    --zone=$REGION-a \
    --resource-policies=node-1-disk-const-grp
    
    gcloud compute disks add-resource-policies node-2 \
    --zone=$REGION-b \
    --resource-policies=node-2-disk-const-grp
    
    gcloud compute disks add-resource-policies node-2-datadisk \
    --zone=$REGION-b \
    --resource-policies=node-2-disk-const-grp
    
    gcloud compute disks add-resource-policies witness \
    --zone=$REGION-c \
    --resource-policies=witness-disk-const-grp
    
  3. 配對區域中建立空白次要磁碟

    DR_REGION="us-west1"
    gcloud compute disks create node-1-replica \
      --zone=$DR_REGION-a \
      --size=50 \
      --primary-disk=node-1 \
      --primary-disk-zone=$REGION-a
    
    gcloud compute disks create node-1-datadisk-replica \
      --zone=$DR_REGION-a \
      --size=$PD_SIZE \
      --primary-disk=node-1-datadisk \
      --primary-disk-zone=$REGION-a
    
    gcloud compute disks create node-2-replica \
      --zone=$DR_REGION-b \
      --size=50 \
      --primary-disk=node-2 \
      --primary-disk-zone=$REGION-b
    
    gcloud compute disks create node-2-datadisk-replica \
      --zone=$DR_REGION-b \
      --size=$PD_SIZE \
      --primary-disk=node-2-datadisk \
      --primary-disk-zone=$REGION-b
    
    gcloud compute disks create witness-replica \
      --zone=$DR_REGION-c \
      --size=50 \
      --primary-disk=witness \
      --primary-disk-zone=$REGION-c
    
  4. 開始複製磁碟。資料會從主要磁碟複製到 DR 區域中新建立的空白磁碟。

    gcloud compute disks start-async-replication node-1 \
      --zone=$REGION-a \
      --secondary-disk=node-1-replica \
      --secondary-disk-zone=$DR_REGION-a 
    
    gcloud compute disks start-async-replication node-1-datadisk \
      --zone=$REGION-a \
      --secondary-disk=node-1-datadisk-replica \
      --secondary-disk-zone=$DR_REGION-a 
    
    gcloud compute disks start-async-replication node-2 \
      --zone=$REGION-b \
      --secondary-disk=node-2-replica \
      --secondary-disk-zone=$DR_REGION-b 
    
    gcloud compute disks start-async-replication node-2-datadisk \
      --zone=$REGION-b \
      --secondary-disk=node-2-datadisk-replica \
      --secondary-disk-zone=$DR_REGION-b 
    
    gcloud compute disks start-async-replication witness \
      --zone=$REGION-c \
      --secondary-disk=witness-replica \
      --secondary-disk-zone=$DR_REGION-c 
    

此時,資料應該會在區域之間複製。 每個磁碟的複製狀態應為「Active」。

模擬災難復原

在本節中,您將測試本教學課程中設定的災難復原架構。

模擬服務中斷情形,並執行災難復原容錯移轉

在 DR 容錯移轉期間,您會在 DR 區域中建立新的 VM,並將複製的磁碟附加至這些 VM。為簡化容錯移轉程序,您可以在 DR 區域使用不同的虛擬私有雲 (VPC) 進行復原,以便使用相同的 IP 位址。

開始容錯移轉前,請確認 node-1 是您建立的 AlwaysOn 可用性群組的主要節點。啟動網域控制站和主要 SQL Server 節點,以免發生資料同步問題,因為這兩個節點受到兩個不同的一致性群組保護。如要模擬中斷,請按照下列步驟操作:

  1. 建立復原 VPC。

    DRVPC_NAME="default-dr"
    DRSUBNET_NAME="default-recovery"
    
    gcloud compute networks create $DRVPC_NAME \
    --subnet-mode=custom
    CIDR = $(gcloud compute networks subnets describe default \
    --region=$REGION --format=value\(ipCidrRange\))
    
    gcloud compute networks subnets create $DRSUBNET_NAME \
    --network=$DRVPC_NAME --range=$CIDR --region=$DR_REGION
    
  2. 終止資料複製作業。

    PROJECT=$(gcloud config get-value project)
    gcloud compute disks stop-group-async-replication projects/$PROJECT/regions/$REGION/resourcePolicies/node-1-disk-const-grp \
    --zone=$REGION-a
    
    gcloud compute disks stop-group-async-replication projects/$PROJECT/regions/$REGION/resourcePolicies/node-2-disk-const-grp \
    --zone=$REGION-b
    
    gcloud compute disks stop-group-async-replication projects/$PROJECT/regions/$REGION/resourcePolicies/witness-disk-const-grp \
    --zone=$REGION-c
    
  3. 停止主要區域中的來源 VM。

    gcloud compute instances stop node-1 \
      --zone=$REGION-a
    
    gcloud compute instances stop node-2 \
      --zone=$REGION-b
    
    gcloud compute instances stop witness \
      --zone=$REGION-c
    
  4. 使用磁碟副本在 DR 區域中建立 VM。這些 VM 會使用來源 VM 的 IP 位址。

    NODE1IP=$(gcloud compute instances describe node-1 --zone $REGION-a --format=value\(networkInterfaces[0].networkIP\))
    NODE2IP=$(gcloud compute instances describe node-2 --zone $REGION-a --format=value\(networkInterfaces[0].networkIP\))
    WITNESSIP=$(gcloud compute instances describe witness --zone $REGION-a --format=value\(networkInterfaces[0].networkIP\))
    
    gcloud compute instances create node-1 \
      --zone=$DR_REGION-a \
      --machine-type $MACHINE_TYPE \
      --network=$DRVPC_NAME \
      --subnet=$DRSUBNET_NAME \
      --private-network-ip $NODE1IP\
      --disk=boot=yes,device-name=node-1-replica,mode=rw,name=node-1-replica \
      --disk=auto-delete=yes,boot=no,device-name=node-1-datadisk-replica,mode=rw,name=node-1-datadisk-replica
    
    gcloud compute instances create witness \
      --zone=$DR_REGION-c \
      --machine-type=n2-standard-2 \
      --network=$DRVPC_NAME \
      --subnet=$DRSUBNET_NAME \
      --private-network-ip $WITNESSIP \
      --disk=boot=yes,device-name=witness-replica,mode=rw,name=witness-replica
    

我們已模擬中斷情形,並容錯移轉至 DR 區域。現在可以測試次要執行個體是否正常運作。

確認 SQL Server 連線

建立 VM 後,請確認資料庫已成功復原,且伺服器運作正常。如要測試資料庫,請從復原的資料庫執行選取查詢。

  1. 使用遠端桌面連線至 SQL Server VM。
  2. 開啟 SQL Server Management Studio。
  3. 在「連線到伺服器」對話方塊中,確認伺服器名稱已設為 NODE-1,然後選取「連線」
  4. 在檔案選單中,依序選取「檔案」>「新增」>「查詢」,並使用目前的連線。

    USE [bookshelf];
    SELECT * FROM Books;