跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise High Availability Extension 文件 / 管理指南 / 組態和管理 / 儲存保護和 SBD
適用範圍 SUSE Linux Enterprise High Availability Extension 15 SP5

13 儲存保護和 SBD

SBD (STONITH 區塊裝置) 透過經由共用區塊儲存 (SAN、iSCSI、FCoE 等) 交換訊息,來為基於 Pacemaker 的叢集提供節點圍籬區隔機制。此方法可將圍籬區隔機制隔離開,使其不受韌體版本變更的影響,或不依賴於特定韌體控制器。SBD 需要在每個節點上安裝一個監視程式,以確定能真正停止行為異常的節點。在某些情況下,還可以透過無磁碟模式執行 SBD,以便使用不含共用儲存的 SBD。

叢集開機程序檔提供了一種自動設定叢集的方式,並可讓您選擇使用 SBD 做為圍籬區隔機制。如需詳細資料,請參閱安裝與設定快速入門。但是,手動設定 SBD 可為您提供個別設定的更多選項。

本章介紹 SBD 背後的概念。它將引導您完成 SBD 所需元件的設定,防止您的叢集在發生電腦分裂情況下出現可能的資料毀損。

除了節點層級圍籬區隔外,您還可以使用額外的儲存保護機制,例如 LVM2 獨佔啟用或 OCFS2 檔案鎖定支援 (資源層級圍籬區隔)。它們可以保護您的系統,避免出現管理或應用程式故障。

13.1 概念綜覽

SBD 是 Storage-Based Death (基於儲存的終止) 或 STONITH Block Device (STONITH 區塊裝置) 的縮寫。

高可用性叢集堆疊的最高優先程度是保護資料完整性。此項保護透過防止對資料儲存進行未協調的並行存取來實現。叢集堆疊會使用幾種控制機制來實現此目標。

但是,如果叢集中選出數個 DC,則可能導致網路分割或軟體故障。這種電腦分裂情況可能會導致資料損壞。

可防止電腦分裂情況的主要方法是透過 STONITH 實現節點圍籬區隔。如果使用 SBD 做為節點圍籬區隔機制,當發生電腦分裂情況時,無需使用外部關閉裝置即可關閉節點。

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 將繼續執行。

13.2 手動設定 SBD 的綜覽

手動設定基於儲存的保護時必須執行下列步驟:必須以 root 身分執行這些步驟。開始執行之前,請查看第 13.3 節 「要求」

  1. 設定監視程式

  2. 根據您的情況,可將 SBD 與一到三部裝置搭配使用,或以無磁碟模式使用。如需綜覽,請參閱第 13.4 節 「SBD 裝置數量」。如需詳細的設定,請參閱:

  3. 測試 SBD 和圍籬區隔

13.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。

13.4 SBD 裝置數量

SBD 支援最多使用三部裝置:

一部裝置

最簡單的實作。這種組態適合所有資料均位於同一共用儲存上的叢集。

兩部裝置

此組態主要用於如下環境:使用基於主機的鏡像,但是沒有第三個儲存裝置可用。如果 SBD 失去對一個鏡像複製方的存取能力,它不會立即終止,以便允許叢集繼續執行。不過,由於 SBD 掌握的情況不夠全面,它無法偵測儲存的不對稱分裂,所以當只有一個鏡像複製方可用時,它不會圍籬區隔另一方。因此,在其中一個儲存陣列已關閉的情況下,它無法自動容許再一次的故障。

三部裝置

最可靠的組態。它具有從一部裝置中斷 (可能是因為發生故障或進行維護) 的情況中復原的能力。只會在有一部以上裝置失去連接以及必要時,SBD 才會自行終止,具體取決於叢集分割區或節點的狀態。如果至少有兩部裝置仍然可存取,便能成功傳輸圍籬區隔訊息。

這種組態適合儲存不限制為單個陣列的較複雜情況。基於主機的鏡像複製解決方案可以在每個鏡像複製方設定一個 SBD (不鏡像複製自身),在 iSCSI 上另外設定一個連接中斷器。

無磁碟

如果您想要建立一個不含共用儲存的圍籬區隔機制,則此組態十分有用。在此無磁碟模式下,SBD 會使用硬體監視程式來圍籬區隔節點,而不依賴於任何共用裝置。不過,無磁碟 SBD 不能處理雙節點叢集的電腦分裂情況。此選項僅適用於具有兩個以上節點的叢集。

13.5 逾時計算

使用 SBD 做為圍籬區隔機制時,必須考慮所有元件的逾時,因為它們之間相互依賴。

監視程式逾時

此逾時在啟始化 SBD 裝置期間設定。它主要取決於您的儲存延遲。必須能夠在此段時間內成功讀取大多數裝置。否則,節點可能會自我圍籬區隔。

注意
注意:多重路徑或 iSCSI 設定

如果 SBD 裝置位於多重路徑設定或 iSCSI 上,則應將逾時設定為偵測到路徑故障並切換到下一個路徑所需的時間。

這還表示 /etc/multipath.confmax_polling_interval 的值必須小於 watchdog 逾時。

msgwait 逾時

此逾時在啟始化 SBD 裝置期間設定。它定義了將訊息寫入 SBD 裝置上的某個節點插槽後經過多長時間會視為已傳遞。該逾時應設定得足夠長,讓節點有時間偵測到其是否需要自我圍籬區隔。

但是,如果 msgwait 逾時較長,已圍籬區隔的叢集節點可能會在圍籬區隔動作傳回之前便又重新加入叢集。可以依SBD_DELAY_START 中的程序 13.4 所述,在 SBD 組態中設定 步驟 4 參數來減少此情況。

CIB 中的 stonith-timeout

此逾時在 CIB 中做為全域叢集內容設定。它定義了等待 STONITH 動作 (重新開機、開啟、關閉) 完成的時間。

CIB 中的 stonith-watchdog-timeout

此逾時在 CIB 中做為全域叢集內容設定。如果未明確設定,則預設值為 0,此值適用於 SBD 與一到三部裝置搭配使用的情況。若要以無磁碟模式使用 SBD,請參閱程序 13.8 「設定無磁碟 SBD」以取得詳細資料。

如果您變更監視程式逾時,則需要同時調整另外兩個逾時。以下公式大致表達了這三個值之間的關係:

範例 13.1︰ 逾時計算公式
Timeout (msgwait) >= (Timeout (watchdog) * 2)
stonith-timeout = Timeout (msgwait) + 20%

例如,如果您將監視程式逾時設定為 120,則請將 msgwait 逾時設定為 240,並將 stonith-timeout 設定為 288

如果您使用 crm 外圍程序提供的開機程序檔設定叢集並啟始化 SBD 裝置,系統會自動考慮這些逾時之間的關係。

13.6 設定監視程式

SUSE Linux Enterprise High Availability Extension 隨附了幾個核心模組用於提供硬體特定的監視程式驅動程式。對於生產環境中的叢集,我們建議使用硬體特定的監視程式驅動程式。不過,如果沒有與您的硬體相符的監視程式,則可以將 softdog 當成核心監視程式模組使用。

High Availability Extension 使用 SBD 精靈做為饋送監視程式的軟體元件。

13.6.1 使用硬體監視程式

找出指定系統的正確監視程式核心模組並非沒有意義。自動查探常常會失敗。因此,載入許多模組後才會載入正確的模組。

表格 13.1 列出了一些常用監視程式驅動程式,但這不是完整的受支援驅動程式清單。如果此處未列出您的硬體,/lib/modules/KERNEL_VERSION/kernel/drivers/watchdog/lib/modules/KERNEL_VERSION/kernel/drivers/ipmi 也為您提供了一系列選擇。或者,您可以諮詢您的硬體或系統廠商,獲取特定於系統的監視程式組態詳細資料。

表 13.1︰ 常用監視程式驅動程式
硬體驅動程式
HPhpwdt
Dell、Lenovo (Intel TCO)iTCO_wdt
Fujitsuipmi_watchdog
IBM z/VM 上的虛擬機器vmwatchdog
Xen VM (DomU)xen_xdt
VMware vSphere 上的虛擬機器wdat_wdt
Genericsoftdog
重要
重要:存取監視程式計時器

有些硬體廠商交付的系統管理軟體 (例如 HP ASR 精靈) 會使用監視程式來進行系統重設。如果 SBD 使用了監視程式,請停用此類軟體。此時不能有任何其他軟體存取監視程式計時器。

程序 13.1︰ 載入正確的核心模組

若要確定載入正確的監視程式模組,請執行如下操作:

  1. 列出已隨核心版本安裝的驅動程式:

    # rpm -ql kernel-VERSION | grep watchdog
  2. 列出核心中目前載入的任何監視程式模組:

    # lsmod | egrep "(wd|dog)"
  3. 如果傳回了結果,請卸載錯誤的模組:

    # rmmod WRONG_MODULE
  4. 啟用與您的硬體相符的監視程式模組:

    # echo WATCHDOG_MODULE > /etc/modules-load.d/watchdog.conf
    # systemctl restart systemd-modules-load
  5. 測試是否已正確載入 監視程式模組:

    # lsmod | grep dog
  6. 驗證監視程式裝置是否可用且可正常運作:

    # ls -l /dev/watchdog*
    # sbd query-watchdog

    如果監視程式裝置無法使用,請在此處停止,並檢查模組名稱和選項。可以考慮使用其他驅動程式。

  7. 驗證監視程式裝置是否可正常運作:

    # sbd -w WATCHDOG_DEVICE test-watchdog
  8. 將機器重新開機,以確定不存在衝突的核心模組。例如,如果您在記錄中找到 cannot register ... 訊息,就表示存在這樣的衝突模組。若要避免載入此類模組,請參閱 https://documentation.suse.com/sles/html/SLES-all/cha-mod.html#sec-mod-modprobe-blacklist

13.6.2 使用軟體監視程式 (softdog)

對於生產環境中的叢集,建議使用硬體特定的監視程式驅動程式。不過,如果沒有與您的硬體相符的監視程式,則可以將 softdog 當成核心監視程式模組使用。

重要
重要:Softdog 限制

Softdog 驅動程式假設至少有一個 CPU 仍然在執行。如果所有 CPU 均已堵塞,則 softdog 驅動程式中應該將系統重新開機的代碼永遠都不會執行。相反地,即使所有 CPU 均已堵塞,硬體監視程式也仍然會繼續運作。

程序 13.2︰ 載入 softdog 核心模組
  1. 啟用 softdog 監視程式:

    # echo softdog > /etc/modules-load.d/watchdog.conf
    # systemctl restart systemd-modules-load
  2. 測試是否已正確載入 softdog 監視程式模組:

    # lsmod | grep softdog

13.7 設定 SBD 與裝置

以下是設定所必需步驟:

在開始之前,請確定要用於 SBD 的一部或多部區塊裝置滿足在第 13.3 節中指定的要求。

設定 SBD 裝置時,您需要考慮幾個逾時值。如需詳細資料,請參閱第 13.5 節 「逾時計算」

如果節點上執行的 SBD 精靈更新監視程式計時器的速度不夠快,節點會自行終止。設定逾時後,請在您的特定環境中予以測試。

程序 13.3︰ 啟始化 SBD 裝置

若要將 SBD 與共用儲存搭配使用,必須先在一到三部區塊裝置上建立訊息佈局。sbd create 指令會將中繼資料標頭寫入指定的一或多部裝置。它還會啟始化最多 255 個節點的訊息插槽。如果不帶任何其他選項執行該指令,該指令將使用預設逾時設定。

警告
警告:覆寫現有資料

確定要用於 SBD 的一部或多部裝置沒有儲存任何重要資料。執行 sbd create 指令時,會直接覆寫指定區塊裝置的大約第一個 MB,而不會發出其他要求或進行備份。

  1. 決定要將哪個區塊裝置或哪些區塊裝置用於 SBD。

  2. 使用下列指令啟始化 SBD 裝置:

    # sbd -d /dev/SBD create

    (請用絕對路徑取代 /dev/SBD,例如 /dev/disk/by-id/scsi-ST2000DM001-0123456_Wabcdefg。)

    若要將多部裝置用於 SBD,請指定 -d 選項多次,例如:

    # sbd -d /dev/SBD1 -d /dev/SBD2 -d /dev/SBD3 create
  3. 如果您的 SBD 裝置位於多重路徑群組上,請使用 -1-4 選項調整要用於 SBD 的逾時。如需詳細資料,請參閱第 13.5 節 「逾時計算」。所有逾時均以秒為單位指定:

    # sbd -d /dev/SBD -4 1801 -1 902 create

    1

    -4 選項用於指定 msgwait 逾時。在上面的範例中,該逾時設定為 180 秒。

    2

    -1 選項用於指定 watchdog 逾時。在上面的範例中,該逾時設定為 90 秒。模擬監視程式的最小允許值為 15 秒。

  4. 檢查已寫入裝置的內容:

    # 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 組態檔案,然後啟用並啟動相應的服務以讓變更生效。

程序 13.4︰ 編輯 SBD 組態檔案
  1. 開啟檔案 /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 裝置啟動任何監看員程序。

  2. 搜尋以下參數:SBD_DEVICE

    該參數指定要監控和要用於交換 SBD 訊息的裝置。

  3. 編輯此行,並使用您的 裝置取代 SBDSBD:

    SBD_DEVICE="/dev/SBD"

    如果您需要在第一行中指定多部裝置,請使用分號分隔各裝置 (裝置順序無關緊要):

    SBD_DEVICE="/dev/SBD1;/dev/SBD2;/dev/SBD3"

    如果無法存取 SBD 裝置,精靈將無法啟動,導致叢集無法啟動。

  4. 搜尋以下參數:SBD_DELAY_START

    啟用或停用延遲。如果 msgwait 很長,但叢集節點開機速度很快,請將 SBD_DELAY_START 設定為 yes。將此參數設定為 yes 可在開機時延遲 SBD 啟動。虛擬機器有時候需要此項延遲。

將您的 SBD 裝置新增至 SBD 組態檔案之後,啟用 SBD 精靈。SBD 精靈是叢集堆疊的重要組成部分。當叢集堆疊正在執行時,需要執行該精靈。因此,每次叢集服務啟動時,sbd 服務也會做為相依項啟動。

程序 13.5︰ 啟用和啟動 SBD 服務
  1. 在每個節點上,啟用 SBD 服務:

    # systemctl enable sbd

    每次叢集服務啟動時,SBD 會與 Corosync 服務一併啟動。

  2. 在每個節點上重新啟動叢集服務:

    # crm cluster restart

    此操作會自動觸發 SBD 精靈的啟動。

下一步是測試 SBD 裝置,請參閱程序 13.6

程序 13.6︰ 測試 SBD 裝置
  1. 以下指令會從 SBD 裝置傾印節點插槽及其目前的訊息:

    # sbd -d /dev/SBD list

    現在,您應該會看到曾隨 SBD 啟動的所有叢集節點都列在此處。例如,如果您擁有雙節點叢集,訊息插槽對於兩個節點都應顯示 clear

    0       alice        clear
    1       bob          clear
  2. 嘗試向其中一個節點傳送一則測試訊息:

    # sbd -d /dev/SBD message alice test
  3. 此節點會在系統記錄檔案中確認收到了該訊息:

    May 03 16:08:31 alice sbd[66139]: /dev/SBD: notice: servant: Received command test from bob on disk /dev/SBD

    這証實了節點上的 SBD 目前的確在正常執行,並且可以接收訊息。

在最後一個步驟中,您需要調整叢集組態,請參閱程序 13.7

程序 13.7︰ 設定叢集以使用 SBD
  1. 啟動外圍程序,並以 root 或同等身分登入。

  2. 執行 crm configure

  3. 輸入以下內容:

    crm(live)configure# property stonith-enabled="true"1
    crm(live)configure# property stonith-watchdog-timeout=02
    crm(live)configure# property stonith-timeout="40s"3

    1

    此為預設組態,因為不支援沒有 STONITH 的叢集。而如果出於測試目的停用了 STONITH,請確定再次將此參數設定為 true

    2

    如果未明確設定,則預設值為 0,此值適用於 SBD 與一到三部裝置搭配使用的情況。

    3

    若要計算 stonith-timeout,請參閱第 13.5 節 「逾時計算」。如果將 SBD 的 stonith-timeout 逾時值設定為 40 秒,則適合將 msgwait 值設定為 30

  4. 設定 SBD STONITH 資源。您無需複製此資源。

    對於雙節點叢集,在電腦分裂情況下,兩個節點都會依預期向對方發出圍籬區隔。為防止兩個節點幾乎同時被重設,建議套用以下圍籬區隔延遲來協助其中一個節點,甚至是偏好節點在圍籬區隔競爭中勝出。對於包含兩個以上節點的叢集,不需要套用這些延遲。

    優先程度圍籬區隔延遲

    priority-fencing-delay 叢集內容預設處於停用狀態。設定延遲值後,如果另一個節點發生故障且其總資源優先程度更高,針對該節點的圍籬區隔將延遲指定的時間。這意味著在電腦分裂狀況下,更重要的節點將在圍籬區隔競爭中勝出。

    可以用優先程度中繼屬性設定重要資源。在計算時,將對每個節點上執行的資源或例項的優先程度值求和來進行計算。升級後的資源例項的優先程度為所設定的基礎優先程度加 1,因此它的優先程度值比任何未升級的例項都高。

    # crm configure property priority-fencing-delay=30

    即使使用了 priority-fencing-delay,我們也仍然建議使用 pcmk_delay_basepcmk_delay_max (如下所述) 來解決節點優先程度恰好相同的所有情況。priority-fencing-delay 的值應顯著大於 pcmk_delay_max/pcmk_delay_base 的最大值,最好是最大值的兩倍。

    可預測的靜態延遲

    此參數用於在執行 STONITH 動作之前新增靜態延遲。為防止發生電腦分裂時,同時重設雙節點叢集的兩個節點,請為不同的圍籬區隔資源設定不同的延遲值。可以使用可實現更長圍籬區隔延遲的參數來標示偏好節點,以使其在圍籬區隔競爭中勝出。若要成功實現此目的,每個節點都必須有兩個基本 STONITH 裝置。在下面的組態中,如果出現電腦分裂,alice 將會獲勝並得以留存︰

    crm(live)configure# primitive st-sbd-alice stonith:external/sbd params \
    pcmk_host_list=alice pcmk_delay_base=20
    crm(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
    警告
    警告:pcmk_delay_max 可能無法防止電腦分裂情況下的雙重重設。

    pcmk_delay_max 的值越低,仍會發生雙重重設的可能性就越高。

    如果您的目標是有可預測的倖存者,請使用優先程度圍籬區隔延遲或可預測的靜態延遲。

  5. 使用 show 檢閱所做的變更。

  6. 使用 commit 提交變更,然後使用 quit 離開 crm 即時組態。

資源啟動後,叢集便會成功設定為在出現需要圍籬區隔的節點時使用 SBD。

13.8 設定無磁碟 SBD

SBD 可在無磁碟模式下操作。在此模式下,當發生以下情況時,將使用監視程式裝置來重設節點:遺失仲裁、任何受監督的精靈發生故障且未復原、Pacemaker 決定需要圍籬區隔節點。無磁碟 SBD 基於節點的自我圍籬區隔,取決於叢集的狀態、仲裁和一些合理的假設。CIB 中不需要 STONITH SBD 基本資源。

重要
重要:不要在本地防火牆中封鎖 Corosync 流量

無磁碟 SBD 依賴於重新產生的成員資格和仲裁遺失來實現圍籬區隔。Corosync 流量必須能夠通過所有網路介面 (包括迴路介面),並且本地防火牆不能封鎖該流量。否則,Corosync 將無法重新產生新成員資格,可能導致出現電腦分裂情況,而無磁碟 SBD 圍籬區隔無法處理該情況。

重要
重要:叢集節點數

不要將無磁碟 SBD 用做雙節點叢集的圍籬區隔機制。請僅對包含三個或更多節點的叢集使用無磁碟 SBD。無磁碟模式下的 SBD 無法處理雙節點叢集的電腦分裂情況。如果您想對雙節點叢集使用無磁碟 SBD,請依第 14 章 「QDevice 和 QNetd 所述使用 QDevice。

程序 13.8︰ 設定無磁碟 SBD
  1. 開啟檔案 /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 和 QDevice 的 SBD_WATCHDOG_TIMEOUT

    如果您將 Qdevice 與無磁碟 SBD 配合使用,SBD_WATCHDOG_TIMEOUT 值必須大於 QDevice 的 sync_timeout 值,否則 SBD 將會逾時並無法啟動。

    sync_timeout 的預設值為 30 秒。因此,請將 SBD_WATCHDOG_TIMEOUT 設定為更大的值,例如 35

  2. 在每個節點上,啟用 SBD 服務:

    # systemctl enable sbd

    每次叢集服務啟動時,SBD 會與 Corosync 服務一併啟動。

  3. 在每個節點上重新啟動叢集服務:

    # crm cluster restart

    此操作會自動觸發 SBD 精靈的啟動。

  4. 檢查參數have-watchdog=true 是否已自動設定:

    # crm configure show | grep have-watchdog
             have-watchdog=true
  5. 執行 crm configure 並在 crm 外圍程序上設定以下叢集屬性:

    crm(live)configure# property stonith-enabled="true"1
    crm(live)configure# property stonith-watchdog-timeout=102

    1

    此為預設組態,因為不支援沒有 STONITH 的叢集。而如果出於測試目的停用了 STONITH,請確定再次將此參數設定為 true

    2

    對於無磁碟 SBD,此參數不能為零。它定義了經過多長時間之後可以假定圍籬區隔目標已自我圍籬區隔。因此,其值必須大於等於 /etc/sysconfig/sbd 中的 SBD_WATCHDOG_TIMEOUT 值。如果將 stonith-watchdog-timeout 設定為負值,Pacemaker 將自動計算此逾時,並將其設定為 SBD_WATCHDOG_TIMEOUT 值的兩倍。

  6. 使用 show 檢閱所做的變更。

  7. 使用 commit 提交變更,然後使用 quit 離開 crm 即時組態。

13.9 測試 SBD 和圍籬區隔

若要測試 SBD 在節點圍籬區隔方面是否如預期工作,請使用以下其中一種或所有方法:

手動觸發節點圍籬區隔

若要針對節點 NODENAME 觸發圍籬區隔動作,請執行以下操作:

# crm node fence NODENAME

經過 stonith-watchdog-timeout 時間之後,檢查該節點是否已圍籬區隔,以及其他節點是否將該節點視為已圍籬區隔。

模擬 SBD 失敗
  1. 辨識 SBD inquisitor 的程序 ID:

    # 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
    [...]
  2. 透過終止 SBD inquisitor 程序模擬 SBD 失敗。在我們的範例中,SBD inquisitor 的程序 ID 是 1859

    # kill -9 1859

    節點主動自我圍籬區隔。經過 stonith-watchdog-timeout 時間之後,其他節點注意到該節點遺失並將它視為已自我圍籬區隔。

透過監控操作失敗觸發圍籬區隔

對於正常組態,如果資源的停止操作失敗,將會觸發圍籬區隔。若要手動觸發圍籬區隔,您可以產生一個資源停止操作失敗。或者,您可以暫時變更資源監控操作的組態,產生一個監控失敗,如下所示:

  1. 為資源監控操作設定 on-fail=fence 內容:

    op monitor interval=10 on-fail=fence
  2. 讓監控操作失敗 (例如,如果資源與某個服務相關,則可透過終止相應的精靈來實現)。

    此失敗會觸發圍籬區隔動作。

13.10 其他儲存保護機制

除了透過 STONITH 進行節點圍籬區隔之外,還可使用其他方法在資源層級實現儲存保護。例如,SCSI-3 和 SCSI-4 使用持續保留,而 sfex 提供鎖定機制。這兩種方法將在下面的小節中介紹。

13.10.1 設定 sg_persist 資源

SCSI 規格 3 和 4 定義了持續保留。其屬於 SCSI 通訊協定功能,可用於 I/O 圍籬區隔和容錯移轉。此功能在 sg_persist Linux 指令中實作。

注意
注意:SCSI 磁碟相容性

用於 sg_persist 的所有備份磁碟都必須與 SCSI 磁碟相容。sg_persist 僅適用於 SCSI 磁碟或 iSCSI LUN 等裝置。 不要將它用於 IDE、SATA 或不支援 SCSI 通訊協定的任何區塊裝置。

繼續操作之前,請檢查您的磁碟是否支援持續保留。使用以下指令 (使用您的裝置名稱取代 DISK):

# 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 相容的磁碟取代舊磁碟。否則請執行如下操作:

  1. 若要建立基本資源 sg_persist,請以 root 身分執行以下指令:

    # crm configure
    crm(live)configure# primitive sg sg_persist \
        params devs="/dev/sdc" reservation_type=3 \
        op monitor interval=60 timeout=60
  2. 建立 sg_persist 基本資源的可升級複製品:

    crm(live)configure# clone clone-sg sg \
        meta promotable=true promoted-max=1 notify=true
  3. 測試設定:升級資源後,您可以在執行主要例項的叢集節點上的 /dev/sdc1 中進行掛接和寫入,但無法在執行輔助例項的叢集節點上進行寫入。

  4. 為 Ext4 新增檔案系統基本資源:

    crm(live)configure# primitive ext4 Filesystem \
        params device="/dev/sdc1" directory="/mnt/ext4" fstype=ext4
  5. sg_persist 複製品和檔案系統資源之間新增以下順序關係和並存:

    crm(live)configure# order o-ms-sg-before-ext4 Mandatory: clone-sg:promote ext4:start
    crm(live)configure# colocation col-ext4-with-sg-persist inf: ext4 clone-sg:Promoted
  6. 使用 show changed 指令檢查所有變更。

  7. 提交您的變更。

如需詳細資訊,請參閱 sg_persist 手冊頁。

13.10.2 使用 sfex 確定啟用獨佔儲存

本節介紹的 sfex 是一個附加的低層機制,用於將對共用儲存的存取鎖定給某個節點。請注意,sfex 並不會取代 STONITH。由於 sfex 需要共用儲存,因此建議在儲存的其他分割區上使用上述 SBD 節點圍籬區隔機制。

依照設計,sfex 不能與需要並行的工作負載 (例如 OCFS2) 配合使用。其可做為傳統容錯移轉型工作負載的一層保護。其效果與 SCSI-2 保留類似,但更具一般性。

13.10.2.1 綜覽

在共用儲存環境中,會額外設定一個小分割區,用於儲存一或多個鎖定。

節點必須先取得保護鎖定,才能獲取受保護的資源。此順序由 Pacemaker 強制執行。sfex 元件可確保即使 Pacemaker 遇到電腦分裂情況,系統也不會多次授予鎖定。

系統必須定期重新整理鎖定,這樣即使節點停止回應,也不會永久封鎖鎖定,其他節點仍能繼續處理。

13.10.2.2 設定

下例說明了如何建立用於 sfex 的共用分割區,以及如何在 CIB 中為 sfex 鎖定設定資源。一個 sfex 分割區可保存任意個鎖定,每個鎖定需要配置 1 KB 儲存空間。依預設,sfex_init 會在分割區上建立一個鎖定。

重要
重要:要求
  • sfex 的共用分割區應與您要保護的資料位於同一個邏輯單元上。

  • 共用 sfex 分割區不得使用基於主機的 RAID 或 DRBD。

  • 可以使用 LVM2 邏輯磁碟區。

程序 13.9︰ 建立 sfex 分割區
  1. 建立一個共用分割區用於 sfex。記下此分割區的名稱,並用其取代下面的 /dev/sfex

  2. 使用以下指令建立 sfex 中繼資料:

    # sfex_init -n 1 /dev/sfex
  3. 驗證中繼資料是否已正確建立:

    # sfex_stat -i 1 /dev/sfex ; echo $?

    此指令應傳回 2,因為目前並未鎖定。

程序 13.10︰ 設定 sfex 鎖定的資源
  1. 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"
  2. 若要透過 sfex 鎖定保護資源,請在要保護 sfex 資源的資源之間建立強制順序和放置條件約束。假設要保護的資源 ID 是 filesystem1

    crm(live)configure# order order-sfex-1 Mandatory: sfex_1 filesystem1
    crm(live)configure# colocation col-sfex-1 inf: filesystem1 sfex_1
  3. 如果使用群組語法,請將 sfex 資源做為第一個資源新增到群組中:

    crm(live)configure# group LAMP sfex_1 filesystem1 apache ipaddr

13.11 更多資訊

如需更多詳細資料,請參閱 sdb 的手冊頁。