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