11 儲存保護和 SBD #
SBD (STONITH 區塊裝置) 透過經由共用塊儲存 (SAN、iSCSI、FCoE 等) 交換訊息來為基於 Pacemaker 的叢集提供節點圍籬區隔機制。此方法可將圍籬區隔機制隔離開,使其不受韌體版本變更的影響,或不依賴於特定韌體控制器。SBD 需要在每個節點上安裝一個監視程式,以確定能真正停止行為異常的節點。在某些情況下,還可以透過無磁碟模式執行 SBD,以便使用不含共用儲存的 SBD。
每則訊息前的 ha-cluster-bootstrap 程序檔提供了一種自動設定叢集的方式,並可選擇使用 SBD 做為圍籬區隔機制。如需詳細資料,請參閱安裝與設定快速入門。但是,手動設定 SBD 可為您提供個別設定的更多選項。
本章介紹 SBD 背後的概念。它將引導您完成 SBD 所需元件的設定,以保護您的叢集避免在發生電腦分裂的情況下出現潛在資料毀損。
除了節點層級圍籬區隔外,您還可以使用額外的儲存保護機制,例如 LVM2 獨佔啟用或 OCFS2 檔案鎖定支援 (資源層級圍籬區隔)。它們可以保護您的系統,避免出現管理或應用程式故障。
11.1 概念綜覽 #
SBD 是 Storage-Based Death (基於儲存的終止) 或 STONITH Block Device (STONITH 區塊裝置) 的縮寫。
高可用性叢集堆疊的最高優先程度是保護資料完整性。此項保護透過防止對資料儲存進行未協調的並行存取來實現。叢集堆疊會使用幾種控制機制來實現此目標。
但是,如果叢集中選出數個 DC,則可能導致網路分割或軟體故障。如果系統允許出現這種所謂的電腦分裂情況,就可能會產生資料毀損。
避免出現這種情況可採取的主要機制是透過 STONITH 實現節點圍籬區隔。如果使用 SBD 做為節點圍籬區隔機制可在電腦分裂情況下關閉節點而無需使用外部關閉裝置。
- SBD 分割區
如果一個環境中的所有節點都可以存取共用儲存,系統會格式化裝置的一小塊分割區用於 SBD。該分割區的大小取決於所用磁碟的區塊大小 (例如,對於區塊大小為 512 位元組的標準 SCSI 磁碟,該分割區大小為 1 MB;區塊大小為 4 KB 的 DASD 磁碟需要 4 MB 大小的分割區)。啟始化程序會在裝置上建立訊息配置,設定最多 255 個節點的訊息插槽。
- SBD 精靈
設定完各自的 SBD 精靈後,在每個節點上使其上線,然後再啟動其餘叢集堆疊。當其他所有叢集元件都關閉後,SBD 才會終止,這樣便確保了只要叢集資源啟動,SBD 就會加以監督。
- 訊息
精靈會自動在分割區上為自己配置一個訊息槽,然後持續監控,查看是否有傳送給它的訊息。一旦收到訊息,精靈會立即回應請求,例如為圍籬區隔啟動關機或重新開機操作。
另外,此精靈會持續監控與儲存裝置的連線,如果無法連接分割區則會自行終止。這樣可保證精靈不會錯過圍籬區隔訊息。如果叢集資料位於其他分割區的同一個邏輯單位,則一旦與儲存失去連線,工作負載便將終止,因此不會增加故障點。
- 監視程式
只要使用 SBD,就必須確保監視程式正常運作。最新的系統支援硬體監視程式,該程式需要由某個軟體元件來「激發」或「餽送」。軟體元件 (在本例中為 SBD 精靈) 透過將服務脈衝定期寫入監視程式來「饋送」監視程式。如果精靈停止饋送監視程式,硬體將強制重新啟動系統。這樣可以保障 SBD 程序自身不出現故障,例如沒有回應或陷入 I/O 錯誤。
如果已啟動 Pacemaker 整合,則在大部分裝置的連接已中斷的情況下,SBD 將不會自我圍籬區隔。例如,假定您的叢集包含三個節點:A、B 和 C。由於網路分隔,A 只能看到它自己,而 B 和 C 之間仍可通訊。在本例中,有兩個叢集分割區,一個由於節點占多數 (B 和 C) 而達到最低節點數,而另一個 (A) 則未達到。如果在大部分圍籬區隔裝置無法連接時發生這種情況,節點 A 將立即自我關閉,但是節點 B 和 C 將繼續執行。
11.2 手動設定 SBD 的綜覽 #
手動設定基於儲存的保護時必須執行下列步驟:必須以 root
身分執行這些步驟。開始執行之前,請查看第 11.3 節 「要求」。
根據您的情況,可將 SBD 與一到三部裝置搭配使用,或以無磁碟模式使用。如需綜覽,請參閱第 11.4 節 「SBD 裝置數量」。如需詳細的設定,請參閱:
11.3 要求 #
最多可將三部 SBD 裝置用於基於儲存的圍籬區隔。使用一到三部裝置時,必須可從所有節點存取共用儲存。
針對叢集中的所有節點,共用儲存裝置的路徑必須永久且一致。請使用穩定的裝置名稱,例如
/dev/disk/by-id/dm-uuid-part1-mpath-abcedf12345
。可透過光纖通道 (FC)、乙太網路光纖通道 (FCoE) 甚至 iSCSI 來連接共用儲存。
共用儲存節段不得使用基於主機的 RAID、LVM2 或 DRBD*。DRBD 可能已分割,這會對 SBD 造成問題,因為 SBD 中不能存在兩種狀態。不能將叢集多裝置 (叢集 MD) 用於 SBD。
但是,建議使用基於儲存的 RAID 和多重路徑來提升可靠性。
可以在不同叢集之間共用某個 SBD 裝置,前提是共用該裝置的節點數不超過 255 個。
對於具有兩個以上節點的叢集,還可以在無磁碟模式下使用 SBD。
11.4 SBD 裝置數量 #
SBD 支援最多使用三部裝置:
- 一部裝置
最簡單的實作。這種組態適合所有資料均位於同一共用儲存上的叢集。
- 兩部裝置
這種組態主要適用於這樣的環境:使用基於主機的鏡像複製,但是沒有第三個儲存裝置可用。如果 SBD 失去對一個鏡像複製方的存取能力,它不會立即終止,以便允許叢集繼續執行。不過,由於 SBD 掌握的情況不夠全面,它無法偵測儲存的不對稱分裂,所以當只有一個鏡像複製方可用時,它不會圍籬區隔另一方。因此,在其中一個儲存陣列已關閉的情況下,它無法自動容許再一次的故障。
- 三部裝置
最可靠的組態。它具有從一部裝置中斷 (可能是由於失敗或維護) 的情況中復原的能力。只會在有一部以上裝置失去連接以及必要時,SBD 才會自行終止,具體取決於叢集分割區或節點的狀態。如果至少有兩部裝置仍然可存取,便能成功傳輸圍籬區隔訊息。
這種組態適合儲存不限制為單個陣列的較複雜情況。基於主機的鏡像複製解決方案可以在每個鏡像複製方設定一個 SBD (不鏡像複製自身),在 iSCSI 上另外設定一個連接中斷器。
- 無磁碟
如果您想要建立一個不含共用儲存的圍籬區隔機制,則此組態十分有用。在此無磁碟模式下,SBD 會使用硬體監視程式來圍籬區隔節點,而不依賴於任何共用裝置。不過,無磁碟 SBD 不能處理雙節點叢集的電腦分裂情況。此選項僅適用於具有兩個以上節點的叢集。
11.5 逾時計算 #
使用 SBD 做為圍籬區隔機制時,必須考慮所有元件的逾時,因為它們之間相互依賴。
- 監視程式逾時
此逾時在啟始化 SBD 裝置期間設定。它主要取決於您的儲存延遲。必須能夠在此段時間內成功讀取大多數裝置。否則,節點可能會自我圍籬區隔。
注意:多重路徑或 iSCSI 設定如果 SBD 裝置位於多路徑設定或 iSCSI 上,則應將逾時設定為偵測到路徑故障並切換到下一個路徑所需的時間。
這還意味著在
/etc/multipath.conf
中,max_polling_interval
的值必須小於watchdog
逾時。msgwait
逾時此逾時在啟始化 SBD 裝置期間設定。它定義了將訊息寫入 SBD 裝置上的某個節點插槽後經過多長時間會視為已傳遞。該逾時應設定得足夠長,讓節點有時間偵測到其是否需要自我圍籬區隔。
但是,如果
msgwait
逾時相對較長,已圍籬區隔的叢集節點可能會在圍籬區隔動作傳回之前便又重新加入。可以依程序 11.4 中的步驟 4 所述,在 SBD 組態中設定SBD_DELAY_START
參數來減少此情況。- CIB 中的
stonith-timeout
此逾時在 CIB 中做為全域叢集內容設定。它定義了等待 STONITH 動作 (重新開機、開啟、關閉) 完成的時間。
- CIB 中的
stonith-watchdog-timeout
此逾時在 CIB 中做為全域叢集內容設定。如果未明確設定,則預設值為
0
,此值適用於 SBD 與一到三部裝置搭配使用的情況。若要以無磁碟模式使用 SBD,請參閱程序 11.8 「設定無磁碟 SBD」以取得詳細資料。
如果您變更監視程式逾時,則需要同時調整另外兩個逾時。以下「公式」大致表達了這三個值之間的關係:
Timeout (msgwait) >= (Timeout (watchdog) * 2) stonith-timeout = Timeout (msgwait) + 20%
例如,如果您將監視程式逾時設定為 120
,則請將 msgwait
逾時設定為 240
,並將 stonith-timeout
設定為 288
。
如果您使用 ha-cluster-bootstrap 程序檔設定叢集並啟始化 SBD 裝置,則會自動考慮這些逾時之間的關係。
11.6 設定監視程式 #
SUSE Linux Enterprise High Availability Extension 隨附了幾個核心模組用於提供硬體特定的監視程式驅動程式。如需最常用監視程式驅動程式清單,請參閱常用監視程式驅動程式。
對於生產環境中的叢集,建議使用硬體特定的監視程式驅動程式。不過,如果沒有與您的硬體相符的監視程式,則可以將 softdog
當成核心監視程式模組使用。
High Availability Extension 使用 SBD 精靈做為「饋送」監視程式的軟體元件。
11.6.1 使用硬體監視程式 #
找出指定系統的正確監視程式核心模組並非沒有意義。自動查探常常會失敗。因此,在載入正確的模組之前,許多模組即已載入。
表格 11.1 列出了最常用的監視程式驅動程式。如果此處未列出您的硬體,/lib/modules/KERNEL_VERSION/kernel/drivers/watchdog
或 /lib/modules/KERNEL_VERSION/kernel/drivers/ipmi
目錄中也會列出可供選取的項目。或者,請洽詢您的硬體或系統廠商,獲取有關系統特定的監視程式組態設定的詳細資料。
硬體 | 驅動程式 |
---|---|
HP | hpwdt |
Dell、Lenovo (Intel TCO) | iTCO_wdt |
Fujitsu | ipmi_watchdog |
IBM 大型主機上的 VM 或 z/VM | vmwatchdog |
Xen VM (DomU) | xen_xdt |
Generic | softdog |
有些硬體廠商交付的系統管理軟體 (例如 HP ASR 精靈) 會使用監視程式來進行系統重設。如果 SBD 使用了監視程式,請停用此類軟體。此時不能有任何其他軟體存取監視程式計時器。
若要確定載入正確的監視程式模組,請執行如下操作:
列出已隨核心版本安裝的驅動程式:
root #
rpm
-ql kernel-VERSION |grep
watchdog列出核心中目前載入的任何監視程式模組:
root #
lsmod
|egrep
"(wd|dog)"如果傳回了結果,請卸載錯誤的模組:
root #
rmmod
WRONG_MODULE啟用與您的硬體相符的監視程式模組:
root #
echo
WATCHDOG_MODULE > /etc/modules-load.d/watchdog.confroot #
systemctl
restart systemd-modules-load測試是否已正確載入監視程式模組:
root #
lsmod
|grep
dog驗證監視程式裝置是否可用且可正常運作:
root #
ls -l
/dev/watchdog*root #
sbd
query-watchdog如果監視程式裝置無法使用,請在此處停止,並檢查模組名稱和選項。可以考慮使用其他驅動程式。
驗證監視程式裝置是否可正常運作:
root #
sbd
-w WATCHDOG_DEVICE test-watchdog將機器重新開機,以確定不存在衝突的核心模組。例如,如果您在記錄中找到
cannot register ...
訊息,就表示存在這樣的衝突模組。若要避免載入此類模組,請參閱 https://documentation.suse.com/sles/html/SLES-all/cha-mod.html#sec-mod-modprobe-blacklist。
11.6.2 使用軟體監視程式 (softdog) #
對於生產環境中的叢集,建議使用硬體特定的監視程式驅動程式。不過,如果沒有與您的硬體相符的監視程式,則可以將 softdog
當成核心監視程式模組使用。
Softdog 驅動程式假設至少有一個 CPU 仍然在執行。如果所有 CPU 均已堵塞,則 softdog 驅動程式中應該將系統重新開機的代碼永遠都不會執行。相反地,即使所有 CPU 均已堵塞,硬體監視程式也仍然會繼續運作。
啟用 softdog 驅動程式:
root #
echo
softdog > /etc/modules-load.d/watchdog.conf在
/etc/modules-load.d/watchdog.conf
中新增softdog
模組並重新啟動服務:root #
echo
softdog > /etc/modules-load.d/watchdog.confroot #
systemctl
restart systemd-modules-load測試是否已正確載入 softdog 監視程式模組:
root #
lsmod
|grep
softdog
11.7 設定 SBD 與裝置 #
以下是設定所必需步驟:
在開始之前,請確定要用於 SBD 的一部或多部區塊裝置滿足在第 11.3 節中指定的要求。
設定 SBD 裝置時,您需要考慮幾個逾時值。如需詳細資料,請參閱第 11.5 節 「逾時計算」。
如果節點上執行的 SBD 精靈更新監視程式計時器的速度不夠快,此節點將自行終止。設定逾時後,請在您的特定環境中予以測試。
若要將 SBD 與共用儲存搭配使用,必須先在一到三部區塊裝置上建立訊息佈局。sbd create
指令會將中繼資料標頭寫入指定的一部或多部裝置。它還將啟始化最多 255 個節點的訊息插槽。如果該指令不含任何其他選項,則執行時將使用預設的逾時設定。
確定要用於 SBD 的一部或多部裝置沒有儲存任何重要資料。執行 sbd create
指令時,會直接覆寫指定區塊裝置的大於第一個 MB,而不會進一步提出申請或進行備份。
決定要將哪個區塊裝置或哪些區塊裝置用於 SBD。
使用下列指令啟始化 SBD 裝置:
root #
sbd
-d /dev/SBD create(用實際的路徑名稱取代
/dev/SBD
,例如:/dev/disk/by-id/scsi-ST2000DM001-0123456_Wabcdefg
。)若要將多部裝置用於 SBD,請多次指定
-d
選項,例如:root #
sbd
-d /dev/SBD1 -d /dev/SBD2 -d /dev/SBD3 create如果您的 SBD 裝置位於多路徑群組,請使用
-1
和-4
選項來調整要用於 SBD 的逾時。如需詳細資料,請參閱第 11.5 節 「逾時計算」。所有逾時均以秒為單位指定:root #
sbd
-d /dev/SBD -4 1801 -1 902 create檢查已寫入裝置的內容:
root #
sbd
-d /dev/SBD dump Header version : 2.1 UUID : 619127f4-0e06-434c-84a0-ea82036e144c Number of slots : 255 Sector size : 512 Timeout (watchdog) : 5 Timeout (allocate) : 2 Timeout (loop) : 1 Timeout (msgwait) : 10 ==Header on disk /dev/SBD is dumped如您所見,逾時也會存入標頭,以確保所有參與的節點在逾時上達成一致。
啟始化 SBD 裝置之後,編輯 SBD 組態檔案,然後啟用並啟動相應的服務以讓變更生效。
開啟檔案
/etc/sysconfig/sbd
。搜尋以下參數: SBD_DEVICE。
該參數指定要監控和要用於交換 SBD 訊息的裝置。
編輯此行,並使用您的 SBD 裝置取代 SBD:
SBD_DEVICE="/dev/SBD"
如果您需要在第一行中指定多部裝置,請使用分號分隔各裝置 (裝置順序無關緊要):
SBD_DEVICE="/dev/SBD1;/dev/SBD2;/dev/SBD3"
如果無法存取 SBD 裝置,精靈將無法啟動叢集,並會禁止叢集啟動。
搜尋以下參數: SBD_DELAY_START。
啟用或停用延遲。設定 SBD_DELAY_START 為
yes
(如果msgwait
相對較長,而叢集節點開機很快)。將此參數設定為yes
可在開機時延遲 SBD 啟動。虛擬機器有時候需要此項延遲。
將您的 SBD 裝置新增至 SBD 組態檔案之後,啟用 SBD 精靈。SBD 精靈是叢集堆疊的重要組成部分。當叢集堆疊正在執行時,需要執行該精靈。因此,每當啟動 pacemaker
服務時,做為相依項,也要啟動 sbd
服務。
在每個節點上,啟用 SBD 服務:
root #
systemctl
enable sbd每當啟動 Pacemaker 服務時,SBD 服務將與 Corosync 服務一起啟動。
在每個節點上重新啟動叢集堆疊:
root #
crm
cluster restart此操作會自動觸發 SBD 精靈的啟動。
下一步是測試 SBD 裝置,請參閱程序 11.6。
下列指令會從 SBD 裝置傾印節點插槽及其目前的訊息:
root #
sbd
-d /dev/SBD list現在,您應該會看到曾隨 SBD 啟動的所有叢集節點都列在此處。例如,如果您擁有雙節點叢集,訊息插槽對於兩個節點都應顯示
clear
:0 alice clear 1 bob clear
嘗試向其中一個節點傳送一則測試訊息:
root #
sbd
-d /dev/SBD message alice test節點會在系統記錄檔案中確認收到訊息:
May 03 16:08:31 alice sbd[66139]: /dev/SBD: notice: servant: Received command test from bob on disk /dev/SBD
這証實了節點上的 SBD 目前的確在正常執行,並且可以接收訊息。
在最後一個步驟中,您需要調整叢集組態,請參閱程序 11.7。
若要設定在叢集中使用 SBD,您需要在叢集組態中執行以下操作:
將 stonith-timeout 參數設定為與您的設定相符的值。
設定 SBD STONITH 資源。
如需計算 stonith-timeout ,請參閱第 11.5 節 「逾時計算」。
啟動外圍程序,並以
root
或同等身分登入。執行
crm
configure
。輸入以下內容:
crm(live)configure#
property
stonith-enabled="true" 1crm(live)configure#
property
stonith-watchdog-timeout=0 2crm(live)configure#
property
stonith-timeout="40s" 3對於雙節點叢集,在電腦分裂狀況下,兩個節點都會依預期向對方發出圍籬區隔。為防止兩個節點幾乎同時被重設,建議套用以下圍籬區隔延遲來協助其中一個節點,甚至是偏好節點在圍籬區隔競爭中勝出。對於包含兩個以上節點的叢集,不需要套用這些延遲。
- 優先程度圍籬區隔延遲
priority-fencing-delay
叢集內容預設處於停用狀態。透過設定延遲值,若另一個節點遺失且其具有更高的總資源優先程度,則針對該節點的圍籬區隔將延遲指定的時間。這意味著在電腦分裂狀況下,更重要的節點將在圍籬區隔競爭中勝出。可以用優先程度中繼屬性設定重要資源。在計算時,將對每個節點上執行的資源或例項的優先程度值求和來進行計算。升級後的資源例項的優先程度為所設定的基本優先程度加 1,因此它的優先程度值比任何未升級的例項都高。
root #
crm
configure property priority-fencing-delay=30即使使用了
priority-fencing-delay
,也仍然建議使用pcmk_delay_base
或pcmk_delay_max
(如下所述) 來解決節點優先程度恰好相同的所有情況。priority-fencing-delay
的值應明顯大於pcmk_delay_base
/pcmk_delay_max
的最大值,最好是最大值的兩倍。- 可預測的靜態延遲
此參數用於在執行 STONITH 動作之前新增靜態延遲。為防止當雙節點叢集發生電腦分裂時兩個節點同時被重設,請使用不同的延遲值設定獨立的圍籬區隔資源。可以使用可實現更長圍籬區隔延遲的參數來標示偏好節點,以使其在圍籬區隔競爭中勝出。若要實現此目的,為每個節點建立兩個基本 STONITH 裝置至關重要。在下面的組態中,如果出現電腦分裂,alice 將會獲勝並得以留存:
crm(live)configure#
primitive
st-sbd-alice stonith:external/sbd params \ pcmk_host_list=alice pcmk_delay_base=20crm(live)configure#
primitive
st-sbd-bob stonith:external/sbd params \ pcmk_host_list=bob pcmk_delay_base=0- 動態隨機延遲
此參數用於為圍籬區隔裝置上的 STONITH 動作新增隨機延遲。參數 pcmk_delay_max 不會新增針對特定節點的靜態延遲,而是會為使用圍籬區隔資源的任何圍籬區隔都新增一個隨機延遲,以防止雙重重設。與 pcmk_delay_base不同,此參數可對針對多個節點的統一圍籬區隔資源指定。
crm(live)configure#
primitive
stonith_sbd stonith:external/sbd params pcmk_delay_max=30
使用
show
檢閱所做的變更。使用
commit
提交變更,然後使用exit
離開 crm 即時組態。
啟動資源之後,叢集即會成功設定為使用 SBD。如果需要圍籬區隔某個節點,將會使用此方法。
11.8 設定無磁碟 SBD #
SBD 可在無磁碟模式下操作。在此模式下,發生以下情況時,將使用監視程式裝置來重置節點:如果不具有最低節點數、如果任何受監控的精靈遺失且未復原,或者如果 Pacemaker 決定節點需要圍籬區隔。無磁碟 SBD 基於節點的「自我圍籬區隔」,取決於叢集的狀態、最低節點數和一些合理的假設。CIB 中不需要 STONITH SBD 基本資源。
不要將無磁碟 SBD 用做雙節點叢集的圍籬區隔機制。請僅對包含三個或更多節點的叢集使用無磁碟 SBD。無磁碟模式下的 SBD 無法處理雙節點叢集的電腦分裂情況。如果您想對雙節點叢集使用無磁碟 SBD,請依第 12 章 「QDevice 和 QNetd」 所述使用 QDevice。
開啟檔案
/etc/sysconfig/sbd
並使用以下項目:SBD_PACEMAKER=yes SBD_STARTMODE=always SBD_DELAY_START=no SBD_WATCHDOG_DEV=/dev/watchdog SBD_WATCHDOG_TIMEOUT=5
由於未使用共用磁碟,因此不需要
SBD_DEVICE
項目。此參數遺失時,sbd
服務不會為 SBD 裝置啟動任何監看員程序。在每個節點上,啟用 SBD 服務:
root #
systemctl
enable sbd每當啟動 Pacemaker 服務時,SBD 服務將與 Corosync 服務一起啟動。
在每個節點上重新啟動叢集堆疊:
root #
crm
cluster restart此操作會自動觸發 SBD 精靈的啟動。
檢查參數 have-watchdog=true 是否已自動設定:
root #
crm
configure show | grep have-watchdog have-watchdog=true執行
crm configure
並在 crm 外圍程序上設定以下叢集屬性:crm(live)configure#
property
stonith-enabled="true" 1crm(live)configure#
property
stonith-watchdog-timeout=10 2此為預設組態,因為不支援沒有 STONITH 的叢集。而如果出於測試目的停用了 STONITH,請確定再次將此參數設定為
true
。對於無磁碟 SBD,此參數不能為零。它定義了經過多長時間之後可以假定圍籬區隔目標已自我圍籬區隔。因此,其值需要大於或等於
/etc/sysconfig/sbd
中SBD_WATCHDOG_TIMEOUT
的值。從 SUSE Linux Enterprise High Availability Extension 15 開始,如果您將 stonith-watchdog-timeout 設定為負值,Pacemaker 將自動計算此逾時並將它設定為 SBD_WATCHDOG_TIMEOUT。使用
show
檢閱所做的變更。使用
commit
提交變更,然後使用exit
離開 crm 即時組態。
11.9 測試 SBD 和圍籬區隔 #
若要測試 SBD 在節點圍籬區隔方面是否如預期工作,請使用以下其中一種或所有方法:
- 手動觸發節點圍籬區隔
若要針對節點 NODENAME 觸發圍籬區隔動作,請執行以下操作:
root #
crm
node fence NODENAME檢查經過以下時間之後,節點是否已圍籬區隔,以及其他節點是否將該節點視為已圍籬區隔: stonith-watchdog-timeout。
- 模擬 SBD 失敗
辨識 SBD inquisitor 的程序 ID:
root #
systemctl
status sbd ● sbd.service - Shared-storage based fencing daemon Loaded: loaded (/usr/lib/systemd/system/sbd.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2018-04-17 15:24:51 CEST; 6 days ago Docs: man:sbd(8) Process: 1844 ExecStart=/usr/sbin/sbd $SBD_OPTS -p /var/run/sbd.pid watch (code=exited, status=0/SUCCESS) Main PID: 1859 (sbd) Tasks: 4 (limit: 4915) CGroup: /system.slice/sbd.service ├─1859 sbd: inquisitor [...]透過終止 SBD inquisitor 程序模擬 SBD 失敗。在我們的範例中,SBD inquisitor 的程序 ID 是
1859
:root #
kill
-9 1859節點主動自我圍籬區隔。經過以下時間之後,其他節點注意到該節點遺失並將它視為已自我圍籬區隔: stonith-watchdog-timeout。
- 透過監控操作失敗觸發圍籬區隔
對於正常組態,資源停止操作失敗將觸發圍籬區隔。若要手動觸發圍籬區隔,您可以產生一個資源停止操作失敗。或者,您可以暫時變更資源監控操作的組態,產生一個監控失敗,如下所示:
為資源監控操作設定
on-fail=fence
內容:op monitor interval=10 on-fail=fence
讓監控操作失敗 (例如,如果資源與某個服務相關,則可透過終止相應的精靈來實現)。
此失敗會觸發圍籬區隔動作。
11.10 其他儲存保護機制 #
除了透過 STONITH 進行節點圍籬區隔之外,還可使用其他方法在資源層級實現儲存保護。例如,SCSI-3 和 SCSI-4 使用持續保留,而 sfex
提供鎖定機制。這兩種方法將在下面的小節中介紹。
11.10.1 設定 sg_persist 資源 #
SCSI 規格 3 和 4 定義了持續保留。其屬於 SCSI 通訊協定功能,可用於 I/O 圍籬區隔和容錯移轉。此功能在 sg_persist
Linux 指令中實作。
用於 sg_persist
的所有備份磁碟都必須與 SCSI 磁碟相容。sg_persist
僅適用於 SCSI 磁碟或 iSCSI LUN 等裝置。不要將它用於 IDE、SATA 或不支援 SCSI 通訊協定的任何區塊裝置。
繼續操作之前,請檢查您的磁碟是否支援持續保留。使用以下指令 (使用您的裝置名稱取代 DISK):
root #
sg_persist
-n --in --read-reservation -d /dev/DISK
結果將顯示您的磁碟是否支援持續保留:
支援的磁碟:
PR generation=0x0, there is NO reservation held
不支援的磁碟:
PR in (Read reservation): command not supported Illegal request, Invalid opcode
如果您收到錯誤訊息 (如上面所示),請使用 SCSI 相容的磁碟取代舊磁碟。否則請執行如下操作:
若要建立基本資源
sg_persist
,請以root
身分執行以下指令:root #
crm
configurecrm(live)configure#
primitive
sg sg_persist \ params devs="/dev/sdc" reservation_type=3 \ op monitor interval=60 timeout=60將
sg_persist
基本資源新增至主要-從屬群組:crm(live)configure#
ms
ms-sg sg \ meta master-max=1 notify=true執行一些測試。當資源處於主要/從屬狀態時,您可以在執行主要例項的叢集節點上的
/dev/sdc1
中進行掛接和寫入,但無法在執行從屬例項的叢集節點上進行寫入。為 Ext4 新增檔案系統基本資源:
crm(live)configure#
primitive
ext4 ocf:heartbeat:Filesystem \ params device="/dev/sdc1" directory="/mnt/ext4" fstype=ext4在
sg_persist
主要資源和檔案系統資源之間新增以下順序關係和併置:crm(live)configure#
order
o-ms-sg-before-ext4 Mandatory: ms-sg:promote ext4:startcrm(live)configure#
colocation
col-ext4-with-sg-persist inf: ext4 ms-sg:Master使用
show changed
指令檢查您的所有變更。提交您的變更。
如需詳細資訊,請參閱 sg_persist
man 頁面。
11.10.2 使用 sfex
確定啟用獨佔儲存 #
本節介紹的 sfex
是一個附加的低層機制,用於將對共用儲存的存取鎖定給某個節點。請注意,sfex 並不會取代 STONITH。由於 sfex 需要共用儲存,因此建議在儲存的其他分割區上使用上述 SBD 節點圍籬區隔機制。
依照設計,sfex 不能與需要並行的工作負載 (例如 OCFS2) 配合使用。其可做為傳統容錯移轉型工作負載的一層保護。其效果與 SCSI-2 保留類似,但更具一般性。
11.10.2.1 綜覽 #
在共用儲存環境中,會額外設定一個小分割區,用於儲存一或多個鎖定。
節點必須先取得保護鎖定,才能獲取受保護的資源。Pacemaker 會強制執行此順序。sfex 元件可確保即使 Pacemaker 遇到了電腦分裂情況,也不會多次授予鎖定。
系統必須定期重新整理鎖定,這樣即使節點停止回應,也不會永久封鎖鎖定,其他節點仍能繼續處理。
11.10.2.2 設定 #
下例說明了如何建立用於 sfex 的共用分割區,以及如何在 CIB 中為 sfex 鎖定設定資源。一個 sfex 分割區可保存任意個鎖定,每個鎖定需要配置 1 KB 儲存空間。sfex_init
預設會在分割區上建立一個鎖定。
sfex 的共用分割區應與您要保護的資料位於同一個邏輯單位上。
共用 sfex 分割區不得使用基於主機的 RAID 或 DRBD。
可以使用 LVM2 邏輯磁碟區。
建立一個共用分割區用於 sfex。記下此分割區的名稱,並用其取代下面的
/dev/sfex
。使用以下指令建立 sfex 中繼資料:
root #
sfex_init
-n 1 /dev/sfex驗證中繼資料是否已正確建立:
root #
sfex_stat
-i 1 /dev/sfex ; echo $?此指令應傳回
2
,因為目前並未鎖定。
sfex 鎖定透過 CIB 中的資源表示,設定如下所示:
crm(live)configure#
primitive
sfex_1 ocf:heartbeat:sfex \ # params device="/dev/sfex" index="1" collision_timeout="1" \ lock_timeout="70" monitor_interval="10" \ # op monitor interval="10s" timeout="30s" on-fail="fence"若要透過 sfex 鎖定保護資源,請在要保護的資源與 sfex 資源之間建立強制性順序和配置條件約束。假設要保護的資源 ID 是
filesystem1
:crm(live)configure#
order
order-sfex-1 Mandatory: sfex_1 filesystem1crm(live)configure#
colocation
col-sfex-1 inf: filesystem1 sfex_1如果使用群組語法,請將 sfex 資源做為第一個資源新增到群組中:
crm(live)configure#
group
LAMP sfex_1 filesystem1 apache ipaddr