dm-switch

设备映射器 switch 目标创建一个设备,该设备支持跨固定路径集进行任意固定大小的 I/O 区域映射。可以通过向目标发送消息来动态切换任何特定区域使用的路径。

当有大量固定大小的地址区域,但没有简单的模式可以实现映射的紧凑表示(如 dm-stripe)时,它可以有效地将 I/O 映射到基础块设备。

背景

戴尔 EqualLogic 和其他一些 iSCSI 存储阵列使用分布式无框架架构。在这种架构中,存储组由多个不同的存储阵列(“成员”)组成,每个阵列都具有独立的控制器、磁盘存储和网络适配器。创建 LUN 时,它会分布在多个成员之间。这种分布的细节对连接到此存储系统的发起者是隐藏的。无论使用多少成员,存储组都会公开一个目标发现门户。创建 iSCSI 会话时,每个会话都连接到单个成员上的一个 eth 端口。可以从任何 iSCSI 会话发送到 LUN 的数据,如果被访问的块存储在另一个成员上,则 I/O 将根据需要转发。这种转发对于发起者是不可见的。存储布局也是动态的,存储在磁盘上的块可能会根据需要从一个成员移动到另一个成员,以平衡负载。

这种架构简化了存储组和发起者的管理和配置。在多路径配置中,可以设置多个 iSCSI 会话以利用主机和目标上的多个网络接口来利用增加的网络带宽。发起者可以使用简单的轮询算法在所有路径上发送 I/O,并让存储阵列成员根据需要转发它,但是直接将数据发送到正确的成员会带来性能优势。

设备映射器表已经允许您将设备的不同区域映射到不同的目标。但是,在这种架构中,LUN 的分布地址区域大小约为 10MB,这意味着生成的表可能具有超过一百万个条目并消耗过多的内存。

使用此设备映射器 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