dm-switch

裝置對映器 switch 目標建立一個裝置,該裝置支援將固定大小的 I/O 區域任意對映到一組固定路徑。透過向目標傳送訊息,可以動態切換任何特定區域使用的路徑。

當存在大量固定大小的地址區域,但沒有簡單的模式可以實現如 dm-stripe 那樣緊湊的對映表示時,它能高效地將 I/O 對映到基礎塊裝置。

背景

Dell EqualLogic 和一些其他 iSCSI 儲存陣列採用分散式無框架架構。在這種架構中,儲存組由多個獨立的儲存陣列(“成員”)組成,每個成員都有獨立的控制器、磁碟儲存和網路介面卡。當建立 LUN 時,它會分佈在多個成員上。這種分佈的細節對連線到此儲存系統的啟動器是隱藏的。無論使用多少成員,儲存組都暴露一個單一的目標發現門戶。當建立 iSCSI 會話時,每個會話都連線到單個成員上的乙太網埠。資料可以從任何 iSCSI 會話傳送到 LUN,如果所訪問的塊儲存在另一個成員上,I/O 將按需轉發。這種轉發對啟動器是不可見的。儲存佈局也是動態的,磁碟上儲存的塊可能會根據需要從一個成員移動到另一個成員以平衡負載。

這種架構簡化了儲存組和啟動器的管理和配置。在多路徑配置中,可以在主機和目標上設定多個 iSCSI 會話以使用多個網路介面,從而利用增加的網路頻寬。啟動器可以使用簡單的輪詢演算法在所有路徑上傳送 I/O,並讓儲存陣列成員按需轉發,但直接將資料傳送到正確的成員具有效能優勢。

裝置對映器表已經允許您將裝置的_不同_區域對映到不同的目標。然而,在這種架構中,LUN 以幾十兆位元組量級的地址區域大小進行分佈,這意味著生成的表可能包含超過一百萬個條目,並消耗過多的記憶體。

使用此裝置對映器 switch 目標,我們現在可以構建一個兩層裝置層次結構

上層 - 確定 I/O 應傳送到哪個陣列成員。下層 - 在通往特定成員的路徑之間進行負載均衡。

下層由每個成員的單個 dm 多路徑裝置組成。每個多路徑裝置都包含一組直接通往陣列成員的路徑,位於一個優先順序組中,並利用現有路徑選擇器在這些路徑之間進行負載均衡。我們還構建了一個非首選優先順序組,其中包含通往其他陣列成員的路徑,用於故障轉移。

上層由一個 dm-switch 裝置組成。該裝置使用點陣圖查詢 I/O 的位置,並選擇適當的下層裝置來路由 I/O。透過使用點陣圖,我們可以在 16 個成員組中的每個地址範圍使用 4 位(這對我們來說非常大)。這比 dm 表 B 樹所能實現的表示方式要密集得多。

構造引數

<num_paths> <region_size> <num_optional_args> [<optional_args>...] [<dev_path> <offset>]+
<num_paths>

用於分發 I/O 的路徑數量。

<region_size>

一個區域中 512 位元組扇區的數量。每個區域都可以重定向到任何可用路徑。

<num_optional_args>

可選引數的數量。目前不支援可選引數,因此此值必須為零。

<dev_path>

表示裝置特定路徑的塊裝置。

<offset>

特定 <dev_path> 上資料起始的偏移量(以 512 位元組扇區為單位)。當請求轉發到特定路徑時,此數字將新增到扇區號中。通常為零。

訊息

set_region_mappings <index>:<path_nr> [<index>]:<path_nr> [<index>]:<path_nr>...

透過指定哪些區域重定向到哪些路徑來修改區域表。

<index>

區域編號(區域大小在構造引數中指定)。如果省略索引,則使用下一個區域(前一個索引 + 1)。以十六進位制表示(不帶任何字首,例如 0x)。

<path_nr>

路徑編號,範圍為 0 ... (<num_paths> - 1)。以十六進位制表示(不帶任何字首,例如 0x)。

R<n>,<m>

此引數允許快速載入重複模式。<n> 和 <m> 是十六進位制數字。最後 <n> 個對映將在接下來的 <m> 個槽位中重複。

狀態

未報告狀態行。

示例

假設您有大小相同的卷 vg1/switch0、vg1/switch1 和 vg1/switch2。

建立一個 64kB 區域大小的 switch 裝置

dmsetup create switch --table "0 `blockdev --getsz /dev/vg1/switch0`
    switch 3 128 0 /dev/vg1/switch0 0 /dev/vg1/switch1 0 /dev/vg1/switch2 0"

設定前 7 個條目的對映,使其指向裝置 switch0、switch1、switch2、switch0、switch1、switch2、switch1

dmsetup message switch 0 set_region_mappings 0:0 :1 :2 :0 :1 :2 :1

設定重複對映。此命令

dmsetup message switch 0 set_region_mappings 1000:1 :2 R2,10

等同於

dmsetup message switch 0 set_region_mappings 1000:1 :2 :1 :2 :1 :2 :1 :2 \
    :1 :2 :1 :2 :1 :2 :1 :2 :1 :2