7.6 設定路徑容錯移轉規則與優先程度

在 Linux 主機上,若一個儲存控制器有多個路徑,則每個路徑會顯示為獨立的區塊設備,導致單個 LUN 有多個區塊設備。設備對應程式多重路徑服務會偵測到多個路徑具有同一個 LUN ID,然後會使用該 ID 建立新的多重路徑設備。例如,若主機上有兩個 HBA 透過未分區的光纖通道交換器連接至具有兩個連接埠的某個儲存控制器,則該主機會探查到四個區塊設備,即 /dev/sda/dev/sdb/dev/sdc/dev/sdd。設備對應程式多重路徑服務會建立單個區塊設備 /dev/mpath/mpath1,透過以上四個基礎區塊設備來重新路由 I/O。

本節說明如何指定容錯移轉的規則及如何設定路徑的優先程度。

7.6.1 設定路徑容錯移轉規則

使用包含 -p 選項的 multipath 指令來設定路徑容錯移轉規則:

multipath devicename -p policy 

用以下其中一個規則選項取代 policy

表 7-4 multipath -p 指令的群組規則選項

規則選項

描述

failover

每個優先程度群組對應一個路徑。

multibus

所有路徑都在一個優先程度群組中。

group_by_serial

每個偵測到的序號對應一個優先程度群組。

group_by_prio

每個路徑優先程度值對應一個優先程度群組。優先程度由註標程式決定,在 /etc/multipath.conf 組態檔案中指定為 global、per-controller 或 per-multipath 選項。

group_by_node_name

每個目標節點名稱對應一個優先程度群組。目標節點名稱取自 /sys/class/fc_transport/target*/node_name 位置。

7.6.2 設定容錯移轉優先程度

您必須在 /etc/multipath.conf 檔案中手動輸入設備的容錯移轉優先程度。/usr/share/doc/packages/multipath-tools/multipath.conf.annotated 檔案中提供了所有設定與選項的範例。

瞭解優先程序群組與屬性

優先程度群組是進入相同實體 LUN 的路徑集合。依預設,I/O 以輪替方式發佈到群組的所有路徑。multipath 指令會根據 SAN 的 path_grouping_policy 設定,在該 SAN 中自動為每個 LUN 建立優先程度群組。multipath 指令會將群組中路徑的數目乘以群組的優先程度,來決定哪個群組為主要群組。計算值最高的群組為主要群組。主要群組中的所有路徑都失敗時,計算值次高的優先程度群組成為主動群組。

路徑優先程度是指定給路徑的整數值。值越高,優先程度越高。系統使用了外部程式來指定每個路徑的優先程度。對於指定的設備,優先程度相同的路徑屬於同一個優先程度群組。

表 7-5 多重路徑屬性

多重路徑屬性

描述

user_friendly_names

指定是使用 ID 還是使用 /var/lib/multipath/bindings 檔案為多重路徑設備指定格式為 /dev/mapper/mpathN、永久且唯一的別名。

yes︰ 自動產生易記名稱做為多重路徑設備的別名來取代實際的 ID。

no︰ 預設值。使用 /dev/disk/by-id/ 位置所顯示的 WWID。

blacklist

指定要做為非多重路徑設備加以忽略的設備名稱清單,例如 cciss、fd、hd、md、dm、sr、scd、st、ram、raw 及 loop 等。

如需取得範例說明,請參閱 在 /etc/multipath.conf 中將非多重路徑設備列入黑名單

blacklist_exceptions

指定要視為多重路徑設備加以處理的設備名稱清單,即使這些名稱包含於黑名單中。

如需範例,請參閱 /usr/share/doc/packages/multipath-tools/multipath.conf.annotated 檔案。

failback

指定是否監控失敗路徑的復原狀況,並指出失敗路徑恢復使用後群組進行錯誤回復所花的時間。

失敗路徑復原後,系統會根據此設定將該路徑重新新增到啟用了多重路徑的路徑清單中。多重路徑會評估優先程度群組,並在主要路徑的優先程度高於次要群組時,變更主動優先程度群組。

immediate︰ 某路徑復原後,立即啟用該路徑。

n (> 0)︰ 某路徑復原後,等待 n 秒後再啟用此路徑。指定一個大於 0 的整數值。

manual︰ (預設) 不監控失敗路徑的復原狀況。管理員會執行 multipath 指令來更新已啟用的路徑與優先程度群組。

getuid

為獲得唯一路徑識別碼而呼叫的預設程式和引數。指定時應使用絕對路徑。

/sbin/scsi_id -g -u -s

這是預設位置和引數。

範例:

getuid "/sbin/scsi_id -g -u -d /dev/%n"

no_path_retry

指定路徑失敗時要採取的行為。

n (> 0)︰ 指定在 multipath 停止佇列且使路徑失敗之前的重試次數。指定一個大於 0 的整數值。

fail︰ 指定的立即失敗 (不排入佇列)。

queue: 永不停止佇列 (在路徑恢復正常之前始終排入佇列)。

path_grouping_policy

指定由指定控制器代管之多重路徑設備的路徑分組規則。

failover: 每個優先程度群組指定一個路徑,以便每次只使用一個路徑。

multibus: (預設) 所有有效的路徑均屬於一個優先程度群組。流量透過群組中的所有主動路徑來保持負載平衡。

group_by_prio: 每個路徑優先程度值對應一個優先程度群組。優先程度相同的路徑位於同一個優先程度群組中。優先程度由外部程式指定。

group_by_serial: 路徑根據 SCSI 目標序號 (控制器節點 WWN) 來分組。

group_by_node_name: 每個目標節點名稱指定一個優先程度群組。目標節點名稱取自 /sys/class/fc_transport/target*/node_name 中。

path_checker

決定路徑的狀態。

directio: (multipath-tools 0.4.8 版及更高版本中的預設值) 讀取具備直接 I/O 的第一個磁區,這對 DASD 設備非常有用。在 /var/log/messages 中記錄失敗訊息。

readsector0: (multipath-tools 0.4.7 版及較早版本的預設值) 讀取設備的第一個磁區。在 /var/log/messages 中記錄失敗訊息。

tur: 將 SCSI 測試單位就緒指令發送至設備。這是較佳設定 (若 LUN 支援)。若指令失敗,它不會在 /var/log/messages 中記錄訊息。

有些 SAN 廠商會提供自定 path_checker 選項:

  • emc_clariion: 查詢 EMC Clariion EVPD 的 0xC0 頁以決定路徑狀態。

  • hp_sw: 檢查包含主動/待機韌體之 HP 儲存陣列的路徑狀態 (Up、Down 或 Ghost)。

  • rdac: 檢查 LSI/Engenio RDAC 儲存控制器的路徑狀態。

path_selector

指定用於負載平衡的 path-selector 演算法。

round-robin 0︰ (預設值) 負載平衡演算法用於平衡優先程度群組中所有主動路徑中的流量。

從 SUSE Linux Enterprise Server 11 開始,提供了下列額外的 I/O 平衡選項︰

least-pending: 為基於 BIO 的設備對應程式多重路徑提供 least-pending-I/O 動態負載平衡規則。此負載平衡規則會考慮路徑上待處理的未服務申請數,選取待處理服務申請最少的路徑。

此規則在 SAN 環境包含異質元件時尤其有用。例如,當有一個 8GB HBA 和一個 2GB HBA 連接到同一伺服器時,使用該演算法可將 8GB HBA 發揮出更大的作用。

length-load-balancing: 與 least-pending 選項類似,是一個可平衡多個路徑上進行中的 I/O 數量的動態負載平衡器。

service-time: 是一個可根據延遲情況來平衡多個路徑上之 I/O 的服務時間導向的負載平衡器。

pg_timeout

指定路徑群組逾時處理。

NONE (內部預設值)

prio_callout

多重路徑 prio_callout 位於 /lib/libmultipath/lib* 中的共享程式庫中。透過使用共享程式庫,callout 會在精靈啟動時載入到記憶體中。

指定要用來決定多重路徑映射之配置的程式和引數。

使用 multipath 指令查詢時,指定的 mpath_prio_* callout 程式會傳回相對於整個多重路徑配置之指定路徑的優先程度。

該指令與 group_by_prio 的 path_grouping_policy 一起使用時,具有相同優先程度的所有路徑都會分到一個多重路徑群組。總優先程度最高的群組成為主動群組。

群組中的所有路徑都失敗時,總優先程度次高的群組成為主動群組。此外,系統可能還會將一條容錯移轉指令 (由硬體處理器決定) 傳送至該目標。

mpath_prio_* 程式也可以是廠商或管理員為指定設定建立的自定程序檔。

指令行中的 %n 會展開至 /dev 目錄中的設備名稱。

%b 會展開至 /dev 目錄中 major:minor 格式的設備編號。

%d 會展開至 /dev/disk/by-id 目錄中的設備 ID。

如果設備為熱插式設備,請使用 %d 旗標取代 %n。這能解決從設備可以使用到 udev 建立設備節點之間所經過的一小段時間的問題。

如果未使用任何 prio_callout 屬性,則所有路徑的優先程度均相等。此為預設選項。

/bin/true: 未使用 group_by_priority 時,請使用此值。

使用 multipath 指令查詢時,prioritizer 程式會產生路徑的優先程度。程式名稱必須以 mpath_prio_ 開頭,並以設備類型或所使用的平衡方式命名。目前的 prioritizer 程式包括以下幾種:

mpath_prio_alua %n: 根據 SCSI-3 ALUA 設定產生路徑優先程度。

mpath_prio_balance_units: 為所有路徑產生相同的優先程度。

mpath_prio_emc %n: 為 EMC 陣列產生路徑優先程度。

mpath_prio_hds_modular %b: 為 Hitachi HDS Modular 儲存陣列產生路徑優先程度。

mpath_prio_hp_sw %n: 為主動/待機模式下的 Compaq/HP 控制器產生路徑優先程度。

mpath_prio_netapp %n: 為 NetApp 陣列產生路徑優先程度。

mpath_prio_random %n: 為每個路徑產生隨機優先程度。

mpath_prio_rdac %n: 為 LSI/Engenio RDAC 控制器產生路徑優先程度。

mpath_prio_tpc %n: 您可以選擇性地使用由廠商或管理員建立的程序檔,從您用來為每個路徑指定要使用的優先程度的檔案中取得優先程度。

mpath_prio_spec.sh %n: 提供使用者建立的程序檔的路徑,該程序檔會根據第二個資料檔案中包含的資訊,為多重路徑產生優先程度。(此路徑與檔名僅做為範例。請指定您自己的程序檔位置。)程序檔可由廠商或管理員建立。程序檔的目標檔案會識別所有多重路徑設備的每個路徑,並為每個路徑指定優先程度。如需取得範例說明,請參閱節 7.6.3, 使用程序檔設定路徑優先程度

rr_min_io

指定需要路由至一個路徑之後再切換至同一個路徑群組中下一個路徑的 I/O 異動的數目,這由 path_selector 設定中指定的演算法決定。

n (>0)︰ 指定一個大於 0 的整數值。

1000︰ 預設值。

rr_weight

指定用於計算路徑權重的方式。

uniform: 預設值。所有路徑都擁有相同的輪替權重。

priorities: 每個路徑的權重由路徑的優先程度乘以 rr_min_io 設定來確定。

設定輪替式負載平衡

所有路徑都處於主動狀態。I/O 設定為在移至序列中的下一個開啟路徑之前需經過秒數的時間或數個 I/O 異動。

設定單一路徑容錯移轉

優先程度最高 (設定值最低) 的單一路徑對流量而言是主動路徑。其他路徑可用於容錯移轉,但只有在發生容錯移轉時才會使用。

將 I/O 路徑分組以使用輪替式負載平衡

具有相同優先程度的多個路徑都歸入主動群組。該群組中的所有路徑都失敗時,設備會容錯移轉至優先程度次高的群組。群組中的所有路徑以輪替式負載平衡方式共享流量負載。

7.6.3 使用程序檔設定路徑優先程度

您可以建立一個與設備對應程式多重路徑 (DM-MPIO) 互動的程序檔,以在 LUN 設定為 prio_callout 設定的資源時,為 LUN 的路徑提供優先程度。

首先,設定文字檔,在其中列出關於每個設備的資訊以及要指定給每個路徑的優先程度值。例如,將檔案命名為 /usr/local/etc/primary-paths。以下列格式為每個路徑輸入一行指令:

host_wwpn target_wwpn scsi_id priority_value

這會為設備中的每個路徑傳回一個優先程度值。請確保變數 FILE_PRIMARY_PATHS 可解析為含有每個設備相應資料 (如主機 wwpn、目標 wwpn、scsi_id 及優先程度值) 的實際檔案。

包含八個路徑的單一 LUN 的 primary-paths 檔案中,每個路徑顯示如下:

0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:0 sdb 3600a0b8000122c6d00000000453174fc 50
0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:1 sdc 3600a0b80000fd6320000000045317563 2
0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:2 sdd 3600a0b8000122c6d0000000345317524 50
0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:3 sde 3600a0b80000fd6320000000245317593 2
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:0 sdi 3600a0b8000122c6d00000000453174fc 5
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:1 sdj 3600a0b80000fd6320000000045317563 51
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:2 sdk 3600a0b8000122c6d0000000345317524 5
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:3 sdl 3600a0b80000fd6320000000245317593 51

若要繼續表 7-5 中提到的範例,請建立名為 /usr/local/sbin/path_prio.sh 的程序檔。您可使用任何路徑和檔名。程序檔會執行下列動作:

  • 在多重路徑中查詢時,從 /usr/local/etc/primary-paths 檔案中查找設備及其路徑。

  • 將檔案中該項目最後一欄中的優先程度值傳回多重路徑。

7.6.4 設定 ALUA (mpath_prio_alua)

mpath_prio_alua(8) 指令可做為 Linux multipath(8) 指令的優先程度註標。該指令會傳回 DM-MPIO 用於將優先程度相同的 SCSI 設備分在同一組的編號。此路徑優先程度工具以 ALUA (非同步邏輯單位存取) 為基礎。

語法

mpath_prio_alua [-d directory] [-h] [-v] [-V] device [device...] 

必備條件

SCSI 設備。

選項

-d directory

指定可在其中找到所列設備節點名稱的 Linux 目錄路徑。預設目錄為 /dev。使用此選項時,請只指定要管理的一或多個設備的設備節點名稱 (如 sda)。

-h

顯示此指令的說明,然後結束。

-v

開啟詳細輸出,以較易理解的形式顯示狀態。輸出包括有關指定設備所處的連接埠群組及其目前狀態的資訊。

-V

顯示此工具的版本號碼,然後結束。

設備 [設備...]

指定要管理的 SCSI 設備 (或多個設備)。該設備必須為支援報告目標連接埠群組 (sg_rtpg(8)) 指令的 SCSI 設備。為設備節點名稱使用下列其中一種格式:

  • 使用完整的 Linux 目錄路徑,如 /dev/sda。請勿與 -d 選項一起使用。

  • 只使用設備節點名稱,如 sda。使用 -d 選項指定目錄路徑。

  • 設備的主要和次要編號以冒號 (:) 分隔,不含空格,如 8:0。這會在 /dev 目錄中建立名稱為 tmpdev-<major>:<minor>-<pid> 格式的暫存設備節點。例如,/dev/tmpdev-8:0-<pid>

傳回值

成功後會傳回值 0 和群組的優先程度值。表 7-6 顯示了 mpath_prio_alua 指令所傳回的優先程度值。

表 7-6 設備對應程式多重路徑的 ALUA 優先程度

優先程度值

描述

50

設備屬於主動且最佳化的群組。

10

設備屬於主動但非最佳化的群組。

1

設備屬於待機群組。

0

所有其他群組。

由於 multipath 指令對每個值的處理方式不同,因此這些值相差比較大。該指令會將群組中路徑的數目乘以群組的優先程度值,然後選取所得結果最高的群組。例如,如果非最佳化的路徑群組有 6 個路徑 (6 x 10 = 60),最佳化路徑群組有一個路徑 (1 x 50 = 50),那麼非最佳化群組的得分最高,因此 multipath 會選擇非最佳化群組。流向設備的流量會以輪替式方式使用該群組中的所有 6 個路徑。

失敗時會傳回指出指令失敗原因的值 (1 到 5)。如需資訊,請參閱 mpath_prio_alua 的線上文件。

7.6.5 報告目標路徑群組

使用 SCSI 報告目標連接埠群組 (sg_rtpg(8)) 指令。如需資訊,請參閱 sg_rtpg(8) 的線上文件。