套用至 SUSE Linux Enterprise High Availability Extension 12

17 儲存保護

高可用性叢集堆疊的首要任務是保護資料的完整性。具體是透過防止在未經協調的情況下同時存取資料儲存來實現此目標。舉例來說,叢集中只會掛接一次 Ext3 檔案系統,以及只有在與其他叢集節點協調後才會掛接 OCFS2 磁碟區。在正常運作的叢集中,如果使用中的資源超出其同步限制,Pacemaker 會偵測到此情況,並啟動復原操作。而且,其規則引擎永遠不會超出這些限制。

但是,如果系統中有數個協調者,便可能導致網路分割區或軟體出現故障。如果系統允許出現這種所謂的電腦分裂情況,就有可能產生資料損毀。為此,叢集堆疊中新增了數道安全層以降低風險。

其中最關鍵的元件是 IO 圍籬區隔/STONITH,它可以確保在啟動儲存裝置之前先終止其他所有存取。其他機制包括 cLVM2 獨佔式啟動或 OCFS2 檔案鎖定支援,它們可保護系統,避免管理或應用程式故障。如果再加以適當設定,這些安全措施就可以有效地防止電腦分裂現象,避免對系統造成損害。

本章先介紹可充分利用自身儲存的 IO 圍籬區隔機制,然後介紹為確保獨佔式儲存存取而增設的保護層。這兩項機制聯合可實現更高級別的保護。

17.1 基於儲存的圍籬區隔

使用一或多個 STONITH 區塊裝置 (SBD)、監視程式支援和 external/sbd STONITH 代辦,可以有效地避免出現電腦分裂的情況。

17.1.1 綜覽

如果一個環境中的所有節點都可以存取共享儲存,系統會格式化裝置的一小塊分割區用於 SBD。該分割區的大小取決於所用磁碟的區塊大小 (對於區塊大小為 512 位元組的標準 SCSI 磁碟,該分割區大小為 1 MB;區塊大小為 4 KB 的 DASD 磁碟需要 4 MB)。設定各自的精靈之後,系統會連接每個節點上 SBD,然後啟動其餘的叢集堆疊。當其他所有叢集元件都關閉後,SBD 才會終止,這樣便確保了只要叢集資源啟動,SBD 就會加以監督。

精靈會自動在分割區上為自己配置一個訊息槽,然後持續監控,查看是否有傳送給它的訊息。一旦收到訊息,精靈會立即回應請求,例如為圍籬區隔啟動關機或重新開機操作。

精靈還會持續監控與儲存裝置的連線,如果該分割區不再可存取,精靈就會自行終止。這樣可保證精靈不會錯過圍籬區隔訊息。如果叢集資料位於其他分割區的同一個邏輯單位,則一旦與儲存失去連線,載入的工作便會終止,因此不會增加故障點。

監視程式支援進一步提升了安全性。最新的系統支援硬體監視程式,該程式需要由某個軟體元件來激發餽送。該軟體元件 (通常是精靈) 會定期將服務脈沖寫入監視程式。如果精靈停止向監視程式輸送脈沖,硬體將強制系統重新啟動。這樣可以保障 SBD 程序自身不出現故障,例如沒有回應或陷入 IO 錯誤。

如果已啟動 Pacemaker 整合,則在大部分裝置的連線已中斷的情況下,SBD 將不會自我圍籬區隔。例如,假定您的叢集包含 3 個節點:A、B 和 C。由於網路分隔,A 只能看到它自己,而 B 和 C 之間仍然能夠通訊。此時就有兩個叢集分割區,一個由於節點占多數 (B 和 C) 而達到最低節點數,另一個 (A) 則未達到。如果在大部分圍籬區隔裝置無法連接時發生這種情況,節點 A 將立即確認終止,但是節點 B 和 C 將繼續執行。

17.1.2 SBD 裝置數目

SBD 支援使用 1-3 個裝置:

1 個裝置

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

2 個裝置

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

3 個裝置

最可靠的組態。它具有從一個裝置中斷 (可能是由於失敗或維護) 的情況中復原的能力。只有在不止一個裝置中斷的情況下,SBD 才會自行終止。如果至少有兩個裝置仍然可存取,就可以成功傳輸圍籬區隔訊息。

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

17.1.3 設定基於儲存的保護

設定基於儲存的保護時必須執行下列步驟︰

下列所有程序都必須以 root 身分執行。在啟動之前,確定已符合下列要求︰

重要
重要:要求
  • 環境中必須有所有節點都能存取的共享儲存。

  • 共享儲存節區不得使用基於主機的 RAID、cLVM2 或 DRBD*。

  • 但是,建議使用基於儲存的 RAID 和多重路徑來提升可靠性。

17.1.3.1 建立 SBD 分割區

建議在裝置啟動時建立 1MB 的分割區。如果 SBD 裝置位於多重路徑群組中,MPIO 的向下路徑偵測可能會導致一定程度的延遲,因此需要調整 SBD 使用的逾時。達到 msgwait 逾時後,系統會認為訊息已傳送到節點。對多重路徑而言,這一時間也就是 MPIO 偵測到路徑故障並切換到下一個路徑所需的時間。您可能需要在自己的環境中對此進行測試。如果節點上執行的 SBD 精靈更新監視程式計時器的速度不夠快,此節點將自行終止。請在特定的環境中測試所選逾時。如果只對一個 SBD 裝置使用多路徑儲存,請密切關注發生的容錯移轉延遲。

注意
注意:SBD 分割區的裝置名稱

在下例中,SBD 分割區以 /dev/SBD 表示。請將其取代為實際的路徑名稱,例如 /dev/sdc1

重要
重要:覆寫現有資料

確定要用於 SBD 的裝置沒有儲存任何資料。sdb 指令無需使用者確認即會直接覆寫裝置。

  1. 使用下列指令啟始化 SBD 裝置︰

    root # sbd -d /dev/SBD create

    此指令會在裝置中寫入標頭,並為最多 255 個共享此裝置的節點建立插槽 (採用預設時間設定)。

    如果您要將多個裝置用於 SBD,請多次指定 -d 選項來提供這些裝置,例如:

    root # sbd -d /dev/SBD1 -d /dev/SBD2 -d /dev/SBD3 create
  2. 如果 SBD 裝置位於多重路徑群組中,則調整 SBD 使用的逾時。逾時可以在啟始化 SBD 裝置時指定 (所有逾時均以秒計)︰

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

    1

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

    2

    -1 選項用於指定監視程式的逾時。在上面的範例中,該逾時設定為 90 秒。

  3. 使用下列指令查看寫入裝置的內容︰

    root # sbd -d /dev/SBD dump 
    Header version     : 2
    Number of slots    : 255
    Sector size        : 512
    Timeout (watchdog) : 5
    Timeout (allocate) : 2
    Timeout (loop)     : 1
    Timeout (msgwait)  : 10

如您所見,逾時也會存入標頭,以確保所有參與的節點在逾時上達成一致。

17.1.3.2 設定軟體監視程式

在未由其他軟體使用的情況下,監視程式可以在發生 SBD 失敗時保護系統。

重要
重要:存取監視程式計時器

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

依預設,SUSE Linux Enterprise High Availability Extension 的核心中會啟用監視程式支援:本產品隨附了多個不同的核心模組,可提供特定於硬體的監視程式驅動程式。High Availability Extension 使用 SBD 精靈做為給監視程式餵食的軟體元件。如果已依第 17.1.3.3 節「啟動 SBD 精靈」所述進行設定,SBD 精靈會在您使用 systemctl start pacemaker.service 使相應節點上線時自動啟動。

通常,適當的硬體監視程式驅動程式會在系統開機時自動載入。softdog 是最常見的驅動程式,不過建議您使用實際硬體中整合的驅動程式。例如︰

  • 在 HP 硬體上,就是 hpwdt 驅動程式。

  • 如果系統配有 Intel TCO,則可以使用 iTCO_wdt 驅動程式。

如需選項清單,請參閱 /usr/src/核心版本/drivers/watchdog。或者,使用以下指令列出已安裝的具有您核心版本的驅動程式:

root # rpm -ql kernel-VERSION | grep watchdog

由於大多數監視程式驅動程式的名稱都包含類似 wdwdtdog 的字串,因此,請使用以下指令檢查目前載入了哪個驅動程式:

root # lsmod | egrep "(wd|dog)" 

若要自動載入監視程式驅動程式,請建立檔案 /etc/modules-load.d/watchdog.conf,並在其中包含含有驅動程式名稱的一行。如需詳細資訊,請參閱 man 頁面 modules-load.d

如果您變更了監視程式的逾時,則必須也要變更另外兩個值 (msgwaitstonith-timeout)。監視程式逾時主要視您的儲存延遲而定。此值指定大多數裝置必須在此時間範圍內成功完成其讀取操作。否則,節點會自行圍籬區隔。

以下公式大致表達了這三個值之間的關係:

範例 17.1 使用 SBD 做為 STONITH 裝置的叢集計時
Timeout (msgwait) = (Timeout (watchdog) * 2)
stonith-timeout = Timeout (msgwait) + 20%

例如,如果將逾時監視程式設定為 120,則需要將 msgwait 設定為 240,將 stonith-timeout 設定為 288。您可以使用 cs_make_sbd_devices 檢查輸出:

root # cs_make_sbd_devices --dump
==Dumping header on disk /dev/sdb
Header version     : 2.1
UUID               : 619127f4-0e06-434c-84a0-ea82036e144c
Number of slots    : 255
Sector size        : 512
Timeout (watchdog) : 20
Timeout (allocate) : 2
Timeout (loop)     : 1
Timeout (msgwait)  : 40
==Header on disk /dev/sdb is dumped

如果您要設定新叢集,ha-cluster-init 指令會將上述因素納入考量。

17.1.3.3 啟動 SBD 精靈

SBD 精靈是叢集堆疊的重要組成部分。只要叢集堆疊正在執行,SBD 精靈就必須執行,即使叢集堆疊的一部分損毀時也是如此,這樣這一部分才能被圍籬區隔。

  1. 使用以下指令使 SBD 精靈在開機時啟動:

    root # systemctl enable sbd.service
  2. 執行 ha-cluster-init。此程序檔可確保正確設定 SBD,並將組態檔案 /etc/sysconfig/sbd 新增至需要與 Csync2 同步化的檔案清單。

    若要手動設定 SBD,請執行以下步驟:

    若要啟動 Corosync init 程序檔和停止 SBD,請編輯 /etc/sysconfig/sbd 檔案,搜尋以下行,搜尋時將 SBD 取代為您的 SBD 裝置:

    SBD_DEVICE="/dev/SBD"

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

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

    如果無法存取 SBD 裝置,精靈將無法啟動 Corosync 以及禁止其啟動。

    注意
    注意:在開機時啟動服務

    如果節點無法存取 SBD 裝置,便有可能陷入重新開機的無限循環。從技術層面而言,這種行為並沒有錯,但根據您的管理規則,這很有可能會帶來麻煩。若出現這種情況,最好不要讓 Corosync 和 Pacemaker 在開機時自動啟動。

  3. 繼續下一步之前,請先執行 systemctl restart pacemaker.service,以確保所有節點上的 SBD 均已啟動。

17.1.3.4 測試 SBD

  1. 下列指令會從 SBD 裝置傾印節點插槽及其目前的訊息︰

    root # sbd -d /dev/SBD list

    現在您會看到,此處列出 SBD 的所有叢集節點均已啟動,訊息槽應顯示清除

  2. 嘗試向其中一個節點傳送一則測試訊息︰

    root # sbd -d /dev/SBD message nodea test
  3. 節點會在系統記錄檔案中確認收到訊息︰

    Aug 29 14:10:00 nodea sbd: [13412]: info: Received command test from nodeb

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

17.1.3.5 設定圍籬區隔資源

  1. 若要完成 SBD 設定,請依照以下方式在 CIB 中將 SBD 做為 STONITH/圍籬區隔機制啟用︰

    root # crm configure
    crm(live)configure# property stonith-enabled="true"
    crm(live)configure# property stonith-timeout="40s"
    crm(live)configure# primitive stonith_sbd stonith:external/sbd \
       op start interval="0" timeout="15" start-delay="10"
    crm(live)configure# commit
    crm(live)configure# quit

    不需要複製品資源,因為如果發生問題,系統無論如何都會關閉相應的節點。

    stonith-timeout 設定何值取決於 msgwait 的逾時。msgwait 逾時應該大於基礎 IO 系統的最大允許逾時。例如,普通 SCSI 磁碟的最大允許逾時為 30 秒。如果您將 msgwait 逾時值設定為 30 秒,那麼將 stonith-timeout 設定為 40 秒較為妥當。

    由於系統會自動配置節點插槽,因此不需要手動定義主機清單。

  2. 因為現在透過 SBD 機制來實現圍籬區隔功能,所以請停用先前設定過的其他所有圍籬區隔裝置。

資源啟動後,叢集的共享儲存圍籬區隔組態即已成功設定,叢集將在需要對節點進行圍籬區隔時使用此方法。

17.1.3.6 設定 sg_persist 資源

  1. root 身分登入並啟動一個外圍程序。

  2. 建立組態檔案 /etc/sg_persist.conf

    sg_persist_resource_MDRAID1() {
          devs="/dev/sdd /dev/sde"
          required_devs_nof=2
    }
  3. 執行以下指令以建立基本資源 sg_persist

    root # crm configure
    crm(live)configure# primitive sg ocf:heartbeat:sg_persist \
        params config_file=/etc/sg_persist.conf \
               sg_persist_resource=MDRAID1 \
               reservation_type=1 \
        op monitor interval=60 timeout=60
  4. sg_persist 基本資源新增至主要-從屬群組:

    crm(live)configure# ms ms-sg sg \
        meta master-max=1 notify=true
  5. 在 alice 伺服器上設定主要資源,在 bob 節點上設定從屬資源:

    crm(live)configure# location ms-sg-alice-loc ms-sg inf: alice
    crm(live)configure# location ms-sg-bob-loc ms-sg 100: bob
  6. 執行一些測試。當資源處於主要/從屬狀態時,在主伺服器上,您可以在 /dev/sdc1 中執行掛接和寫入,而在從屬伺服器上,則無法寫入。

通常,您可能希望將上述資源與檔案系統資源 (例如 OCFS2) 結合使用。在這種情況下,需要執行下列步驟:

  1. 新增 OCFS2 基本資源:

    crm(live)configure# primitive ocfs2 ocf:heartbeat:Filesystem \
        params device="/dev/sdc1" directory="/mnt/ocfs2" fstype=ocfs2
  2. 從基礎群組建立複製品:

    crm(live)configure# clone cl-group basegroup
  3. 新增 ms-sgcl-group 之間的關係:

    crm(live)configure# colocation ocfs2-group-on-ms-sg inf: cl-group ms-sg:Master
    crm(live)configure# order ms-sg-before-ocfs2-group inf: ms-sg:promote cl-group
  4. 使用 edit 指令檢查所有變更。

  5. 提交您的變更。

17.2 確保啟動獨佔性儲存

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

由於內在設計的原因,sfex 無法用於要求同時作業的工作負載 (如 OCFS2),但可用做傳統容錯移轉式工作負載的保護層。其效果與保留 SCSI-2 類似,但更加常用。

17.2.1 綜覽

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

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

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

17.2.2 設定

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

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

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

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

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

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

    root # sfex_init -n 1 /dev/sfex
  3. 驗證該中繼資料已正確建立︰

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

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

過程 17.2 設定 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 inf: sfex_1 filesystem1
    crm(live)configure# colocation colo-sfex-1 inf: filesystem1 sfex_1
  3. 如果使用群組語法,請將 sfex 資源做為第一個資源新增到群組中︰

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

17.3 更多資訊

請參閱 http://www.linux-ha.org/wiki/SBD_Fencingman sbd

列印此頁面