設定 SQL Server Always On 可用性群組以確保 Linux 上的高可用性

適用於:SQL Server - Linux

本文描述如何建立 SQL Server Always On 可用性群組 (AG) 以確保 Linux 上的高可用性。 AG 有兩種設定類型。 「高可用性」設定會使用叢集管理員來確保商務持續性。 此設定也可以包含讀取級別複本。 本文件說明如何建立 AG 以確保高可用性。

您也可以建立用於「讀取級別」的 AG,而不使用叢集管理員。 讀取縮放 AG 只提供用於效能擴增的唯讀複本,並不提供高可用性。 若要建立用於讀取級別的 AG ,請參閱設定 SQL Server 可用性群組供 Linux 上的讀取級別之用

您必須在設定中使用兩個或三個同步認可複本,才能保證高可用性和資料保護。 使用三個同步複本時,即使無法使用某部伺服器,AG 也可以自動復原。 如需詳細資訊,請參閱可用性群組組態的高可用性和資料保護

所有伺服器都必須為實體或虛擬伺服器,而虛擬伺服器必須位於相同的虛擬化平台上。 由於隔離代理程式是平台特定的,因此會有這項需求。 請參閱客體叢集的原則

藍圖

在 Linux 伺服器上建立 AG 以確保高可用性的步驟,與 Windows Server 容錯移轉叢集上的步驟不同。 下列清單描述高階步驟:

  1. Linux 上的 SQL Server 安裝指引

    重要

    AG 中所有三部伺服器都必須位於相同的平台上 (實體或虛擬),因為 Linux 高可用性功能會使用隔離代理程式來隔離伺服器上的資源。 隔離代理程式是每個平台特定的。

  2. 建立 AG。 目前的文章將涵蓋此步驟。

  3. 設定叢集資源管理員,例如 Pacemaker。

    設定叢集資源管理員的方式取決於特定 Linux 發行版本。 如需發行版本的特定指示,請參閱下列連結:

    重要

    實際執行環境需要隔離代理程式來取得高可用性。 此文章的範例不會使用隔離代理程式。 它們僅供測試和驗證使用。

    Pacemaker 叢集會使用隔離來將叢集回復為已知狀態。 設定隔離的方式取決於發行版本和環境。 目前,有些雲端環境無法使用隔離。 如需詳細資訊,請參閱 Support Policies for RHEL High Availability Clusters - Virtualization Platforms (RHEL 高可用性叢集的支援原則 - 虛擬化平台)。

    針對 SLES,請參閱 SUSE Linux Enterprise High Availability Extension (SUSE Linux Enterprise 高可用性延伸模組)。

  4. 將 AG 新增為叢集中的資源。

    將 AG 新增為叢集資源的方式取決於 Linux 發行版本。 如需發行版本的特定指示,請參閱下列連結:

多個網路介面 (NIC) 的考量

如需為具有多個 NIC 的伺服器設定可用性群組的詳細資訊,請參閱下列相關章節:

必要條件

建立可用性群組之前,您需要:

  • 設定您的環境,讓所有將要裝載可用性複本的伺服器能夠通訊。
  • 安裝 SQL Server。

注意

在 Linux 上,您必須先建立可用性群組,再將它新增為叢集資源,以供叢集管理。 本文件提供建立可用性群組的範例。 如需建立叢集並將可用性群組新增為叢集資源的發行版本特定指示,請參閱<後續步驟>底下的連結。

  1. 更新每一部主機的電腦名稱。

    每個 SQL Server 名稱必須是:

    • 15 個字元以下。
    • 在網路內是唯一的。

    若要設定電腦名稱,請編輯 /etc/hostname。 下列指令碼可讓您使用 vi 編輯 /etc/hostname

    sudo vi /etc/hostname
    
  2. 設定 hosts 檔案。

    注意

    如果在 DNS 伺服器中註冊了主機名稱及其 IP 位址,您就無須執行下列步驟。 驗證所有要作為可用性群組設定一部分的節點都可以彼此通訊。 (對主機名稱的 Ping 應以對應的 IP 位址回覆)。此外,請確定 /etc/hosts 檔案不包含對應 localhost IP 位址 127.0.0.1 與節點主機名稱的記錄。

    每一部伺服器上的 hosts 檔案包含將參與可用性群組之所有伺服器的 IP 位址和名稱。

    下列命令會傳回目前伺服器的 IP 位址:

    sudo ip addr show
    

    更新 /etc/hosts。 下列指令碼可讓您使用 vi 編輯 /etc/hosts

    sudo vi /etc/hosts
    

    下列範例顯示 node1 上的 /etc/hosts,並新增了 node1node2node3。 在此範例中,node1 是指裝載主要複本的伺服器,node2node3 則是裝載次要複本的伺服器。

    127.0.0.1    localhost localhost4 localhost4.localdomain4
    ::1          localhost localhost6 localhost6.localdomain6
    10.128.18.12 node1
    10.128.16.77 node2
    10.128.15.33 node3
    

安裝 SQL Server

安裝 SQL Server。 下列連結指向各種發行版本的 SQL Server 安裝指示:

啟用 Always On 可用性群組

為每個裝載 SQL Server 執行個體的節點啟用 Always On 可用性群組,然後重新啟動 mssql-server。 執行下列指令碼:

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server

啟用 AlwaysOn_health 事件工作階段

對可用性群組進行疑難排解時,您可以選擇性地啟用擴充事件 (XE) 以利診斷根本原因。 在每個 SQL Server 執行個體上執行下列命令:

ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

如需此 XE 工作階段的詳細資訊,請參閱設定 Always On 可用性群組的擴充事件

建立憑證

Linux 上的 SQL Server 服務使用憑證來驗證鏡像端點之間的通訊。

下列 Transact-SQL 指令碼會建立主要金鑰和憑證。 然後它會備份憑證,並使用私密金鑰保護檔案。 請以強式密碼更新指令碼。 連線到主要 SQL Server 執行個體。 若要建立憑證,執行下列 Transact-SQL 指令碼:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
   TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
   WITH PRIVATE KEY (
           FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
           ENCRYPTION BY PASSWORD = '**<Private_Key_Password>**'
        );

此時,您的 SQL Server 主要複本含有一個位於 /var/opt/mssql/data/dbm_certificate.cer 的憑證,以及一個位於 var/opt/mssql/data/dbm_certificate.pvk 的私密金鑰。 將這兩個檔案複製到將裝載可用性複本的所有伺服器上的相同位置。 使用 mssql 使用者,或授與 mssql 使用者存取這些檔案的權限。

例如,在來源伺服器上,下列命令會將檔案複製到目標電腦。 將 **<node2>**值取代為要裝載複本的 SQL Server 執行個體的名稱。

cd /var/opt/mssql/data
scp dbm_certificate.* root@**<node2>**:/var/opt/mssql/data/

在每個目標伺服器上,授與 mssql 使用者存取憑證的權限。

cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*

在次要伺服器上建立憑證

下列 Transact-SQL 指令碼會從您在 SQL Server 主要複本上建立的備份來建立主要金鑰和憑證。 請以強式密碼更新指令碼。 解密密碼與您在上一個步驟中用來建立 .pvk 檔案的密碼相同。 若要建立憑證,請在所有次要伺服器上執行下列指令碼:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';
CREATE CERTIFICATE dbm_certificate
    FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
    WITH PRIVATE KEY (
           FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
           DECRYPTION BY PASSWORD = '**<Private_Key_Password>**'
        );

在所有複本上建立資料庫鏡像端點

資料庫鏡像端點使用「傳輸控制通訊協定」(TCP),在參與資料庫鏡像工作階段或裝載可用性複本的伺服器執行個體之間傳送和接收訊息。 資料庫鏡像端點會在唯一的 TCP 通訊埠編號上接聽。

下列 Transact-SQL 指令碼會為可用性群組建立名為 Hadr_endpoint 的接聽端點。 它會啟動端點,並將連線權限授與您建立的憑證。 執行指令碼之前,請取代 **< ... >** 之間的值。 您可以選擇性地包含 IP 位址 LISTENER_IP = (0.0.0.0)。 接聽程式 IP 位址必須是 IPv4 位址。 您也可以使用 0.0.0.0

請在所有 SQL Server 執行個體上更新您環境的下列 Transact-SQL 指令碼:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = **<5022>**)
    FOR DATABASE_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;

注意

如果您在某個節點上使用 SQL Server Express Edition 來裝載僅限設定複本,則唯一有效的 ROLE 值為 WITNESS。 在 SQL Server Express Edition 上執行下列指令碼:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = **<5022>**)
    FOR DATABASE_MIRRORING (
        ROLE = WITNESS,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;

防火牆上的 TCP 連接埠必須開啟以作為接聽程式連接埠。

重要

對於 SQL Server 2017 版,資料庫鏡像端點唯一支援的驗證方法是 CERTIFICATE。 未來的版本將啟用 WINDOWS 選項。

如需詳細資訊,請參閱資料庫鏡像端點 (SQL Server)

建立 AG

本節中的範例說明如何使用 Transact-SQL 建立可用性群組。 您也可以使用 SQL Server Management Studio [可用性群組精靈]。 當您使用精靈建立 AG 時,它會在您將複本加入 AG 時傳回錯誤。 若要修正此問題,請將 ALTERCONTROLVIEW DEFINITIONS 授與所有複本 AG 上的 Pacemaker。 將權限授與主要複本之後,請透過精靈將節點加入 AG,但若要讓 HA 正常運作,請將權限授與所有複本。

如需可確保自動容錯移轉的高可用性設定,AG 需要至少三個複本。 下列任一項設定可支援高可用性:

如需詳細資訊,請參閱可用性群組組態的高可用性和資料保護

注意

可用性群組可包含額外的同步或非同步複本。

建立 AG 以確保 Linux 上的高可用性。 搭配使用 CREATE AVAILABILITY GROUPCLUSTER_TYPE = EXTERNAL

  • 可用性群組:CLUSTER_TYPE = EXTERNAL

    指定外部叢集實體管理 AG。 Pacemaker 即為外部叢集實體的範例。 當 AG 叢集類型為外部時,

  • 將主要和次要複本設定為 FAILOVER_MODE = EXTERNAL

    指定複本會與外部叢集管理員互動,例如 Pacemaker。

下列 Transact-SQL 指令碼會建立名為 ag1 的高可用性 AG。 該指令碼會將 AG 複本設定為 SEEDING_MODE = AUTOMATIC。 此設定會導致 SQL Server 在每部次要伺服器上自動建立資料庫。 更新您環境中的下列指令碼。 將 <node1><node2><node3> 值取代為裝載複本的 SQL Server 執行個體名稱。 將 <5022> 取代為您為資料鏡像端點設定的連接埠。 若要建立 AG,請在裝載主要複本的 SQL Server 執行個體上執行下列 Transact-SQL。

重要

在 SQL Server 資源代理程式的目前實作中,節點名稱必須符合執行個體的 ServerName 屬性。 例如,若您的節點名稱是 node1,請確定 SERVERPROPERTY('ServerName') 在 SQL Server 執行個體中傳回 node1。 如果不相符,您的複本會在建立 Pacemaker 資源後進入解析中狀態。

此規則非常重要的一個案例是使用完整網域名稱時。 例如,若您在叢集設定期間使用 node1.yourdomain.com 作為節點名稱,請確定 SERVERPROPERTY('ServerName') 傳回 node1.yourdomain.com,而不只是 node1。 此問題的可能因應措施如下:

  • 將主機名稱重新命名為 FQDN,並使用 sp_dropserversp_addserver 預存程序來確保 SQL Server 中的中繼資料符合變更。
  • addr 命令中使用 pcs cluster auth 選項,將節點名稱與 SERVERPROPERTY('ServerName') 值相符,並使用靜態 IP 作為節點位址。

執行下列指令碼之一

建立具有三個同步複本的可用性群組

建立具有三個同步複本的 AG:

CREATE AVAILABILITY GROUP [ag1]
      WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
      FOR REPLICA ON
         N'<node1>'
               WITH (
            ENDPOINT_URL = N'tcp://<node1>:<5022>',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            ),
         N'<node2>'
         WITH (
            ENDPOINT_URL = N'tcp://<node2>:<5022>',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            ),
         N'<node3>'
         WITH(
            ENDPOINT_URL = N'tcp://<node3>:<5022>',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            );

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

重要

在您執行上述指令碼來建立具有三個同步複本的 AG 之後,請不要執行下列指令碼:

建立具有兩個同步複本和一個設定複本的可用性群組

建立具有兩個同步複本和一個設定複本的 AG:

重要

此結構可讓任何版本的 SQL Server 裝載第三個複本。 例如,您可以在 SQL Server Express Edition 上裝載第三個複本。 在 Express Edition 中,唯一有效的端點類型是 WITNESS

CREATE AVAILABILITY GROUP [ag1]
   WITH (CLUSTER_TYPE = EXTERNAL)
   FOR REPLICA ON
      N'<node1>' WITH (
         ENDPOINT_URL = N'tcp://<node1>:<5022>',
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
         FAILOVER_MODE = EXTERNAL,
         SEEDING_MODE = AUTOMATIC
         ),
      N'<node2>' WITH (
         ENDPOINT_URL = N'tcp://<node2>:<5022>',
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
         FAILOVER_MODE = EXTERNAL,
         SEEDING_MODE = AUTOMATIC
         ),
      N'<node3>' WITH (
         ENDPOINT_URL = N'tcp://<node3>:<5022>',
         AVAILABILITY_MODE = CONFIGURATION_ONLY
         );
ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

建立具有兩個同步複本的可用性群組

建立具有兩個同步複本的 AG

包含兩個具有同步可用性模式的複本。 例如,下列指令碼會建立稱為 ag1 的 AG。 node1node2 會以同步模式裝載複本,並提供自動植入和自動容錯移轉功能。

重要

僅執行下列指令碼,以建立具有兩個同步複本的 AG。 如果您已執行上述任一指令碼,請不要執行下列指令碼。

CREATE AVAILABILITY GROUP [ag1]
   WITH (CLUSTER_TYPE = EXTERNAL)
   FOR REPLICA ON
   N'node1' WITH (
      ENDPOINT_URL = N'tcp://node1:5022',
      AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
      FAILOVER_MODE = EXTERNAL,
      SEEDING_MODE = AUTOMATIC
   ),
   N'node2' WITH (
      ENDPOINT_URL = N'tcp://node2:5022',
      AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
      FAILOVER_MODE = EXTERNAL,
      SEEDING_MODE = AUTOMATIC
   );

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

您也可以使用 SQL Server Management Studio 或 PowerShell 來設定 CLUSTER_TYPE=EXTERNAL 的 AG。

將次要複本加入 AG

Pacemaker 使用者需具備所有複本上可用性群組的 ALTERVIEW DEFINITIONCONTROL 權限。 若要授與權限,請在主要複本及每個次要複本上建立可用性群組,並將這些權限新增至可用性群組之後,立即執行下列 Transact-SQL 指令碼。 請將 <pacemakerLogin> 取代為 Pacemaker 使用者帳戶名稱,再執行指令碼。 如果您沒有 Pacemaker 的登入,請建立 Pacemaker 的 SQL Server 登入

GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO <pacemakerLogin>
GRANT VIEW SERVER STATE TO <pacemakerLogin>

下列 Transact-SQL 指令碼會將 SQL Server 執行個體加入名為 ag1 的 AG。 更新您環境中的指令碼。 在每個裝載次要複本的 SQL Server 執行個體上,執行下列 Transact-SQL 以加入 AG。

ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

將資料庫新增至可用性群組

請確定您要新增至可用性群組的資料庫處於完整復原模式,而且具有有效的記錄備份。 如果這是測試資料庫或新建立的資料庫,請進行資料庫備份。 在主要 SQL Server 上,執行下列 Transact-SQL 指令碼來建立和備份稱為 db1 的資料庫:

CREATE DATABASE [db1];
ALTER DATABASE [db1] SET RECOVERY FULL;
BACKUP DATABASE [db1]
   TO DISK = N'/var/opt/mssql/data/db1.bak';

在 SQL Server 主要複本上,執行下列 Transact-SQL 指令碼將稱為 db1 的資料庫新增至稱為 ag1 的可用性群組:

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];

確認已在次要伺服器上建立資料庫

在每個 SQL Server 次要複本上,執行下列查詢來查看 db1 資料庫是否已建立且已同步處理:

SELECT * FROM sys.databases WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

重要

建立 AG 之後,您必須設定叢集技術 (例如 Pacemaker) 的整合,以確保高可用性。 針對使用 AG 的讀取縮放設定,從 SQL Server 2017 (14.x) 開始,即已不需要設定叢集。

如果您遵循本文件的步驟,會產生尚未叢集化的 AG。 下一個步驟是新增叢集。 此設定適用於讀取級別/負載平衡案例,但需進一步完成才能確保高可用性。 如需高可用性,您必須將 AG 新增為叢集資源。 如需相關指示,請參閱相關內容

備註

重要

當您設定叢集並將 AG 新增為叢集資源之後,就無法使用 Transact-SQL 來容錯移轉 AG 資源。 Linux 上的 SQL Server 叢集資源與作業系統的整合程度,不如 Windows Server 容錯移轉叢集 (WSFC) 上的緊密。 SQL Server 服務不知道叢集是否存在。 所有協調流程都會透過叢集管理工具來完成。 在 RHEL 或 Ubuntu 中,請使用 pcs。 在 SLES 中,請使用 crm

重要

如果 AG 是叢集資源,在目前的版本中有個已知問題:非同步複本的資料遺失強制容錯移轉無法運作。 即將推出的版本將會修正此問題。 同步複本的手動或自動容錯移轉會成功。