使用分散式 AG 來移轉可用性群組

使用分散式可用性群組 (AG) 來移轉 Always On 可用性群組中的資料庫,同時在 Azure 虛擬機器 (VM) 上的 SQL Server 保持移轉後的高可用性和災害復原 (HADR) 支援。

驗證來源 SQL Server 執行個體符合必要條件之後,請遵循本文的步驟,請依照本文的步驟,在現有可用性群組與 Azure VM 上的 SQL Server 上的目標可用性群組之間建立分散式可用性。

本文適用於參與可用性群組的資料庫,且需要 Windows Server 容錯移轉叢集 (WSFC) 及可用性群組接聽程式。 也可以從獨立 SQL Server 執行個體移轉資料庫。

Diagram explaining availability group migration using a distributed availability group

初始設定

第一個步驟是在 Azure 建立 SQL Server VM。 做法是使用 Azure 入口網站Azure PowerShellARM 範本

請務必根據 必要條件設定 SQL Server VM。 選擇單一子網路部署 (依賴 Azure Load Balancer 或分散式網路名稱),將流量路由至您的可用性群組接聽程式,或選擇不具這類需求的多重子網路部署。 建議使用多重子網路部署。 如需詳細資訊,請參閱連線能力

為了簡單起見,請將目標 SQL Server VM 加入與來源 SQL Server 執行個體相同的網域。 否則,請將目標 SQL Server VM 加入與來源 SQL Server 執行個體網域同盟的網域。

若要使用自動植入來建立分散式可用性群組 (DAG),DAG 的全域主要 (來源) 執行個體名稱必須符合 DAG 的轉寄站 (目標) 執行個體名稱。 如果全域主要和轉寄站之間有執行個體名稱不符,則必須使用手動植入來建立 DAG,並在未來手動新增任何其他資料庫檔案。

本文使用下列範例參數:

  • 資料庫名稱:Adventureworks
  • 來源機器名稱:OnPremNode1 (DAG 的全域主要名稱),OnPremNode2
  • 來源 SQL Server 執行個體名稱:MSSQLSERVERMSSQLSERVER
  • 來源可用性群組名稱:OnPremAg
  • 來源可用性群組接聽程式名稱:OnPremAG_LST
  • 目標 SQL Server VM 名稱:SQLVM1 (DAG 的轉寄站),SQLVM2
  • Azure VM 執行個體名稱上的目標 SQL Server:MSSQLSERVERMSSQLSERVER
  • 目標可用性群組名稱:AzureAG
  • 來源可用性群組接聽程式名稱:AzureAG_LST
  • 端點名稱:Hadr_endpoint
  • 分散式可用性群組名稱:DAG
  • 網域名稱:Contoso

建立端點

使用 Transact-SQL (T-SQL) 在兩個來源執行個體 (OnPremNode1OnPremNode2) 及目標 SQL Server 執行個體 (SQLVM1SQLVM2) 上建立端點。

如果您已在來源執行個體設定可用性群組,則只會在兩個目標執行個體執行此指令碼。

若要建立端點,請在來源和目標伺服器上執行此 T-SQL 指令碼:

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

網域帳戶會自動具有端點的存取權,但服務帳戶可能不會自動成為系統管理員群組的一部分,而且可能沒有連線權限。 若要手動授與 SQL Server 服務帳戶對端點的連線權限,請在這兩部伺服器上執行下列 T-SQL 指令碼:

GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [<your account>] 

建立來源 AG

由於分散式可用性群組是跨越兩個個別可用性群組的特殊可用性群組,因此您必須先在兩個來源 SQL Server 執行個體建立可用性群組。

如果您的來源執行個體已經有可用性群組,請略過本節。

使用 Transact-SQL (T-SQL) 在範例 Adventureworks 資料庫的兩個來源執行個體 (OnPremNode1OnPremNode2) 之間建立可用性群組 (OnPremAG)。

若要在來源執行個體建立可用性群組,請在來源主要複本執行此指令碼 (OnPremNode1):

CREATE AVAILABILITY GROUP [OnPremAG]  
WITH ( AUTOMATED_BACKUP_PREFERENCE = PRIMARY, 
    DB_FAILOVER = OFF,  
    DTC_SUPPORT = NONE ) 
FOR DATABASE  [Adventureworks]  
REPLICA ON  
    N'OnPremNode1' WITH (ENDPOINT_URL = N'TCP://OnPremNode1.contoso.com:5022',  
    FAILOVER_MODE = AUTOMATIC, 
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
    SEEDING_MODE = AUTOMATIC,  
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)),   
    N'OnPremNode2' WITH (ENDPOINT_URL = N'TCP://OnPremNode2.contoso.com:5022',  
    FAILOVER_MODE = AUTOMATIC,  
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
    SEEDING_MODE = AUTOMATIC,  
    SECONDARY_ROLE(ALLOW_CONNECTIONS = NO));	 

接下來,將次要複本 (OnPremNode2) 加入可用性群組 (OnPremAg)。

若要加入可用性群組,請在來源次要複本執行此指令碼:

ALTER AVAILABILITY GROUP [OnPremAG] JOIN; 
GO 
ALTER AVAILABILITY GROUP [OnPremAG] GRANT CREATE ANY DATABASE; 
GO 

最後,為您的全域轉寄站可用性群組建立接聽程式 (OnPremAG)。

若要建立接聽程式,請在來源主要複本執行此指令碼:

USE [master] 
GO 
ALTER AVAILABILITY GROUP [OnPremAG] 
ADD LISTENER N'OnPremAG_LST' ( 
WITH IP ((<available static ip>, <mask>) 
, PORT=60173); 
GO

建立目標 AG

您也需要在目標 SQL Server VM 建立可用性群組。

如果您已在 Azure 中的 SQL Server 執行個體之間設定可用性群組,請略過本節。

使用 Transact-SQL (T-SQL) 在目標 SQL Server 執行個體 (SQLVM1SQLVM2) 建立可用性群組 (AzureAG)。

若要在目標建立可用性群組,請在目標主要複本執行此指令碼:

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

接下來,將目標次要複本 (SQLVM2) 加入可用性群組 (AzureAG)。

在目標次要複本執行此指令碼:

ALTER AVAILABILITY GROUP [AzureAG]   JOIN; 
GO 
ALTER AVAILABILITY GROUP [AzureAG]   GRANT CREATE ANY DATABASE; 
GO 

最後,為目標可用性群組 (AzureAG) 建立接聽程式 (AzureAG_LST)。 如果將 SQL Server VM 部署到多個子網路,請使用 Transact-SQL 建立接聽程式。 如果將 SQL Server VM 部署到單一子網路,請為接聽程式設定 Azure Load Balancer分散式網路名稱

若要建立接聽程式,請在 Azure 可用性群組的主要複本執行此指令碼。

ALTER AVAILABILITY GROUP [AzureAG]
ADD LISTENER N'AzureAG_LST' (
WITH IP
( (N'<primary replica's secondary ip >', N'<primary mask>'), (N'<secondary replica's secondary ip>', N'<secondary mask>') )
, PORT=<port number you set>);
GO

建立分散式 AG

設定來源 (OnPremAG) 和目標 (AzureAG) 可用性群組之後,請建立分散式可用性群組以跨越這兩個個別可用性群組。

在來源 SQL Server 全域主要 (OnPremNode1) 及 AG (OnPremAG) 上使用 Transact-SQL 來建立分散式可用性群組 (DAG)。

若要在來源建立分散式 AG,請在來源全域主要複本執行此指令碼:

CREATE AVAILABILITY GROUP [DAG]  
 		  WITH (DISTRIBUTED)    
  		 AVAILABILITY GROUP ON  
  'OnPremAG' WITH   
  (		 
 LISTENER_URL = 'tcp://OnPremAG_LST.contoso.com:5022',   
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
 FAILOVER_MODE = MANUAL,    
 SEEDING_MODE = AUTOMATIC    
  ),    
  'AzureAG' WITH   
  (    
 LISTENER_URL = 'tcp://AzureAG_LST.contoso.com:5022', 
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,  
 FAILOVER_MODE = MANUAL,    
 SEEDING_MODE = AUTOMATIC    
  );     
GO 

注意

植入模式會設定為 AUTOMATIC,因為目標上的 SQL Server 版本和來源相同。 如果您的 SQL Server 目標版本較高,或您的全域主要和轉寄站具有不同的執行個體名稱,請建立分散式 AG,並將次要 AG 加入分散式 AG,並將 SEEDING_MODE 設定為 MANUAL。 然後,將資料庫從來源手動還原至目標 SQL Server 執行個體。 請檢閱在移轉期間升級版本,以深入瞭解。

建立分散式 AG 之後,將目標轉寄站執行個體 (SQLVM1) 的目標 AG (AzureAG) 加入分散式 AG (DAG)。

若要將目標 AG 加入分散式 AG,請在目標轉寄站執行此指令碼:

ALTER AVAILABILITY GROUP [DAG]  
   JOIN    
   		AVAILABILITY GROUP ON   
  'OnPremAG' WITH     
 	 (    
 LISTENER_URL = 'tcp://OnPremAG_LST.contoso.com:5022',  
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, 
 FAILOVER_MODE = MANUAL, 
 SEEDING_MODE = AUTOMATIC  
  ),    
  'AzureAG' WITH    
 	 (    
 LISTENER_URL = 'tcp://AzureAG_LST.contoso.com:5022',    
 AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,    
 FAILOVER_MODE = MANUAL,    
 SEEDING_MODE = AUTOMATIC    
  );     
GO    

如果您需要取消、暫停或延遲來源和目標可用性群組之間的同步處理 (例如效能問題),請在來源全域主要執行個體執行此指令碼 (OnPremNode1):

ALTER AVAILABILITY GROUP [DAG] 
   MODIFY  
   AVAILABILITY GROUP ON   
   'AzureAG' WITH 
   (  SEEDING_MODE = MANUAL  );  

若要深入瞭解,請檢閱取消自動植入至轉寄站

下一步

建立分散式可用性群組之後,您就可以完成移轉