為 Linux 上的 SQL Server 建立和設定可用性群組

適用於:Linux 上的 SQL Server

本教學示範如何在 Linux 上建立並設定 SQL Server 的可用性群組(AG)。 與 SQL Server 2016(13.x)及更早版本的 Windows 不同,你可以先啟用 AG,無論是否建立底層的 Pacemaker 叢集。 如果需要,與叢集整合會在之後進行。

本教學課程包含下列工作:

  • 啟用可用性群組。
  • 建立可用性群組端點和憑證。
  • 使用 SQL Server Management Studio (SSMS) 或 Transact-SQL 來建立可用性群組。
  • 建立 Pacemaker 的 SQL Server 登入和權限。
  • 在 Pacemaker 叢集(僅限外部類型)中建立可用性群組資源。

先決條件

部署 Pacemaker 高可用性叢集。 欲了解更多資訊,請參閱部署 Pacemaker 叢集Linux 上的 SQL Server

啟用可用性群組功能

不同於在 Windows 上,您無法使用 PowerShell 或 SQL Server 組態管理員來啟用可用性群組 (AG) 功能。 在 Linux 上,你可以用兩種方式啟用可用性群組功能:使用 mssql-conf 工具,或手動編輯 mssql.conf 檔案。

Important

您必須在 SQL Server Express 中啟用 AG 功能,即使是對於僅用於配置的副本。

使用 mssql-conf 工具

在提示音時,執行以下指令:

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

編輯 mssql.conf 檔案

你也可以修改位於mssql.conf資料夾下方的/var/opt/mssql檔案。 補充以下幾行:

[hadr]

hadr.hadrenabled = 1

重新啟動 SQL Server

啟用可用性群組後,您必須重新啟動 SQL Server。 請使用下列命令:

sudo systemctl restart mssql-server

建立可用性群組端點和憑證

可用性群組會使用 TCP 端點進行通訊。 在 Linux 下,SQL Server 只有在使用憑證進行認證時,才支援 AG 的端點。 你必須將憑證從一個實例還原到參與同一 AG 的所有其他副本實例上。 即使只是配置用的複本,你仍然需要憑證過程。

你只能透過使用 Transact-SQL 建立端點並還原憑證。 你也可以使用非 SQL Server 產生的憑證。 您也需要一個處理序來管理和取代任何過期的憑證。

Important

如果您打算使用 SQL Server Management Studio 精靈來建立 AG,您仍然需要在 Linux 上使用 Transact-SQL 來建立和還原憑證。

關於各種指令(包括安全性)可用選項的完整語法,請參見:

Note

雖然你建立了可用性群組,但該端點類型使用 FOR DATABASE_MIRRORING,因為該端點類型與該已棄用的功能共享底層面向。

此範例會建立三節點設定的憑證。 執行個體名稱稱為 LinAGN1LinAGN2LinAGN3

  1. LinAGN1 上執行下列指令碼,以建立主要金鑰、憑證和端點,以及備份憑證。 在此範例中,端點使用典型的 TCP 埠 5022。

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN1_Cert
    WITH SUBJECT = 'LinAGN1 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN1_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN1_Cert,
        ROLE = ALL
    );
    GO
    
  2. LinAGN2 上執行相同的動作:

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
    WITH SUBJECT = 'LinAGN2 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN2_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN2_Cert,
        ROLE = ALL
    );
    GO
    
  3. 最後,在 LinAGN3 上執行相同的順序:

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
    WITH SUBJECT = 'LinAGN3 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN3_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN3_Cert,
        ROLE = ALL
    );
    GO
    
  4. 使用 scp 或其他工具將憑證的備份複製到你想加入 AG 的每個節點。

    針對此範例:

    • 複製 LinAGN1_Cert.cerLinAGN2LinAGN3
    • 複製 LinAGN2_Cert.cerLinAGN1LinAGN3
    • 複製 LinAGN3_Cert.cerLinAGN1LinAGN2
  5. 將擁有權以及與所複製憑證檔案相關聯的群組變更為 mssql

    sudo chown mssql:mssql <CertFileName>
    
  6. LinAGN2 上建立與 LinAGN3LinAGN1 相關聯的執行個體層級登入和使用者。

    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    

    注意事項

    您的密碼應遵循 SQL Server 預設 密碼原則。 根據預設,密碼長度必須至少為8個字元,且包含下列四個集合中的三個字元:大寫字母、小寫字母、基底10位數和符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。

  7. LinAGN2_Cert 上還原 LinAGN3_CertLinAGN1。 其他副本的憑證對 AG 通訊與安全至關重要。

    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  8. 請授予與 LinAGN2LinAGN3 相關的登入以連接至 LinAGN1 之端點的權限。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    
  9. LinAGN1 上建立與 LinAGN3LinAGN2 相關聯的執行個體層級登入和使用者。

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    
  10. LinAGN1_Cert 上還原 LinAGN3_CertLinAGN2

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  11. 請授予與 LinAGN1LinAGN3 相關的登入以連接至 LinAGN2 之端點的權限。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    GO
    
  12. LinAGN1 上建立與 LinAGN2LinAGN3 相關聯的執行個體層級登入和使用者。

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
  13. LinAGN1_Cert 上還原 LinAGN2_CertLinAGN3

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
  14. 請授予與 LinAGN1LinAGN2 相關的登入以連接至 LinAGN3 之端點的權限。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GO
    

建立可用性群組

本節說明如何使用 SQL Server Management Studio(SSMS)或 Transact-SQL 來建立 SQL Server 的可用性群組。

使用 SQL Server Management Studio

本節說明如何使用 SSMS 中的 [新增可用性群組精靈],建立叢集類型為 External 的可用性群組 (AG)。

  1. 在 SSMS 中,展開 [Always On 高可用性],使用滑鼠右鍵按一下 [可用性群組],然後選取 [新增可用性群組精靈]。

  2. 介紹 對話框中,選擇 「下一步」。

  3. 「指定可用性群組選項」對話框中,輸入 AG 名稱,並在下拉選單中選擇叢集類型 或EXTERNALNONE。 部署心臟起搏器時使用 EXTERNAL 。 用於 NONE 特殊情境,例如讀取縮放。選擇資料庫層級健康偵測的選項是可選的。 欲了解更多此選項,請參閱 可用性群組資料庫層級健康偵測故障轉移選項。 選取 [下一步]。

    「建立可用性群組」的螢幕擷取畫面,其中顯示叢集類型。

  4. 「選擇資料庫」 對話框中,選擇你想參與 AG 的資料庫。 每個資料庫必須有完整的備份,才能加入 AG(可用性群組)。 選取 [下一步]。

  5. 「指定複本」 對話框中,選擇 新增複本

  6. 「連接伺服器」對話框中,輸入 SQL Server 的 Linux 實例名稱作為次要副本,以及連線的憑證。 選擇 連線

  7. 針對將包含僅設定用複本或其他次要複本的實例,重複前兩個步驟。

  8. 這三個實例都會出現在 「指定複本 」對話框中。 如果您使用 External 類型的叢集,對於作為真正次要複本的次要複本,請確保其可用性模式與主要複本相符,並將故障轉移模式設為 External。 對於僅用作設定的複本,請選擇「僅限設定」可用性模式。

    下列範例顯示的 AG 包含兩個複本、一個「外部」類型叢集,以及一個僅限設定複本。

    「建立可用性群組」的螢幕擷取畫面,其中顯示可讀取次要選項。

    下列範例顯示的 AG 包含兩個複本、一個「無」類型叢集,以及一個僅限設定複本。

    「建立可用性群組」的螢幕擷取畫面,其中顯示「複本」頁面。

  9. 如果你想更改備份偏好設定,請選擇 備份偏好 設定標籤。欲了解更多關於 AG 備份偏好的資訊,請參閱 「在 Always On 可用性群組的次要副本上配置備份」。

  10. 如果你使用可讀的次級檔或建立一個叢集類型為 None 的 AG 作為讀取縮放,你可以透過選擇 Listener 標籤來建立監聽器。你也可以之後再加一個聆聽者。 要建立監聽器,請選擇 「建立可用性群組監聽器 」選項,輸入名稱、TCP/IP 埠口,以及是使用靜態還是自動分配的 DHCP IP 位址。 對於叢集類型為 None 的 AG,請使用與主節點 IP 位址相符的靜態 IP。

    「建立可用性群組」的螢幕擷取畫面,其中顯示接聽程式選項。

  11. 如果你為可讀情境建立監聽器,SSMS 允許在精靈中建立唯讀路由。 你也可以稍後使用 SSMS 或 Transact-SQL 來新增它。 現在設定唯讀路由:

    1. 選取 唯讀路由選擇 索引標籤。

    2. 輸入唯讀複本的 URL。 這些 URL 與端點相似,不同之處在於它們使用執行個體的連接埠,而不是端點。

      1. 選取每個 URL,然後從底部選取可讀取複本。 要選擇多個,請按住 Shift 或 select-drag。
  12. 選取 [下一步]。

  13. 選擇如何初始化次要副本。 預設值是使用自動播種,這需要參與 AG 的所有伺服器上具有相同的路徑。 你也可以讓精靈做備份、複製和還原(第二個選項);如果你手動備份、複製並還原了副本上的資料庫,可以讓它加入(第三個選項);或者之後再加資料庫(最後一個選項)。 就像憑證一樣,如果你是手動備份並複製,請在其他副本上設定備份檔案的權限。 選取 [下一步]。

  14. 驗證 對話方塊中,如果精靈未對所有檢查傳回 成功,請進一步調查。 有些警告是可接受且不致命的,例如如果您未建立監聽器。 選取 [下一步]。

  15. 摘要 對話框中,選擇 完成。 現在開始建立 AG 的程序。

  16. AG 建立完成後,請在結果頁面選擇關閉。 您現在可以在複本上的動態管理檢視,以及 SSMS 中的 [Always On 高可用性] 資料夾底下看到 AG。

使用 Transact-SQL

本節展示了使用 Transact-SQL 建立 AG 的範例。 建立 AG 後,你可以設定監聽器和唯讀路由。 你可以用 ALTER AVAILABILITY GROUP來修改 AG 本身,但不能在 SQL Server 2017(14.x)中更改叢集類型。 如果您無意建立叢集類型為「外部」的 AG,則必須刪除它並重新建立成叢集類型為「無」。

欲了解更多資訊及其他選項,請參閱:

範例 A:兩個複本與一個僅限設定的複本(外部叢集類型)

此範例示範如何建立使用僅配置複本的雙副本可用性群組 (AG)。

  1. 在包含資料庫讀寫副本的主副本節點上執行以下語句。 此範例使用自動植入。

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE <DBName>
    REPLICA ON
    N'LinAGN1' WITH (
       ENDPOINT_URL = N' TCP://LinAGN1.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
    ),
    N'LinAGN2' WITH (
       ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
       SEEDING_MODE = AUTOMATIC
    ),
    N'LinAGN3' WITH (
       ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
       AVAILABILITY_MODE = CONFIGURATION_ONLY
    );
    GO
    
  2. 在連接到另一個副本的查詢視窗中,執行以下語句將副本與 AG 連接,並開始從主副本做種到次要副本。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 在連接到僅設定副本的查詢視窗中,執行以下陳述式將其與 AG 連接。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    

範例 B - 使用唯讀路由的三個複本 (外部叢集類型)

這個範例展示了如何在初始建立 AG 時配置唯讀路由,針對三個完整副本。

  1. 對作為主要副本的節點執行以下語句,該節點包含資料庫的完整讀寫副本。 此範例使用自動植入。

    CREATE AVAILABILITY GROUP [<AGName>] WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE < DBName > REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN2.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:1433')
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:1433')
        ),
        N'LinAGN3' WITH (
            ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN2.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN3.FullyQualified.Name:1433')
        )
        LISTENER '<ListenerName>' (
            WITH IP = ('<IPAddress>', '<SubnetMask>'), Port = 1433
        );
    GO
    

    關於此設定的一些注意事項:

    • AGName 是該總檢察長的名稱。
    • DBName 是您與 AG 一起使用的資料庫名稱。 也可以是逗號分隔的名單。
    • ListenerName 是與底層伺服器或節點不同的名稱。 你要在 DNS 裡註冊它,連同 IPAddress
    • IPAddress 是 的 ListenerNameIP 位址。 它也是唯一的,且與任何伺服器或節點都不相符。 應用程式和使用者使用 ListenerNameIPAddress 來連線到 AG。
      • SubnetMaskIPAddress 的子網掩碼。 在 SQL Server 2019(15.x)及更早版本中,這個值為 255.255.255.255。 在 SQL Server 2022(16.x)及之後版本中,這個值為 0.0.0.0
  2. 在連接到另一個副本的查詢視窗中,執行以下語句以將副本加入至可用性群組(AG),並從主副本啟動向次要副本的種子初始化過程。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 針對第三個複本重複步驟 2。

範例 C:使用唯讀路由的兩個複本 (無叢集類型)

此範例建立一個雙複本配置,使用叢集類型 None。 在不預期會發生容錯移轉的讀取擴充案例中,請使用此組態。 此步驟會建立作為主要副本的接聽程式,並設定具有循環配置功能的唯讀路由。

  1. 對作為主要副本的節點執行以下語句,該節點包含資料庫的完整讀寫副本。 此範例使用自動植入。

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = NONE)
    FOR DATABASE <DBName> REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name: <PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(
                ALLOW_CONNECTIONS = READ_WRITE,
                READ_ONLY_ROUTING_LIST = (('LinAGN1.FullyQualified.Name'.'LinAGN2.FullyQualified.Name'))
            ),
            SECONDARY_ROLE(
                ALLOW_CONNECTIONS = ALL,
                READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:<PortOfInstance>'
            )
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                     ('LinAGN1.FullyQualified.Name',
                        'LinAGN2.FullyQualified.Name')
                     )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfInstance>')
        ),
        LISTENER '<ListenerName>' (WITH IP = (
                 '<PrimaryReplicaIPAddress>',
                 '<SubnetMask>'),
                Port = <PortOfListener>
        );
    GO
    

    在此範例中:

    • AGName 是該總檢察長的名稱。
    • DBName 是您與 AG 一起使用的資料庫名稱。 也可以是逗號分隔的名單。
    • PortOfEndpoint 是你建立端點的埠號。
      • PortOfInstance是 SQL Server 實例的埠號。
    • ListenerName 是一個與任何一個基礎複本都不同的佔位名稱。
    • PrimaryReplicaIPAddress 是主要複本的 IP 位址。
      • SubnetMaskIPAddress 的子網掩碼。 在 SQL Server 2019(15.x)及更早版本中,這個值為 255.255.255.255。 在 SQL Server 2022(16.x)及之後版本中,這個值為 0.0.0.0
  2. 將次要複本加入 AG,並起始自動植入。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = NONE);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    

建立 Pacemaker 的 SQL Server 登入和權限

使用 Linux 上 SQL Server 的 Pacemaker 高可用性叢集需要存取 SQL Server 實例,以及對可用性群組 (AG) 本身的權限。 這些步驟會建立登入資訊及相關權限,並附帶一個告訴 Pacemaker 如何認證 SQL Server 的檔案。

  1. 在連線到第一個複本的查詢視窗中,執行下列指令碼:

    CREATE LOGIN PMLogin
        WITH PASSWORD = '<password>';
    GO
    
    GRANT VIEW SERVER STATE TO PMLogin;
    GO
    
    GRANT ALTER, CONTROL, VIEW DEFINITION
    ON AVAILABILITY GROUP::<AGThatWasCreated> TO PMLogin;
    GO
    
  2. 在節點 1 上,將以下兩行加入 /var/opt/mssql/secrets/passwd 檔案中:

    PMLogin
    
    <password>
    

    你可能需要提升權限 sudo 才能編輯這個檔案。

  3. 鎖定檔案:

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  4. 在其他作為副本的伺服器上重複步驟 1-5。

在 Pacemaker 叢集 (僅限外部) 中建立可用性群組資源

在 SQL Server 建立 AG 後,當你指定 Ecternal 叢集類型時,必須在 Pacemaker 中建立相應的資源。 AG 需要兩個資源:可用性群組資源和 IP 位址資源。 如果你沒有使用監聽器,設定 IP 位址資源是可選的。 不過,當你需要聽眾功能時,這是建議的。

你建立的 AG 資源是一種叫做 複製的資源。 AG 資源在每個節點上有副本,並有一個稱為 升階 資源的控制資源。 升級後的資源對應到裝載主要複本的伺服器。 其他資源會裝載次要副本(一般或僅限組態),並且可在容錯移轉時提升為主要副本。

Note

在 SQL Server 2025(17.x)及累積更新(CU)3 及更新版本中,Pacemaker HA agent v2(預覽版)可透過套件mssql-server-ha支援 Red Hat Enterprise Linux(RHEL)及 Ubuntu。 你可以在非生產環境中評估 Pacemaker HA 代理程式 v2。 現有的 Pacemaker HA 代理程式(v1)仍完整支援生產部署。 欲了解更多資訊,請參閱 Pacemaker HA agent v2(預覽版)。

Pacemaker HA 代理程式 v1

  1. 在 Pacemaker 中使用 Pacemaker HA 代理程式(v1)建立 AG 資源:(ocf:mssql:ag

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    在這個例子中, NameForAGResource 是你為這個叢集資源給 AG 賦予的唯一名稱,而 AGName 是你所建立的 AG 名稱。

  2. 建立與監聽器功能關聯的 AG 的 IP 位址資源。

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    在這個例子中, NameForIPResource 是 IP 資源的唯一名稱,而 IPAddress 是你指派給該資源的靜態 IP 位址。

  3. 為確保 IP 位址與 AG 資源運行於同一節點,請設定共置限制。

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    在此範例中, NameForIPResource 是 IP 資源的名稱,而 NameForAGResource 是 AG 資源的名稱。

  4. 建立排序約束,確保 AG 資源在 IP 位址之前執行。 雖然共置限制蘊含一個排序約束,但此步驟強制執行了排序限制。

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    在此範例中, NameForIPResource 是 IP 資源的名稱,而 NameForAGResource 是 AG 資源的名稱。

Pacemaker HA agent v2 (preview)

在 SQL Server 2025 (17.x) 的累積更新 (CU) 3 和後續版本中,mssql-server-ha 套件提供了適用於 Red Hat Enterprise Linux (RHEL) 和 Ubuntu 的新版 Pacemaker HA 代理程式 v2。

Pacemaker HA 代理 v2 相較於前一代代理,帶來了可靠性與效能的提升,包括:

  • 提升故障切換效能,以縮短計畫內外的故障切換時間。

  • 支援彈性自動故障轉移政策,包括健康 檢查逾時故障狀態等級的設定。

  • 支援 TLS 1.3,用於 Pacemaker 叢集與 SQL Server 之間的通訊。

Pacemaker HA agent v2 目前還在預覽階段。 現有的 Pacemaker HA 代理程式(v1)仍完整支援生產部署。

Pacemaker HA agent v2 採用服務型架構。 代理程式作為一個名為 mssql-pcsag的專用系統服務執行,負責處理 SQL Server 專屬的高可用性操作及與 Pacemaker 的通訊。

你透過標準系統的服務控制來管理服務 mssql-pcsag 。 啟動、停止、重新啟動,並依需要使用以下指令檢查此服務的狀態:

sudo systemctl start mssql-pcsag  # Start the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl stop mssql-pcsag  # Stop the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl restart mssql-pcsag  # Restart the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl status mssql-pcsag  # Check the status of the Pacemaker HA agent v2 (mssql-pcsag) service

Pacemaker 透過服務 mssql-pcsag 與 SQL Server 可用性群組互動。 為了確保可用性群組的監控和故障轉移功能運作正常:

  • 心臟起搏器群一定在運轉。
  • mssql-pcsag服務應該還在運作。

雖然 Pacemaker 和 mssql-pcsag 是獨立的元件,但在執行時會一起運作。 如果 Pacemaker 或 mssql-pcsag 服務中斷,可用性群組的故障轉移操作將無法如預期運作。

Note

重新啟動 mssql-pcsag 服務不會重新啟動 SQL Server。 同樣地,重新啟動 SQL Server 並不會自動重新啟動 Pacemaker HA 代理程式。 在排除故障時,請確認兩個服務都在執行。

Pacemaker HA 代理 v2 也支援彈性自動故障轉移原則,包括設定 故障條件層級健康檢查逾時時間

  • 範例:以下 Transact-SQL 陳述將現有可用性群組 AG1 的故障條件等級改為等級 2:

    ALTER AVAILABILITY GROUP AG1 SET (FAILURE_CONDITION_LEVEL = 2);
    
  • 範例:以下 Transact-SQL 陳述將名為 AG1 的現有可用性群組的健康檢查逾時閾值改為 60,000 毫秒(60 秒)。

    ALTER AVAILABILITY GROUP AG1 SET (HEALTH_CHECK_TIMEOUT = 60000);
    
  • 範例:套用設定後,使用以下 Transact-SQL 語句來驗證可用性群組的已設定故障狀態層級及健康檢查逾時。

    SELECT failure_condition_level,
           health_check_timeout
    FROM sys.availability_groups;
    
  1. 使用 Pacemaker HA agent v2 在 Pacemaker 中建立 AG 資源:ocf:mssql:agv2

    sudo pcs resource create <NameForAGResource> ocf:mssql:agv2 ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    如果從 Pacemaker HA 代理 v1 升級至 v2,請在建立 agv2 這個資源之前,移除現有的 AG 資源:

    sudo pcs resource delete <NameForAGResource>
    

    此操作會在資源重建期間暫時停止 AG 同步。 刪除並重建 Pacemaker AG 資源並不會刪除 AG。 資源重建後,Pacemaker 會自動恢復管理與 AG 同步。

  2. 建立與監聽器功能關聯的 AG 的 IP 位址資源。

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    在這個例子中, NameForIPResource 是 IP 資源的唯一名稱,而 IPAddress 是你指派給該資源的靜態 IP 位址。

  3. 為確保 IP 位址與 AG 資源運行於同一節點,請設定共置限制。

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    在此範例中, NameForIPResource 是 IP 資源的名稱,而 NameForAGResource 是 AG 資源的名稱。

  4. 建立排序限制式,以確保 AG 資源會在 IP 位址之前啟動並執行。 雖然共置限制蘊含一個排序約束,但此步驟強制執行了排序限制。

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    在此範例中, NameForIPResource 是 IP 資源的名稱,而 NameForAGResource 是 AG 資源的名稱。