設定 SQL Server 可用性群組的 Pacemaker 叢集

適用於:SQL Server - Linux

本文說明如何使用 Pacemaker 在 Linux 上建立三個節點的叢集,並將先前建立的可用性群組新增為叢集中的資源。 為了提供高可用性,Linux 上的可用性群組需要三個節點,請參閱可用性群組設定的高可用性和資料保護

注意

無偏差通訊

本發行項包含字詞「奴隸」的參考;Microsoft 將此內容中使用該字詞視為有冒犯性。 因為該字詞目前出現在軟體中,所以也會出現在本發行項中。 當軟體移除該字詞時,我們也會將其從發行項中移除。

SQL Server 並未與 Linux 上的 Pacemaker 緊密整合,因為它會使用 Windows Server 容錯移轉叢集 (WSFC)。 SQL Server 執行個體並不知道叢集,且所有協調流程都是來自外部。 Pacemaker 提供叢集資源協調流程。 此外,虛擬網路名稱是 Windows Server 容錯移轉叢集特有的;Pacemaker 中沒有對等項目。 查詢叢集資訊的可用性群組動態管理檢視 (DMV) 會在 Pacemaker 叢集上傳回空的資料列。 若要在容錯移轉之後建立適用於透明重新連線的接聽程式,請在 DNS 中以用來建立虛擬 IP 資源的 IP 手動註冊接聽程式名稱。

您仍可以建立接聽程式,在容錯移轉之後用來進行透明的重新連線,但必須在 DNS 伺服器中使用建立虛擬 IP 資源所用的 IP 來手動註冊接聽程式名稱 (如下列各節所述)。

下列各節將逐步解說設定 Pacemaker 叢集的步驟,並針對每一個支援的 Linux 發佈,將可用性群組新增為叢集中的資源以提供高可用性。

叢集層是以建置於 Pacemaker 之上的 Red Hat Enterprise Linux (RHEL) HA 附加元件為基礎。

注意

存取 Red Hat 完整文件需要有效的訂用帳戶。

如需叢集設定、資源代理程式選項和管理的詳細資訊,請造訪 RHEL 參考文件 \(英文\)。

藍圖

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

  1. 在叢集節點上設定 SQL Server

  2. 建立可用性群組

  3. 設定叢集資源管理員,例如 Pacemaker。 本文包含這些指示。

    設定叢集資源管理員的方式取決於特定 Linux 發行版本。

    重要

    實際執行環境需要隔離代理程式來取得高可用性。 此文件的示範不會使用隔離代理程式。 這些示範僅適用於測試和驗證。 Linux 叢集會使用隔離功能將叢集回復為已知的狀態。 設定隔離的方式取決於發行版本和環境。 目前,有些雲端環境無法使用隔離。 如需詳細資訊,請參閱 Support Policies for RHEL High Availability Clusters - Virtualization Platforms (RHEL 高可用性叢集的支援原則 - 虛擬化平台)。

  4. 將可用性群組新增為叢集中的資源

為 RHEL 設定高可用性

若要為 RHEL 設定高可用性,請啟用高可用性訂用帳戶,然後設定 Pacemaker。

為 RHEL 啟用高可用性訂用帳戶

叢集中的每個節點都必須有適用於 RHEL 的適當訂用帳戶及高可用性附加元件。 檢閱如何在 Red Hat Enterprise Linux 中安裝高可用性叢集套件 \(英文\) 的需求。 請遵循以下步驟來設定訂用帳戶和存放庫:

  1. 註冊系統。

    sudo subscription-manager register
    

    提供您的使用者名稱與密碼。

  2. 列出可用的集區以進行註冊。

    sudo subscription-manager list --available
    

    從可用集區的清單中,記下高可用性訂用帳戶的集區識別碼。

  3. 更新下列指令碼。 以上一個步驟中高可用性的集區識別碼取代 <pool id>。 執行指令碼以附加訂用帳戶。

    sudo subscription-manager attach --pool=<pool id>
    
  4. 啟用存放庫。

    RHEL 7

    sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
    

    RHEL 8

    sudo subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
    

如需詳細資訊,請參閱 Pacemake - 開放原始碼、高可用性叢集 \(英文\)。

當您設定訂用帳戶之後,需完成下列設定 Pacemaker 的步驟:

設定 Pacemaker

當您註冊訂用帳戶之後,需完成下列設定 Pacemaker 的步驟:

  1. 在所有叢集節點上,開啟 Pacemaker 防火牆連接埠。 若要使用 firewalld 開啟這些連接埠,請執行下列命令:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    如果防火牆沒有內建的高可用性設定,請開啟 Pacemaker 的下列連接埠。

    • TCP:連接埠 2224、3121、21064
    • UDP:連接埠 5405
  2. 在所有節點上安裝 Pacemaker 封裝。

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  3. 設定安裝 Pacemaker 和 Corosync 封裝時建立的預設使用者密碼。 在所有節點上使用相同的密碼。

    sudo passwd hacluster
    
  4. 若要讓節點在重新啟動後重新加入叢集,請啟用並啟動 pcsd 服務和 Pacemaker。 在所有節點上執行下列命令。

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  5. 建立叢集。 若要建立叢集,請執行下列命令︰

    RHEL 7

    sudo pcs cluster auth <node1> <node2> <node3> -u hacluster -p <password for hacluster>
    sudo pcs cluster setup --name <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    RHEL8

    針對 RHEL 8,您將需要分別驗證節點。 出現提示時,請手動輸入 HA 叢集的使用者名稱和密碼。

    sudo pcs host auth <node1> <node2> <node3>
    sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    注意

    如果您先前已在相同節點上設定叢集,執行 pcs cluster setup 時需要使用 --force 選項。 這個選項相當於執行 pcs cluster destroy。 若要重新啟用 Pacemaker,請執行 sudo systemctl enable pacemaker

  6. 安裝 SQL Server 的 SQL Server 資源代理程式。 在所有節點上執行下列命令。

    sudo yum install mssql-server-ha
    

設定 Pacemaker 之後,使用 pcs 來與叢集互動。 在叢集的一個節點上執行所有命令。

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

使用具有多個 NIC 的伺服器設定高可用性時,請遵循下列建議:

  • 確定 hosts 檔案已設定,讓多個 NIC 的伺服器 IP 位址可解析為每個節點上 Linux 伺服器的主機名稱。

  • 使用 Pacemaker 設定叢集時,使用伺服器的主機名稱應該會設定 Corosync,以進行所有 NIC 的設定。 我們只想要 Pacemaker/Corosync 通訊透過單一 NIC 進行。 設定 Pacemaker 叢集之後,請修改 corosync.conf 檔案中的組態,並更新您要用於 Pacemaker/Corosync 通訊的專用 NIC IP 位址。

  • corosync.conf 檔案中提供的 <hostname> 應與執行反向對應 (ping -a <ip_address>) 時提供的輸出相同,而且應該是主機上設定的簡短名稱。 確定 hosts 檔案也代表名稱解析的適當 IP 位址。

corosync.conf 檔案範例的變更在下方醒目提示:

  nodelist {
    node {
        ring0_addr: <ip_address_of_node1_NIC1>
        name: <hostname_of_node1>
        nodeid: 1
    }
    node {
        ring0_addr: <ip_address_of_node2_NIC1>
        name: <hostname_of_node2>
        nodeid: 2
    }
    node {
        ring0_addr: <ip_address_of_node3_NIC1>
        name: <hostname_of_node3>
        nodeid: 3
    }
  }

設定隔離裝置

Pacemaker 叢集廠商要求使用為受支援叢集設定的隔離裝置來隔離故障節點。 當叢集資源管理員無法判斷節點或節點上的資源狀態時,即會使用隔離來讓叢集再次進入已知狀態。

隔離裝置提供隔離代理程式。 在 Azure 的 Red Hat Enterprise Linux 中設定 Pacemaker 提供範例,說明如何在 Azure 中為此叢集建立隔離裝置。 修改環境的指示。

資源層級隔離可透過設定資源,確保在發生中斷時沒有資料損毀。 例如,您可以使用資源層級隔離,將節點上的磁碟標示為在通訊連結中斷時過期。

節點層級的隔離可確保節點不會執行任何資源。 這會透過重設節點來完成。 Pacemaker 支援各式各樣的隔離裝置。 範例包括適用於伺服器的不斷電供應系統或管理介面卡。

如需有關隔離故障節點的詳細資訊,請參閱下列文章:

注意

由於節點層級隔離設定主要取決於您的環境,因此,請在本教學課程中將其停用 (可於稍後設定)。 下列指令碼會停用節點層級隔離:

sudo pcs property set stonith-enabled=false

停用隔離僅基於測試目的。 如果您打算在實際執行環境中使用 Pacemaker,則應該根據您的環境規劃隔離實作,並讓它保持啟用狀態。

設定 cluster-recheck-interval 叢集屬性

cluster-recheck-interval 表示輪詢間隔,叢集會依此間隔檢查資源參數、限制式或其他叢集選項中的變更。 如果複本中斷,叢集會嘗試以 failure-timeout 值和 cluster-recheck-interval 值所繫結的間隔重新啟動複本。 例如,如果 failure-timeout 設為 60 秒,而 cluster-recheck-interval 設為 120 秒,則會以大於 60 秒但小於 120 秒的間隔嘗試重新啟動。 建議您將 failure-timeout 設為 60 秒,並將 cluster-recheck-interval 設為大於 60 秒的值。 不建議將 cluster-recheck-interval 設定為一個小的值。

若要將屬性值更新為 2 minutes,請執行:

sudo pcs property set cluster-recheck-interval=2min

如果您已經有受 Pacemaker 叢集管理的可用性群組資源,Pacemaker 套件 1.1.18-11.el7 會在 start-failure-is-fatal 叢集設定的值為 false 時,採用其行為變更。 此變更會影響容錯移轉工作流程。 如果主要複本發生中斷,則叢集應該要容錯移轉至其中一個可用的次要複本。 但是,使用者卻發現叢集繼續嘗試啟動失敗的主要複本。 如果該主要複本永遠無法上線 (因為永久中斷),則叢集永遠不會容錯移轉至其他可用的次要複本。 此變更會導致先前建議設定 start-failure-is-fatal 的組態不再有效,且必須將此設定還原回其預設值 true

此外,您必須更新 AG 資源以包含 failover-timeout 屬性。

若要將屬性值更新為 true,請執行:

sudo pcs property set start-failure-is-fatal=true

若要將 ag_cluster 資源屬性 failure-timeout 更新為 60s,請執行:

pcs resource update ag_cluster meta failure-timeout=60s

如需 Pacemaker 叢集屬性的相關資訊,請參閱 Pacemaker 叢集屬性 \(英文\)。

為 Pacemaker 建立 SQL Server 登入

  1. 在所有 SQL Server 執行個體上,建立 Pacemaker 的 SQL Server 登入。 下列 Transact-SQL 會建立登入:

    USE [master]
    GO
    CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!';
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
    

    建立可用性群組時,在其建立之後但在新增任何節點之前,Pacemaker 使用者需要可用性群組的 ALTER、CONTROL 和 VIEW DEFINITION 權限。

  2. 在所有 SQL Server 執行個體上,儲存 SQL Server 登入的認證

    echo 'pacemakerLogin' >> ~/pacemaker-passwd
    echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
    sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
    

建立可用性群組資源

若要建立可用性群組資源,請使用 pcs resource create 命令,並設定資源屬性。 下列命令會針對名稱為 ocf:mssql:ag 的可用性群組建立 ag1 主要/從屬類型資源。

RHEL 7

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s master notify=true

RHEL 8

RHEL 8 推出之後,CREATE 語法也隨之改變。 如果您使用 RHEL 8,術語 master 現在已變更為 promotable。 請使用下列 CREATE 命令,而非上述命令:

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s promotable notify=true

注意

當您建立資源時,Pacemaker 資源代理程式之後會定期根據可用性群組的設定,自動設定可用性群組上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 值。 例如,如果可用性群組有三個同步複本,代理程式會將 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT 設定為 1。 如需詳細資訊和其他設定選項,請參閱可用性群組設定的高可用性和資料保護

建立虛擬 IP 資源

若要建立虛擬 IP 位址資源,請在一個節點上執行下列命令。 使用網路中可用的靜態 IP 位址。 以有效的 IP 位址取代 <10.128.16.240> 之間的 IP 位址。

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<10.128.16.240>

Pacemaker 中沒有對等的虛擬伺服器名稱。 若要使用指向字串伺服器名稱而非 IP 位址的連接字串,請在 DNS 中註冊虛擬 IP 資源位址和所需的虛擬伺服器名稱。 針對 DR 設定,請在主要和 DR 網站上,向 DNS 伺服器註冊所需的虛擬伺服器名稱和 IP 位址。

新增共置限制式

在 Pacemaker 叢集中,幾乎每個決策都是藉由比較分數來完成,例如,選擇應執行資源的位置。 分數是針對每個資源計算得來的。 叢集資源管理員會選擇對特定資源具有最高分數的節點。 如果節點對於某資源的分數為負值,此資源就無法在該節點上執行。

在 Pacemaker 叢集上,您可以使用限制式來操控叢集的決策。 限制式具有分數。 如果限制式的分數低於 INFINITY,則 Pacemaker 會將其視為建議。 INFINITY 的分數是強制性的。

若要確保該主要複本和虛擬 IP 資源都在相同主機上執行,定義分數為 INFINITY 的共置限制式。 若要新增共置限制式,請在一個節點上執行下列命令。

RHEL 7

當您在 RHEL 7 中建立資源 ag_cluster 時,其會將資源建立為 ag_cluster-master。 針對 RHEL 7,請使用下列命令:

sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master

RHEL 8

當您在 RHEL 8 中建立資源 ag_cluster 時,其會將資源建立為 ag_cluster-clone。 針對 RHEL 8,請使用下列命令:

sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master

新增排序限制式

共置限制式具有隱含的排序限制式。 它會先移動虛擬 IP 資源,再移動可用性群組資源。 根據預設,事件的順序如下:

  1. 使用者會從 node1 到 node2 對可用性群組主要複本發出 pcs resource move

  2. 虛擬 IP 資源會在節點 1 上停止。

  3. 虛擬 IP 資源會在節點 2 上啟動。

    注意

    此時,IP 位址會暫時指向節點 2,而節點 2 仍是容錯移轉前的次要複本。

  4. 節點 1 上的可用性群組主要複本會降級為次要複本。

  5. 節點 2 上的可用性群組次要複本會升級為主要複本。

為了防止 IP 位址暫時指向含容錯移轉前之次要複本的節點,請新增排序限制式。

若要新增排序限制式,請在一個節點上執行下列命令:

RHEL 7

sudo pcs constraint order promote ag_cluster-master then start virtualip

RHEL 8

sudo pcs constraint order promote ag_cluster-clone then start virtualip

重要

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

使用 pcs 手動容錯移轉可用性群組。 請勿使用 Transact-SQL 來起始容錯移轉。 如需指示,請參閱容錯移轉