本文說明如何使用 Pacemaker 在 Linux 上建立三個節點的叢集,並將先前建立的可用性群組新增為叢集中的資源。 為了提供高可用性,Linux 上的可用性群組需要三個節點,請參閱可用性群組設定的高可用性和資料保護。
SQL Server 並未與 Linux 上的 Pacemaker 緊密整合,因為它會使用 Windows Server 容錯移轉叢集 (WSFC)。 SQL Server 執行個體並不知道叢集,且所有協調流程都是來自外部。 Pacemaker 提供叢集資源協調流程。 此外,虛擬網路名稱是 Windows Server 容錯移轉叢集特有的;Pacemaker 中沒有對等項目。 查詢叢集資訊的可用性群組動態管理檢視 (DMV) 會在 Pacemaker 叢集上傳回空的資料列。 若要在容錯移轉之後建立適用於透明重新連線的接聽程式,請在 DNS 中以用來建立虛擬 IP 資源的 IP 手動註冊接聽程式名稱。
叢集層是以建置於 Pacemaker 之上的 Red Hat Enterprise Linux (RHEL) HA 附加元件為基礎。
注意
存取 Red Hat 完整文件需要有效的訂用帳戶。
如需叢集設定、資源代理程式選項和管理的詳細資訊,請造訪 RHEL 參考文件 \(英文\)。
藍圖
在 Linux 伺服器上建立可用性群組以提供高可用性的步驟,與 Windows Server 容錯移轉叢集上的步驟不同。 下列清單描述高階步驟:
在叢集節點上設定 SQL Server。
建立可用性群組。
設定叢集資源管理員,例如 Pacemaker。 本文包含這些指示。
設定叢集資源管理員的方式取決於特定 Linux 發行版本。
將可用性群組新增為叢集中的資源。
若要為 RHEL 設定高可用性,請啟用高可用性訂用帳戶,然後設定 Pacemaker。
為 RHEL 啟用高可用性訂用帳戶
叢集中的每個節點都必須有適用於 RHEL 的適當訂用帳戶及高可用性附加元件。 檢閱如何在 Red Hat Enterprise Linux 中安裝高可用性叢集套件 \(英文\) 的需求。 請遵循以下步驟來設定訂用帳戶和存放庫:
註冊系統。
sudo subscription-manager register
提供您的使用者名稱與密碼。
列出可用的集區以進行註冊。
sudo subscription-manager list --available
從可用集區的清單中,記下高可用性訂用帳戶的集區識別碼。
更新下列指令碼。 以上一個步驟中高可用性的集區識別碼取代 <pool id>
。 執行指令碼以附加訂用帳戶。
sudo subscription-manager attach --pool=<pool id>
啟用存放庫。
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 防火牆連接埠。 若要使用 firewalld
開啟這些連接埠,請執行下列命令:
sudo firewall-cmd --permanent --add-service=high-availability
sudo firewall-cmd --reload
如果防火牆沒有內建的高可用性設定,請開啟 Pacemaker 的下列連接埠。
- TCP:連接埠 2224、3121、21064
- UDP:連接埠 5405
在所有節點上安裝 Pacemaker 封裝。
sudo yum install pacemaker pcs fence-agents-all resource-agents
設定安裝 Pacemaker 和 Corosync 封裝時建立的預設使用者密碼。 在所有節點上使用相同的密碼。
sudo passwd hacluster
若要讓節點在重新啟動後重新加入叢集,請啟用並啟動 pcsd
服務和 Pacemaker。 在所有節點上執行下列命令。
sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo systemctl enable pacemaker
建立叢集。 若要建立叢集,請執行下列命令︰
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
RHEL 8
針對 RHEL 8,您需要分別驗證節點。 在出現提示時,手動輸入 的使用者 hacluster
名稱和密碼。
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
。
安裝 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 資源以包含 failure-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 登入
警告
您的密碼應遵循 SQL Server 預設 密碼原則。 依預設,密碼長度必須至少有 8 個字元,並包含下列四種字元組合中其中三種組合的字元:大寫字母、小寫字母、以 10 為底數的數字以及符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。
在所有 SQL Server 執行個體上,建立 Pacemaker 的 SQL Server 登入。
下列 Transact-SQL 會建立登入。 將 <password>
取代為您自己的複雜密碼。
USE [master];
GO
CREATE LOGIN [pacemakerLogin]
WITH PASSWORD = N'<password>';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
建立可用性群組時,在其建立之後但在新增任何節點之前,Pacemaker 使用者需要可用性群組的 ALTER
、CONTROL
和 VIEW DEFINITION
權限。
在所有 SQL Server 執行個體上,儲存 SQL Server 登入的認證。
將 <password>
取代為您自己的複雜密碼。
echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo '<password>' >> ~/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 資源,再移動可用性群組資源。 根據預設,事件的順序如下:
使用者會從 node1 到 node2 對可用性群組主要複本發出 pcs resource move
。
虛擬 IP 資源會在節點 1 上停止。
虛擬 IP 資源會在節點 2 上啟動。
注意
此時,IP 位址會暫時指向節點 2,而節點 2 仍是容錯移轉前的次要複本。
節點 1 上的可用性群組主要複本會降級為次要複本。
節點 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 來起始容錯移轉。 如需指示,請參閱容錯移轉。
相關內容
叢集層會以建置於 Pacemaker \(英文\) 之上的 SUSE 高可用性擴充功能 (HAE) \(英文\) 為基礎。
如需叢集設定、資源代理程式選項、管理、最佳做法和建議的詳細資訊,請參閱 SUSE Linux Enterprise 高可用性延伸模組。
藍圖
建立可用性群組以取得高可用性的程序,在 Linux 伺服器和 Windows Server 容錯移轉叢集之間有所差異。 下列清單描述高階步驟:
在叢集節點上設定 SQL Server。
建立可用性群組。
設定叢集資源管理員,例如 Pacemaker。 本文包含這些指示。
設定叢集資源管理員的方式取決於特定 Linux 發行版本。
重要
實際執行環境需要隔離代理程式來取得高可用性。 此文章的範例不會使用隔離代理程式。 它們僅供測試和驗證使用。
Linux 叢集會使用隔離功能將叢集回復為已知的狀態。 設定隔離的方式取決於發行版本和環境。 目前,有些雲端環境無法使用隔離。 如需詳細資訊,請參閱 SUSE Linux Enterprise 高可用性延伸模組。
將可用性群組新增為叢集中的資源
必要條件
若要完成下列端對端案例,您需要三部電腦來部署三個節點的叢集。 下列步驟概述如何設定這些伺服器。
第一個步驟是在叢集節點上設定作業系統。 在此逐步解說中,針對 HA 附加元件搭配有效的訂用帳戶來使用 SLES 12 SP3。
在所有節點上,安裝和設定 SQL Server 服務。 如需詳細指示,請參閱 Linux 上的 SQL Server 安裝指引。
將一個節點指定為主要,並將其他節點指定為次要。 請在這整份指南中使用這些字詞。
確定即將成為叢集一部分的節點可以彼此通訊。
下列範例顯示 /etc/hosts
,以及適用於三個節點 (名稱為 SLES1、SLES2 和 SLES3) 的新增項目。
127.0.0.1 localhost
10.128.16.33 SLES1
10.128.16.77 SLES2
10.128.16.22 SLES3
所有叢集節點都必須能夠透過 SSH 互相存取。 hb_report
或 crm_report
之類的工具 (用於疑難排解) 和 Hawk 的 History Explorer 都要求節點之間的無密碼 SSH 存取,否則它們只能從目前的節點收集資料。 如果您使用非標準的 SSH 連接埠,請使用 -X 選項 (請參閱 man
頁面)。 例如,如果您的 SSH 連接埠是 3479,則以下列方式叫用 crm_report
:
sudo crm_report -X "-p 3479" [...]
如需詳細資訊,請參閱 SLES 管理指南 - 其他 \(英文\) 一節。
為 Pacemaker 建立 SQL Server 登入
警告
您的密碼應遵循 SQL Server 預設 密碼原則。 依預設,密碼長度必須至少有 8 個字元,並包含下列四種字元組合中其中三種組合的字元:大寫字母、小寫字母、以 10 為底數的數字以及符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。
在所有 SQL Server 執行個體上,建立 Pacemaker 的 SQL Server 登入。
下列 Transact-SQL 會建立登入。 將 <password>
取代為您自己的複雜密碼。
USE [master];
GO
CREATE LOGIN [pacemakerLogin]
WITH PASSWORD = N'<password>';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
建立可用性群組時,在其建立之後但在新增任何節點之前,Pacemaker 使用者需要可用性群組的 ALTER
、CONTROL
和 VIEW DEFINITION
權限。
在所有 SQL Server 執行個體上,儲存 SQL Server 登入的認證。
將 <password>
取代為您自己的複雜密碼。
echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo '<password>' >> ~/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
在 Linux 伺服器上,設定可用性群組,接著設定叢集資源。 若要設定可用性群組,請參閱設定 SQL Server Always On 可用性群組以確保 Linux 上的高可用性
安裝高可用性延伸模組
如需參考,請參閱安裝 SUSE Linux Enterprise Server 和高可用性延伸模組。
在這兩個節點上安裝 SQL Server 資源代理程式套件。
sudo zypper install mssql-server-ha
設定第一個節點
請參閱 SLES 安裝指示。
以 root
身分登入您想要用來做為叢集節點的實體或虛擬機器。
執行下列程式碼來啟動啟動程序指令碼:
sudo ha-cluster-init
如果 NTP 尚未設定為在開機時啟動,則會出現一則訊息。
如果您決定無論如何都要繼續,指令碼就會自動產生金鑰來進行 SSH 存取以及用於 Csync2 同步處理工具,並啟動這兩者所需的服務。
設定叢集通訊層 (Corosync):
輸入要繫結的網路位址。 根據預設,指令碼會建議使用 eth0 的網路位址。 或者,輸入不同的網路位址,例如 bond0 的位址。
輸入多點傳送位址。 指令碼會建議一個隨機位址,讓您可用來作為預設值。
輸入多點傳送連接埠。 指令碼會建議 5405 作為預設值。
若要設定 SBD ()
,請輸入您想要針對 SBD 使用的區塊裝置分割區的持續路徑。 路徑在叢集中的所有節點之間必須一致。
最後,指令碼將啟動 Pacemaker 服務,讓單一節點的叢集上線,並啟用 Web 管理介面 Hawk2。 用於 Hawk2 的 URL 會顯示於畫面上。
如需安裝程序的任何詳細資料,請查看 /var/log/sleha-bootstrap.log
。 您現在有一個執行中的單一節點叢集。 使用 crm status 來檢查叢集狀態:
sudo crm status
您也可以使用 crm configure show xml
或 crm configure show
來查看叢集設定。
啟動程式程式會使用密碼 linux
建立名為 hacluster
的Linux使用者。 儘快以安全的密碼取代預設密碼:
sudo passwd hacluster
將節點新增至現有叢集
如果您的叢集會搭配一或多個節點來執行,請使用 ha-cluster-join 啟動程序指令碼來新增更多叢集節點。 指令碼只需存取現有的叢集節點,並且將在目前的電腦上自動完成基本設定。 使用下列步驟:
如果您已經使用 YaST
叢集模組來設定現有的叢集節點,請先確定會完成下列先決條件,然後再執行 ha-cluster-join
:
以 root
身分登入應加入叢集的實體或虛擬機器。
執行下列程式碼來啟動啟動程序指令碼:
sudo ha-cluster-join
如果 NTP 尚未設定為在開機時啟動,則會出現一則訊息。
如果您決定無論如何都要繼續,系統將提示您輸入現有節點的 IP 位址。 輸入 IP 位址。
如果您尚未在這兩部機器之間設定無密碼 SSH 存取,則系統也將提示您輸入現有節點的根密碼。
登入指定的節點之後,指令碼會複製 Corosync 設定、設定 SSH 和 Csync2
,並將目前的電腦上線以成為新的叢集節點。 除此之外,它也會啟動 Hawk 所需的服務。 如果您已使用 OCFS2
設定共用儲存體,它也會自動建立適用於 OCFS2
檔案系統的掛接點目錄。
針對您要新增至叢集的所有機器重複上述步驟。
如需此程序的詳細資訊,請檢查 /var/log/ha-cluster-bootstrap.log
。
使用 sudo crm status
來檢查叢集狀態。 如果您已成功新增第二個節點,則輸出將如下所示:
sudo crm status
您會看到類似於下列範例的輸出。
3 nodes configured
1 resource configured
Online: [ SLES1 SLES2 SLES3]
Full list of resources:
admin_addr (ocf::heartbeat:IPaddr2): Started node1
注意
admin_addr
是虛擬 IP 叢集資源,它是在初始單節點叢集設定期間所設定的。
新增所有節點之後,檢查您是否需要調整全域叢集選項中的 no-quorum-policy。 這對於雙節點的叢集而言特別重要。
設定 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
,請執行:
crm configure property cluster-recheck-interval=2min
如果您已經有受 Pacemaker 叢集管理的可用性群組資源,Pacemaker 套件 1.1.18-11.el7 會在 start-failure-is-fatal
叢集設定的值為 false
時,採用其行為變更。 此變更會影響容錯移轉工作流程。 如果主要複本發生中斷,則叢集應該要容錯移轉至其中一個可用的次要複本。 但是,使用者卻發現叢集繼續嘗試啟動失敗的主要複本。 如果該主要複本永遠無法上線 (因為永久中斷),則叢集永遠不會容錯移轉至其他可用的次要複本。 此變更會導致先前建議設定 start-failure-is-fatal
的組態不再有效,且必須將此設定還原回其預設值 true
。
此外,您必須更新 AG 資源以包含 failure-timeout
屬性。
若要將屬性值更新為 true
,請執行:
crm configure property start-failure-is-fatal=true
將您現有的 AG 資源屬性 failure-timeout
更新為 60s
執行 (將 ag1
取代為您的可用性群組資源名稱):
crm configure edit ag1
在文字編輯器中,於任何 param
之後及任何 op
之前新增 meta failure-timeout=60s
。
如需 Pacemaker 叢集屬性的詳細資訊,請參閱設定叢集資源 \(英文\)。
多個網路介面 (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 叢集廠商要求使用為受支援叢集設定的隔離裝置來隔離故障節點。 當叢集資源管理員無法判斷節點或節點上的資源狀態時,即會使用隔離來讓叢集再次進入已知狀態。
資源層級隔離主要可透過設定資源,確保在發生中斷時不會有資料損毀。 舉例來說,您可以搭配使用資源層級隔離與 DRBD (分散式複寫區塊裝置),將節點上的磁碟標示為在通訊連結中斷時過期。
節點層級的隔離可確保節點不會執行任何資源。 此目的透過重設節點來達成,而 Pacemaker 實作稱為 STONITH。 Pacemaker 支援各種隔離裝置,例如不斷電系統或伺服器的管理介面卡。
如需詳細資訊,請參閱
在叢集初始化期間,如果未偵測到任何組態,即會停用隔離。 您稍後可執行下列命令來啟用它:
sudo crm configure property stonith-enabled=true
重要
停用隔離僅基於測試目的。 如果您打算在實際執行環境中使用 Pacemaker,則應該根據您的環境規劃隔離實作,並讓它保持啟用狀態。 SUSE 並未針對任何雲端環境 (包括 Azure) 或 Hyper-V 提供隔離代理程式。 因此,叢集廠商不支援在這些環境中執行生產叢集。 我們正在為此差距尋找解決方案,以便在未來的版本中提供。
請參閱 SLES 管理指南。
啟用 Pacemaker
啟用 Pacemaker,讓它能夠自動啟動。
在叢集中的每個節點上執行下列命令。
systemctl enable pacemaker
建立可用性群組資源
下列命令會為可用性群組 [ag1] 的三個複本建立和設定可用性群組資源。 您必須在 SLES 中明確指定監視作業和逾時,這是因為逾時與工作負載高度相關,而且需要針對每個部署仔細調整。
在叢集的其中一個節點上執行命令:
執行 crm configure
以開啟 crm 提示字元:
sudo crm configure
在 crm 提示字元中,執行下列命令來設定資源屬性。
primitive ag_cluster \
ocf:mssql:ag \
params ag_name="ag1" \
meta failure-timeout=60s \
op start timeout=60s \
op stop timeout=60s \
op promote timeout=60s \
op demote timeout=10s \
op monitor timeout=60s interval=10s \
op monitor timeout=60s interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s
ms ms-ag_cluster ag_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true" \
commit
注意
當您建立資源時,Pacemaker 資源代理程式之後會定期根據可用性群組的設定,自動設定可用性群組上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
值。 例如,如果可用性群組有三個同步複本,代理程式會將 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
設定為 1
。 如需詳細資訊和其他設定選項,請參閱可用性群組設定的高可用性和資料保護。
建立虛擬 IP 資源
如果您未在執行 ha-cluster-init
時建立虛擬 IP 資源,可立即建立此資源。 下列命令會建立虛擬 IP 資源。 以您網路中可用的位址取代 <0.0.0.0>
,並以 CIDR 子網路遮罩中的位元數取代 <24>
。 在一個節點上執行。
crm configure \
primitive admin_addr \
ocf:heartbeat:IPaddr2 \
params ip=<0.0.0.0> \
cidr_netmask=<24>
新增共置限制式
在 Pacemaker 叢集中,幾乎每個決策都是藉由比較分數來完成,例如,選擇應執行資源的位置。 分數是針對每個資源計算得來的,而叢集資源管理員會選擇對特定資源具有最高分數的節點 (如果節點對於某資源的分數為負值,此資源就無法在該節點上執行)。我們可以使用限制式來操控叢集的決策。 限制式具有分數。 如果限制式的分數低於 INFINITY,則僅為建議。 INFINITY 分數表示它是必要項目。 我們想要確保可用性群組的主要複本和虛擬 IP 資源都會在相同主機上執行,因此,會使用 INFINITY 分數來定義共置限制式。
若要將虛擬 IP 的共置限制式設定為在與主要節點相同的節點上執行,請在一個節點上執行下列命令:
crm configure
colocation vip_on_master inf: \
admin_addr ms-ag_cluster:Master
commit
新增排序限制式
共置限制式具有隱含的排序限制式。 它會先移動虛擬 IP 資源,再移動可用性群組資源。 根據預設,事件的順序如下:
- 使用者會從 node1 到 node2 對可用性群組主要複本發出
resource migrate
。
- 虛擬 IP 資源會在節點 1 上停止。
- 虛擬 IP 資源會在節點 2 上啟動。 此時,IP 位址會暫時指向節點 2,而節點 2 仍是容錯移轉前的次要複本。
- 節點 1 上的可用性群組主要複本已降級。
- 節點 2 上的可用性群組已升級為主要複本。
為了防止 IP 位址暫時指向含容錯移轉前之次要複本的節點,請新增排序限制式。
若要新增排序限制式,請在一個節點上執行下列命令:
sudo crm configure \
order ag_first inf: ms-ag_cluster:promote admin_addr:start
重要
當您設定叢集並將可用性群組新增為叢集資源之後,就無法使用 Transact-SQL 來容錯移轉可用性群組資源。 Linux 上的 SQL Server 叢集資源與作業系統的整合程度,不如 Windows Server 容錯移轉叢集 (WSFC) 上的緊密。 SQL Server 服務不知道叢集是否存在。 所有協調流程都會透過叢集管理工具來完成。 在 SLES 中,請使用 crm
。
使用 crm
手動容錯移轉可用性群組。 請勿使用 Transact-SQL 來起始容錯移轉。 如需詳細資訊,請參閱容錯移轉。
如需詳細資訊,請參閱
相關內容
藍圖
在 Linux 伺服器上建立可用性群組以提供高可用性的步驟,與 Windows Server 容錯移轉叢集上的步驟不同。 下列清單描述高階步驟:
Linux 上的 SQL Server 安裝指引。
設定 SQL Server Always On 可用性群組以確保 Linux 上的高可用性。
設定叢集資源管理員,例如 Pacemaker。 本文包含這些指示。
設定叢集資源管理員的方式取決於特定 Linux 發行版本。
重要
實際執行環境需要隔離代理程式來取得高可用性。 此文章的範例不會使用隔離代理程式。 它們僅供測試和驗證使用。
Linux 叢集會使用隔離功能將叢集回復為已知的狀態。 設定隔離的方式取決於發行版本和環境。 目前,有些雲端環境無法使用隔離。
隔離通常是在作業系統上實作且相依於環境。 在作業系統散發者文件中尋找隔離的指示。
將可用性群組新增為叢集中的資源。
在所有節點上,開啟防火牆連接埠。 開啟 Pacemaker 高可用性服務、SQL Server 執行個體和可用性群組端點的連接埠。 執行 SQL Server 的伺服器預設 TCP 通訊埠為 1433
。
sudo ufw allow 2224/tcp
sudo ufw allow 3121/tcp
sudo ufw allow 21064/tcp
sudo ufw allow 5405/udp
sudo ufw allow 1433/tcp # Replace with TDS endpoint
sudo ufw allow 5022/tcp # Replace with DATA_MIRRORING endpoint
sudo ufw reload
或者,您可以停用防火牆,但在生產環境中並不建議這麼做:
sudo ufw disable
安裝 Pacemaker 套件。 在所有節點上,針對 Ubuntu 20.04 執行下列命令。 如需在舊版上安裝的詳細資訊,請參閱 Ubuntu HA - Azure 上的 MS SQL Server。
sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents corosync python3-azure
設定安裝 Pacemaker 和 Corosync 封裝時建立的預設使用者密碼。 在所有節點上使用相同的密碼。
sudo passwd hacluster
建立叢集
在建立叢集之前,您必須在主要伺服器上建立驗證金鑰,並將其複製到參與 AG 的其他伺服器。
使用下列指令碼在主要伺服器上建立驗證金鑰:
sudo corosync-keygen
您可以使用 scp
,將產生的金鑰複製到其他伺服器:
sudo scp /etc/corosync/authkey dbadmin@server-02:/etc/corosync
sudo scp /etc/corosync/authkey dbadmin@server-03:/etc/corosync
若要建立叢集,請在主要伺服器上編輯 /etc/corosync/corosync.conf
檔案:
sudo vim /etc/corosync/corosync.conf
corosync.conf
檔案看起來應該類似於下列範例:
totem {
version: 2
cluster_name: agclustername
transport: udpu
crypto_cipher: none
crypto_hash: none
}
logging {
fileline: off
to_stderr: yes
to_logfile: yes
logfile: /var/log/corosync/corosync.log
to_syslog: yes
debug: off
logger_subsys {
subsys: QUORUM
debug: off
}
}
quorum {
provider: corosync_votequorum
}
nodelist {
node {
name: server-01
nodeid: 1
ring0_addr: 10.0.0.4
}
node {
name: server-02
nodeid: 2
ring0_addr: 10.0.0.5
}
node {
name: server-03
nodeid: 3
ring0_addr: 10.0.0.6
}
}
取代其他節點上的 corosync.conf
檔案:
sudo scp /etc/corosync/corosync.conf dbadmin@server-02:/etc/corosync
sudo scp /etc/corosync/corosync.conf dbadmin@server-03:/etc/corosync
重新啟動 pacemaker
和 corosync
服務:
sudo systemctl restart pacemaker corosync
確認叢集的狀態並確認組態:
sudo crm status
多個網路介面 (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 叢集廠商要求使用為受支援叢集設定的隔離裝置來隔離故障節點。 當叢集資源管理員無法判斷節點或節點上的資源狀態時,即會使用隔離來讓叢集再次進入已知狀態。
資源層級的隔離可確保遇到中斷時,不會發生資料損毀。 舉例來說,您可以搭配使用資源層級隔離與 DRBD (分散式複寫區塊裝置),將節點上的磁碟標示為在通訊連結中斷時過期。
節點層級的隔離可確保節點不會執行任何資源。 此目的透過重設節點來達成,而 Pacemaker 實作稱為 STONITH。 Pacemaker 支援各種隔離裝置,例如不斷電供應系統或伺服器的管理介面卡。
如需詳細資訊,請參閱從頭開始使用 Pacemaker 叢集和隔離與 Stonith
由於節點層級隔離設定主要取決於您的環境,所以我們會在本教學課程中將其停用 (可在稍後設定)。 在主要節點上執行下列指令碼:
sudo crm configure property 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 crm configure property cluster-recheck-interval=2min
如果您已經有受 Pacemaker 叢集管理的可用性群組資源,Pacemaker 套件 1.1.18-11.el7 會在 start-failure-is-fatal
叢集設定的值為 false
時,採用其行為變更。 此變更會影響容錯移轉工作流程。 如果主要複本發生中斷,則叢集應該要容錯移轉至其中一個可用的次要複本。 但是,使用者卻發現叢集繼續嘗試啟動失敗的主要複本。 如果該主要複本永遠無法上線 (因為永久中斷),則叢集永遠不會容錯移轉至其他可用的次要複本。 此變更會導致先前建議設定 start-failure-is-fatal
的組態不再有效,且必須將此設定還原回其預設值 true
。
此外,您必須更新 AG 資源以包含 failure-timeout
屬性。
若要將屬性值更新為 true
,請執行:
sudo crm configure property start-failure-is-fatal=true
將您現有的 AG 資源屬性 failure-timeout
更新為 60s
執行 (將 ag1
取代為您的可用性群組資源名稱):
sudo crm configure meta failure-timeout=60s
安裝 SQL Server 資源代理程式以與 Pacemaker 整合
在所有節點上執行下列命令。
sudo apt-get install mssql-server-ha
為 Pacemaker 建立 SQL Server 登入
警告
您的密碼應遵循 SQL Server 預設 密碼原則。 依預設,密碼長度必須至少有 8 個字元,並包含下列四種字元組合中其中三種組合的字元:大寫字母、小寫字母、以 10 為底數的數字以及符號。 密碼長度最多可達 128 個字元。 盡可能使用長且複雜的密碼。
在所有 SQL Server 執行個體上,建立 Pacemaker 的 SQL Server 登入。
下列 Transact-SQL 會建立登入。 將 <password>
取代為您自己的複雜密碼。
USE [master];
GO
CREATE LOGIN [pacemakerLogin]
WITH PASSWORD = N'<password>';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
建立可用性群組時,在其建立之後但在新增任何節點之前,Pacemaker 使用者需要可用性群組的 ALTER
、CONTROL
和 VIEW DEFINITION
權限。
在所有 SQL Server 執行個體上,儲存 SQL Server 登入的認證。
將 <password>
取代為您自己的複雜密碼。
echo 'pacemakerLogin' >> ~/pacemaker-passwd
echo '<password>' >> ~/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
建立可用性群組資源
若要建立可用性群組資源,請使用 sudo crm configure
命令來設定資源屬性。 下列範例會針對名為 ag1
的可用性群組建立主要/複本類型資源 ocf:mssql:ag
。
~$ sudo crm
configure
primitive ag1_cluster \
ocf:mssql:ag \
params ag_name="ag1" \
meta failure-timeout=60s \
op start timeout=60s \
op stop timeout=60s \
op promote timeout=60s \
op demote timeout=10s \
op monitor timeout=60s interval=10s \
op monitor timeout=60s on-fail=demote interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s
ms ms-ag1 ag1_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true"
commit
注意
當您建立資源時,Pacemaker 資源代理程式之後會定期根據可用性群組的設定,自動設定可用性群組上的 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
值。 例如,如果可用性群組有三個同步複本,代理程式會將 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT
設定為 1
。 如需詳細資訊和其他設定選項,請參閱可用性群組設定的高可用性和資料保護。
建立虛擬 IP 資源
若要建立虛擬 IP 位址資源,請在一個節點上執行下列命令。 使用網路中可用的靜態 IP 位址。 執行指令碼之前,請以有效 IP 位址取代 < ... >
之間的值。
sudo crm configure primitive virtualip \
ocf:heartbeat:IPaddr2 \
params ip=10.128.16.240
Pacemaker 中沒有對等的虛擬伺服器名稱。 若要使用指向字串伺服器名稱的連接字串,而不使用 IP 位址,請在 DNS 中註冊 IP 資源位址和所需的虛擬伺服器名稱。 針對 DR 設定,請在主要和 DR 網站上,向 DNS 伺服器註冊所需的虛擬伺服器名稱和 IP 位址。
新增共置限制式
在 Pacemaker 叢集中,幾乎每個決策都是藉由比較分數來完成,例如,選擇應執行資源的位置。 分數是針對每個資源計算得來的,而叢集資源管理員會選擇對特定資源具有最高分數的節點 (如果節點對於某資源的分數為負值,此資源就無法在該節點上執行。)
使用限制式來設定叢集的決策。 限制式具有分數。 如果限制式的分數低於 INFINITY,則僅為建議。 分數為 INFINITY 表示必要。
若要確保該主要複本和虛擬 IP 資源都位於相同主機,請使用 INFINITY 分數定義共置限制式。 若要新增共置限制式,請在一個節點上執行下列命令。
sudo crm configure colocation ag-with-listener INFINITY: virtualip-group ms-ag1:Master
新增排序限制式
共置限制式具有隱含的排序限制式。 它會先移動虛擬 IP 資源,再移動可用性群組資源。 根據預設,事件的順序如下:
使用者會從 node1
到 node2
,對可用性群組主要複本發出 pcs resource move
。
虛擬 IP 資源會在 node1
停止。
虛擬 IP 資源會在 node2
啟動。
此時,IP 位址會暫時指向 node2
,而 node2
仍是容錯移轉前的次要複本。
node1
上的可用性群組主要複本會降階為次要複本。
node2
上的可用性群組次要複本會升階為主要複本。
為了防止 IP 位址暫時指向含容錯移轉前之次要複本的節點,請新增排序限制式。
若要新增排序限制式,請在一個節點上執行下列命令:
sudo crm configure order ag-before-listener Mandatory: ms-ag1:promote virtualip-group:start
當您設定叢集並將可用性群組新增為叢集資源之後,就無法使用 Transact-SQL 來容錯移轉可用性群組資源。 Linux 上的 SQL Server 叢集資源與作業系統的整合程度,不如 Windows Server 容錯移轉叢集 (WSFC) 上的緊密。 SQL Server 服務不知道叢集是否存在。 所有協調流程都會透過叢集管理工具來完成。
相關內容