共用方式為


設定分散式 Always On 可用性群組

適用於:SQL Server

若要建立分散式可用性群組,您必須建立兩個各有其專用接聽程式的可用性群組。 隨後您再將這些可用性群組合併成分散式的可用性群組。 下列步驟提供 TRANSACT-SQL 中的基本範例。 本範例未涵蓋關於建立可用性群組與接聽程式的所有詳細資料,而僅著重探討與其相關的重要需求。

如需分散式可用性群組的技術概觀,請參閱分散式可用性群組

必要條件

要設定分散式可用性群組,您必須具備下列條件:

注意

如果您使用分散式網路名稱 (DNN),在 Azure VM 的 SQL Server 上設定可用性群組的接聽程式,則不支援在可用性群組之上設定分散式可用性群組。 若要深入了解,請參閱 Azure VM 上的 SQL Server 具有與 AG 和 DNN 接聽程式的功能互通性

設定端點接聽程式來接聽所有 IP 位址

請確定端點可以在分散式可用性群組的不同可用性群組之間進行通訊。 如果一個可用性群組設定為端點上的特定網路,分散式的可用性群組不會正常運作。 在裝載分散式可用性群組中某個複本的每部伺服器上,請設定用來接聽所有 IP 位址的接聽程式 (LISTENER_IP = ALL)。

建立端點以接聽所有 IP 位址

例如,下列指令碼會在 TCP 通訊埠 5022 上建立接聽程式端點,接聽所有 IP 位址。

CREATE ENDPOINT [aodns-hadr] 
    STATE=STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (
   ROLE = ALL, 
   AUTHENTICATION = WINDOWS NEGOTIATE,
   ENCRYPTION = REQUIRED ALGORITHM AES
)
GO

改變端點以接聽所有 IP 位址

例如,下列指令碼會變更接聽程式端點,接聽所有 IP 位址。

ALTER ENDPOINT [aodns-hadr] 
    AS TCP (LISTENER_IP = ALL)
GO

建立第一個可用性群組

在第一個叢集上建立主要可用性群組

在第一個 Windows Server 容錯移轉叢集 (WSFC) 上建立可用性群組。 在此範例中,會針對資料庫 ag1 將可用性群組命名為 db1。 主要可用性群組的主要複本在分散式可用性群組中稱為「全域主要」。 Server1 在此範例中是全域主要。

CREATE AVAILABILITY GROUP [ag1]   
FOR DATABASE db1   
REPLICA ON N'server1' WITH (ENDPOINT_URL = N'TCP://server1.contoso.com:5022',  
    FAILOVER_MODE = AUTOMATIC,  
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,   
    BACKUP_PRIORITY = 50,   
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),   
    SEEDING_MODE = AUTOMATIC),   
N'server2' WITH (ENDPOINT_URL = N'TCP://server2.contoso.com:5022',   
    FAILOVER_MODE = AUTOMATIC,   
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,   
    BACKUP_PRIORITY = 50,   
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),   
    SEEDING_MODE = AUTOMATIC);   
GO  
  

注意

上一個範例係採用自動植入,並針對複本與分散式可用性群組將 SEEDING_MODE 設為 AUTOMATIC。 這個組態會將次要複本與次要可用性群組設定成自動填入,無須手動備份和還原主要資料庫。

將次要複本聯結至主要可用性群組

任何次要複本皆必須透過 JOIN 選項,聯結至具 ALTER AVAILABILITY GROUP 的可用性群組。 由於此範例採用自動植入,因此您還必須透過 GRANT CREATE ANY DATABASE 選項呼叫 ALTER AVAILABILITY GROUP。 此設定可讓可用性群組建立資料庫,並開始自動從主要複本將其植入。

在此範例中,系統會在次要複本 server2執行下列命令,以聯結 ag1 可用性群組。 接著會允許可用性群組在次要複本上建立資料庫。

ALTER AVAILABILITY GROUP [ag1] JOIN   
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE  
GO  

注意

當可用性群組在次要複本上建立資料庫時,它會將資料庫擁有者設成執行 ALTER AVAILABILITY GROUP 陳述式以授與建立任何資料庫權限的帳戶。 如需完整資訊,請參閱授與可用性群組在次要複本上建立資料庫的權限

建立主要可用性群組的接聽程式

接下來要在第一個 WSFC 上建立主要可用性群組。 在此範例中,接聽程式會命名為 ag1-listener。 如需建立接聽程式的詳細指示,請參閱建立或設定可用性群組接聽程式 (SQL Server)

ALTER AVAILABILITY GROUP [ag1]    
    ADD LISTENER 'ag1-listener' ( 
        WITH IP ( ('2001:db88:f0:f00f::cf3c'),('2001:4898:e0:f213::4ce2') ) , 
        PORT = 60173);    
GO  

建立第二個可用性群組

接著在第二個 WSFC 上,建立第二個可用性群組 ag2。 在此案例中未指定資料庫,因為其會從主要可用性群組自動植入。 次要可用性群組的主要複本在分散式可用性群組中稱為「轉寄站」。 在此範例中,server3 是轉寄站。

CREATE AVAILABILITY GROUP [ag2]   
FOR   
REPLICA ON N'server3' WITH (ENDPOINT_URL = N'TCP://server3.contoso.com:5022',   
    FAILOVER_MODE = MANUAL,   
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,   
    BACKUP_PRIORITY = 50,   
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),   
    SEEDING_MODE = AUTOMATIC),   
N'server4' WITH (ENDPOINT_URL = N'TCP://server4.contoso.com:5022',   
    FAILOVER_MODE = MANUAL,   
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,   
    BACKUP_PRIORITY = 50,   
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),   
    SEEDING_MODE = AUTOMATIC);   
GO  

注意

次要可用性群組必須使用相同的資料庫鏡像端點 (在本範例中為通訊埠 5022)。 否則在執行本機容錯移轉後將會停止複寫。

將次要複本聯結至次要可用性群組

在此範例中,系統會在次要複本 server4執行下列命令,以聯結 ag2 可用性群組。 接著會允許可用性群組在次要複本上建立資料庫,以支援自動植入。

ALTER AVAILABILITY GROUP [ag2] JOIN   
ALTER AVAILABILITY GROUP [ag2] GRANT CREATE ANY DATABASE  
GO  

建立次要可用性群組的接聽程式

接下來要在第二個 WSFC 上建立次要可用性群組。 在此範例中,接聽程式會命名為 ag2-listener。 如需建立接聽程式的詳細指示,請參閱建立或設定可用性群組接聽程式 (SQL Server)

ALTER AVAILABILITY GROUP [ag2]    
    ADD LISTENER 'ag2-listener' ( WITH IP ( ('2001:db88:f0:f00f::cf3c'),('2001:4898:e0:f213::4ce2') ) , PORT = 60173);    
GO  

在第一個叢集上建立分散式可用性群組

在第一個 WSFC 上,建立分散式可用性群組 (在此範例中名為 distributedag )。 使用 CREATE AVAILABILITY GROUP 命令搭配 DISTRIBUTED 選項。 AVAILABILITY GROUP ON 參數會指定成員可用性群組 ag1ag2

若要使用自動植入來建立分散式可用性群組,請使用下列 Transact-SQL 程式碼:

CREATE AVAILABILITY GROUP [distributedag]  
   WITH (DISTRIBUTED)   
   AVAILABILITY GROUP ON  
      'ag1' WITH    
      (   
         LISTENER_URL = 'tcp://ag1-listener.contoso.com:5022',    
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
         FAILOVER_MODE = MANUAL,   
         SEEDING_MODE = AUTOMATIC   
      ),   
      'ag2' WITH    
      (   
         LISTENER_URL = 'tcp://ag2-listener.contoso.com:5022',   
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
         FAILOVER_MODE = MANUAL,   
         SEEDING_MODE = AUTOMATIC   
      );    
GO   

注意

LISTENER_URL 會指定每個可用性群組的接聽程式,以及可用性群組的資料庫鏡像端點。 在此範例中,其為通訊埠 5022 (非用於建立接聽程式的通訊埠 60173 )。 如果您要使用負載平衡器 (例如在 Azure 中),則請新增分散式可用性群組連接埠的負載平衡規則。 除了 SQL Server 執行個體連接埠之外,還需要新增接聽程式連接埠的規則。

取消自動植入轉寄站

無論出於什麼原因,若在同步兩個可用性群組「之前」必須取消轉寄站的初始化,請透過將轉寄站的 SEEDING_MODE 參數設為 MANUAL 並立即取消植入來 ALTER 分散式可用性群組。 在全域主要上執行命令:

-- Cancel automatic seeding​.  Connect to global primary but specify DAG AG2
ALTER AVAILABILITY GROUP [distributedag] ​  
   MODIFY ​ 
   AVAILABILITY GROUP ON ​ 
   'ag2' WITH ​ 
   ( ​ SEEDING_MODE = MANUAL ​ ); ​  

將分散式可用性群組加入第二個叢集

然後在第二個 WSFC 上聯結分散式可用性群組。

若要使用自動植入來聯結分散式可用性群組,請使用下列 Transact-SQL 程式碼:

ALTER AVAILABILITY GROUP [distributedag]   
   JOIN   
   AVAILABILITY GROUP ON  
      'ag1' WITH    
      (   
         LISTENER_URL = 'tcp://ag1-listener.contoso.com:5022',    
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
         FAILOVER_MODE = MANUAL,   
         SEEDING_MODE = AUTOMATIC   
      ),   
      'ag2' WITH    
      (   
         LISTENER_URL = 'tcp://ag2-listener.contoso.com:5022',   
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
         FAILOVER_MODE = MANUAL,   
         SEEDING_MODE = AUTOMATIC   
      );    
GO  

聯結第二個可用性群組次要複本上的資料庫

如果已將第二個可用性群組設定為使用自動植入,請移至步驟 2。

  1. 如果第二個可用性群組使用手動植入,則將您採用全域主要的備份還原到第二個可用性群組的次要:
RESTORE DATABASE [db1] 
FROM DISK = '<full backup location>' WITH NORECOVERY
RESTORE LOG [db1] FROM DISK = '<log backup location>' WITH NORECOVERY
  1. 在第二個可用性群組的次要複本上的資料庫處於還原中狀態後,您必須手動將它聯結至可用性群組。
ALTER DATABASE [db1] SET HADR AVAILABILITY GROUP = [ag2];   

容錯移轉分散式可用性群組

自 SQL Server 2022 (16.x) 引入 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 設定的分散式可用性群組支援後,SQL Server 2022 及更新版本的分散式可用性容錯移轉指示與 SQL Server 2019 及更早版本不同。

對於分散式可用性群組,唯一支援的容錯移轉類型是手動使用者啟動的 FORCE_FAILOVER_ALLOW_DATA_LOSS。 因此,若要防止資料遺失,您必須採取額外的步驟 (本節中詳述),以確保在啟動容錯移轉之前,兩個複本之間的資料會同步處理。

如果發生可接受資料遺失的緊急狀況,您可以啟動容錯移轉,而不需執行下列動作來確保資料同步處理:

ALTER AVAILABILITY GROUP distributedag FORCE_FAILOVER_ALLOW_DATA_LOSS

您可以使用相同的命令來容錯移轉至轉寄站,以及容錯回復至全域主要複本。

在 SQL Server 2022 (16.x) 及更新版本上,您可以設定分散式可用性群組的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 設定,旨在保證分散式可用性群組容錯移轉時不會遺失任何資料。 如果設定此設定,請遵循本節中的步驟來容錯移轉您的分散式可用性群組。 如果您不想使用 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 設定,請遵循指示,在 SQL Server 2019 及更早版本中容錯移轉分散式可用性群組。

若要確保不會遺失任何資料,請務必:

  1. 停止全域主要資料庫 (也就是主要可用性群組的資料庫) 上的所有交易
  2. 將分散式可用性群組設定為同步認可。
  3. 等候分散式可用性群組完成同步,且針對每個資料庫都有相同的 last_hardened_lsn。

同步處理資料之後,您可以容錯移轉分散式可用性群組:

  1. 在全域主要複本上,將分散式可用性群組角色設定為 SECONDARY,使分散式可用性群組無法使用。
  2. 使用 ALTER AVAILABILITY GROUP 將分散式可用性群組 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 設定設為 1。
  3. 測試容錯移轉整備。
  4. 使用 ALTER AVAILABILITY GROUP 搭配 FORCE_FAILOVER_ALLOW_DATA_LOSS 來容錯移轉主要可用性群組。
  5. 將分散式可用性群組 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 設定為 0。

下列 Transact-SQL 範例說明對名為 distributedag 的分散式可用性群組進行容錯移轉的詳細步驟:

  1. 若要確保不會遺失任何資料,請停止全域主要資料庫 (也就是主要可用性群組的資料庫) 上的所有交易。 然後透過「同時」在全域主要與轉寄站上執行下列程式碼,以將分散式可用性群組設定為同步認可。

     -- sets the distributed availability group to synchronous commit 
     ALTER AVAILABILITY GROUP [distributedag] 
     MODIFY 
     AVAILABILITY GROUP ON
     'ag1' WITH 
        ( 
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT 
        ), 
      'ag2' WITH  
        ( 
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT 
        );
     -- verifies the commit state of the distributed availability group
     select ag.name, ag.is_distributed, ar.replica_server_name, ar.availability_mode_desc, ars.connected_state_desc, ars.role_desc, 
         ars.operational_state_desc, ars.synchronization_health_desc from sys.availability_groups ag  
         join sys.availability_replicas ar on ag.group_id=ar.group_id
         left join sys.dm_hadr_availability_replica_states ars
         on ars.replica_id=ar.replica_id
         where ag.is_distributed=1
     GO
    

    注意

    在分散式可用性群組中,兩個可用性群組之間的同步處理狀態會取決於這兩個複本的可用性模式。 使用同步認可模式時,目前的主要可用性群組與目前的次要可用性群組都必須具有 SYNCHRONOUS_COMMIT 可用性模式。 因此,您必須同時對全域主要複本和轉寄站執行之前的指令碼。

  2. 等候分散式可用性群組的狀態變更為 SYNCHRONIZED,且所有複本都有相同的 last_hardened_lsn (每個資料庫)。 同時在全域主要 (主要可用性群組的主要複本) 與轉寄站上執行下列查詢,以檢查 synchronization_state_desc 和 last_hardened_lsn:

    -- Run this query on the Global Primary and the forwarder
    -- Check the results to see if synchronization_state_desc is SYNCHRONIZED, and the last_hardened_lsn is the same per database on both the global primary and  forwarder 
    -- If not rerun the query on both side every 5 seconds until it is the case
    --
    SELECT ag.name
             , drs.database_id
             , db_name(drs.database_id) as database_name
             , drs.group_id
             , drs.replica_id
             , drs.synchronization_state_desc
             , drs.last_hardened_lsn  
    FROM sys.dm_hadr_database_replica_states drs 
    INNER JOIN sys.availability_groups ag on drs.group_id = ag.group_id;
    

    在可用性群組 synchronization_state_descSYNCHRONIZED,且全域主要和轉寄站上每個資料庫的 last_hardened_lsn 皆相同之後,請繼續進行。 如果 synchronization_state_desc 不是 SYNCHRONIZED,或 last_hardened_lsn 不同,請每隔五秒執行命令一次,直到變更為止。 在 synchronization_state_desc = SYNCHRONIZED,且每個資料庫的 last_hardened_lsn 皆相同之前,請不要繼續進行。

  3. 在全域主要上,將分散式可用性群組角色設定為 SECONDARY

    ALTER AVAILABILITY GROUP distributedag SET (ROLE = SECONDARY); 
    

    目前無法使用分散式可用性群組。

  4. 針對 SQL Server 2022 (16.x) 和更新版本,在全域主要上,設定 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT。

    ALTER AVAILABILITY GROUP distributedag 
      SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    
  5. 測試容錯移轉整備。 同時在全域主要與轉寄站上執行下列查詢:

     -- Run this query on the Global Primary and the forwarder
     -- Check the results to see if the last_hardened_lsn is the same per database on both the global primary and forwarder 
     -- The availability group is ready to fail over when the last_hardened_lsn is the same for both availability groups per database
     --
     SELECT ag.name, 
         drs.database_id, 
         db_name(drs.database_id) as database_name,
         drs.group_id, 
         drs.replica_id,
         drs.last_hardened_lsn
     FROM sys.dm_hadr_database_replica_states drs
     INNER JOIN sys.availability_groups ag ON drs.group_id = ag.group_id;
    

    當兩個可用性群組的 last_hardened_lsn 針對每個資料庫皆相同時,可用性群組即準備好進行容錯移轉。 如果 last_hardened_lsn 在一段時間後不同,為了避免資料遺失,請在全域主要上執行此命令以容錯回復至全域主要,然後從第二個步驟重新開始:

    -- If the last_hardened_lsn is not the same after a period of time, to avoid data loss, 
    -- we need to fail back to the global primary by running this command on the global primary 
    -- and then start over from the second step:
    
    ALTER AVAILABILITY GROUP distributedag FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    
  6. 從主要可用性群組容錯移轉至次要可用性群組。 在轉寄站 (裝載次要可用性群組主要複本的 SQL Server) 上執行下列命令。

    -- Once the last_hardened_lsn is the same per database on both sides
    -- We can Fail over from the primary availability group to the secondary availability group. 
    -- Run the following command on the forwarder, the SQL Server instance that hosts the primary replica of the secondary availability group.
    
    ALTER AVAILABILITY GROUP distributedag FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    

    在這個步驟之後,就可以使用分散式可用性群組。

  7. 對於 SQL Server 2022 (16.x) 和更新版本,請清除分散式可用性群組 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT

    ALTER AVAILABILITY GROUP distributedag 
      SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0);
    

完成這些步驟之後,分散式可用性群組就可以進行容錯移轉,而不會遺失任何資料。 如果可用性群組所橫跨的地理位置距離會造成延遲,請將可用性模式變更回 ASYNCHRONOUS_COMMIT。

移除分散式可用性群組

下列 Transact-SQL 陳述式會移除名為 distributedag的分散式可用性群組:

DROP AVAILABILITY GROUP [distributedag]  

在容錯移轉叢集執行個體上建立分散式可用性群組

您可以使用容錯移轉叢集執行個體 (FCI) 上的可用性群組,建立分散式可用性群組。 在此情況下,您不需要可用性群組接聽程式。 請使用 FCI 執行個體之主要複本的虛擬網路名稱 (VNN)。 下列範例顯示稱為 SQLFCIDAG 的分散式可用性群組。 一個可用性群組為 SQLFCIAG。 SQLFCIAG 有兩個 FCI 複本。 主要 FCI 複本的 VNN 是 SQLFCIAG-1,而次要 FCI 複本的 VNN 是 SQLFCIAG-2。 分散式可用性群組也包含 SQLAG-DR,可用於災害復原。

AlwaysOn 分散式可用性群組

下列 DDL 會建立此分散式可用性群組。

CREATE AVAILABILITY GROUP [SQLFCIDAG]  
   WITH (DISTRIBUTED)   
   AVAILABILITY GROUP ON  
  'SQLFCIAG' WITH    
    (   
        LISTENER_URL = 'tcp://SQLFCIAG-1.contoso.com:5022',    
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
         FAILOVER_MODE = MANUAL,   
         SEEDING_MODE = AUTOMATIC
      ),   
  'SQLAG-DR' WITH    
       (   
         LISTENER_URL = 'tcp://SQLAG-DR.contoso.com:5022',   
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
         FAILOVER_MODE = MANUAL,   
         SEEDING_MODE = AUTOMATIC
      );   

接聽程式 URL 會是主要 FCI 執行個體的 VNN。

手動容錯移轉分散式可用性群組中的 FCI

若要手動容錯移轉 FCI 可用性群組,請更新分散式可用性群組以反映接聽程式 URL 的變更。 例如,在分散式 AG 的全域主要和 SQLFCIDAG 分散式 AG 的轉寄站上,執行下列 DDL:

ALTER AVAILABILITY GROUP [SQLFCIDAG]  
   MODIFY AVAILABILITY GROUP ON  
 'SQLFCIAG' WITH    
    (   
        LISTENER_URL = 'tcp://SQLFCIAG-2.contoso.com:5022'
    )

下一步

CREATE AVAILABILITY GROUP (Transact-SQL)
ALTER AVAILABILITY GROUP (Transact-SQL)