lpfc + multipath + ubuntu - 路径不断切换

lpfc + multipath + ubuntu - 路径不断切换

我在使用 Emulex (lpfc) 配置多路径时遇到问题。虽然我没有检测到数据损坏,但 SAN 管理员有一个工具显示路径每 20 秒左右切换一次。以下是详细信息:

# multipath -l
san01 (3600a0b80002a042200002cb44a9a29ca) dm-2 IBM     ,1815      FASt
[size=100G][features=0][hwhandler=0]
\_ round-robin 0 [prio=0][active]
 \_ 3:0:0:0 sdb 8:16  [active][undef]
\_ round-robin 0 [prio=0][enabled]
 \_ 4:0:0:0 sdc 8:32  [active][undef]

多条路径连接到同一个LUN。

# /lib/udev/scsi_id -g -u -d /dev/sdb
3600a0b80002a042200002cb44a9a29ca
# /lib/udev/scsi_id -g -u -d /dev/sdc
3600a0b80002a042200002cb44a9a29ca

这是 /etc/multipath.conf

defaults {
        udev_dir                /dev
        polling_interval        5
        selector                "round-robin 0"
        path_grouping_policy    failover
        getuid_callout          "/lib/udev/scsi_id -g -u -d /dev/%n"
        path_checker            readsector
        failback                immediate
        user_friendly_names     yes
}
multipaths {
        multipath {
                wwid    3600a0b80002a042200002cb44a9a29ca
                alias   san01
        }
}

fdisk -l

Disk /dev/sdb: 107.3 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x61b4bf95

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       13054   104856223+  83  Linux

Disk /dev/sdc: 107.3 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x61b4bf95

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1       13054   104856223+  83  Linux

我增加了 lpfc 的详细程度,现在我在 dmesg 上得到了以下内容:

[ 2519.241119] lpfc 0000:07:00.0: 1:0336 Rsp Ring 0 error: IOCB Data: xff000018 x37a120c0 x0 x0 xeb x0 x1b108db xa29b16
[ 2519.241124] lpfc 0000:07:00.0: 1:(0):0729 FCP cmd x12 failed <0/0> status: x1 result: xeb Data: x1b1 x8db
[ 2519.241127] lpfc 0000:07:00.0: 1:(0):0730 FCP command x12 failed: x0 SNS x0 x0 Data: x8 xeb x0 x0 x0
[ 2519.241130] lpfc 0000:07:00.0: 1:(0):0716 FCP Read Underrun, expected 254, residual 235 Data: xeb x12 x0
[ 2519.241275] lpfc 0000:07:00.0: 1:0336 Rsp Ring 0 error: IOCB Data: xff000018 x37a14c48 x0 x0 xd2 x0 x1b208e6 xa29b16
[ 2519.241279] lpfc 0000:07:00.0: 1:(0):0729 FCP cmd x12 failed <0/0> status: x1 result: xd2 Data: x1b2 x8e6
[ 2519.241283] lpfc 0000:07:00.0: 1:(0):0730 FCP command x12 failed: x0 SNS x0 x0 Data: x8 xd2 x0 x0 x0
[ 2519.241286] lpfc 0000:07:00.0: 1:(0):0716 FCP Read Underrun, expected 254, residual 210 Data: xd2 x12 x0

有人能看出这个配置有什么问题吗?谢谢。


根据 janneb 的评论,我将 multipath.conf 中的配置更改为:

defaults {
        udev_dir                /dev
        polling_interval        5
        selector                "round-robin 0"
        path_grouping_policy    multibus
        getuid_callout          "/lib/udev/scsi_id -g -u -d /dev/%n"
        failback                immediate
        user_friendly_names     yes
}

现在给出:

san01 (3600a0b80002a042200002cb44a9a29ca) dm-2 IBM     ,1815      FASt
[size=100G][features=0][hwhandler=0]
\_ round-robin 0 [prio=2][active]
 \_ 3:0:0:0 sdb 8:16  [active][ready]
 \_ 4:0:0:0 sdc 8:32  [active][ready]

但过了一会儿它仍然处于 [active][undef] 状态,然后又回到 [ready] 状态。

哦,我刚刚注意到一些事情,当我运行“multipath -l”时,我得到了 [undef],但是如果我运行“multipath -ll”我得到了 [ready]。

-l     show the current multipath topology from information fetched in sysfs and the device mapper
-ll    show the current multipath topology from all available information (sysfs, the device mapper, path checkers ...)

设置错误吗?我该如何调试?谢谢。


感谢 janneb 和 zerolagtime 的帮助。

这就是事情变得复杂的原因,我想我不需要解释这一切,而我目前倾向于硬件设置混合。

实际上有两台服务器使用 FC 连接到同一个 LUN。在操作系统级别,只有一台服务器可以访问文件系统(尽管同一 LUN 暴露给两台服务器),因为它是 ext3(不是集群文件系统)。如果服务器 1 发生故障,服务器 2 将启动(linux-ha)并挂载文件系统。

服务器 1 (多路径 -ll):

san01 (3600a0b80002a042200002cb44a9a29ca) dm-2 IBM     ,1815      FASt
[size=100G][features=0][hwhandler=0]
\_ round-robin 0 [prio=2][active]
 \_ 3:0:0:0 sdb 8:16  [active][ready]
 \_ 4:0:0:0 sdc 8:32  [active][ready]

服务器 2 (多路径 -ll):

san01 (3600a0b80002a042200002cb44a9a29ca) dm-2 IBM     ,1815      FASt
[size=100G][features=0][hwhandler=0]
\_ round-robin 0 [prio=2][active]
 \_ 3:0:0:0 sdb 8:16  [active][ready]
 \_ 4:0:0:0 sdc 8:32  [active][ready

服务器 1 端口名称:

# cat /sys/class/fc_host/host3/port_name 
0x10000000c96c5fdb
# cat /sys/class/fc_host/host4/port_name 
0x10000000c96c5df5
root@web-db-1:~# 

服务器2端口名称:

#cat /sys/class/fc_host/host3/port_name 
0x10000000c97b0917
# cat /sys/class/fc_host/host4/port_name 
0x10000000c980a2d8

这个设置有错吗?LUN 暴露给两台服务器的方式有错吗?我在想硬件连接不正确,可能是什么问题?server1 path_checker 会干扰 server2 的操作吗?谢谢。

答案1

您的配置看起来很奇怪;通常您会有 4 条路径通向同一设备(即每个多路径设备有 4 个 /dev/sdX 设备)。阵列控制器通常能够通知主机每条路径的优先级,因此您有 2 条优先级较高的路径和 2 条优先级较低的路径。然后 dm-multipath 将 IO 多路复用到 2 条高优先级路径上(“selector”选项默认为 rr_min_io=100)。现在,您有 2 个优先级相同的路径组,因此 dm-multipath 可能会将 IO 分散到它们两个上,这可能不是您的 SAN 管理员希望您做的。另一个奇怪的事情是设备标记为“undef”而不是“ready”。还有一件奇怪的事情是您的路径编号看起来很奇怪(一切都沿着相同的路径?)。您真的确定一切都正确连接在一起、正确分区等吗?

“multipath -ll”的典型输出应如下所示

sanarch3 (3600508b4000683de0000c00000a20000) dm-6 HP,HSV200
[大小=2.0T][特征=1 个queue_if_no_path][硬件处理程序=0][读写]
\_ 循环 0 [优先级=100][活跃]
 \_ 0:0:0:5 sdc 8:32 [活动][就绪]
 \_ 1:0:0:5 sdk 8:160 [活动][就绪]
\_ 循环 0 [优先级=20][已启用]
 \_ 0:0:1:5 sdg 8:96 [活动][准备就绪]
 \_ 1:0:1:5 sdo 8:224 [活动][就绪]

您可以看到 4 条路径分为 2 个优先级组,并且 IO 通过设备 sdc 和 sdk 完成,而 sdg 和 sdo 处于空闲状态并且仅在发生故障时使用。

编辑因此,您之所以会看到 4 条路径,是因为您有 2 个 HBA 端口,并且阵列有 2 个冗余控制器。然后,您有 2 个冗余网络,最后一个交换机层提供跨网络连接。因此,两个 HBA 都可以看到两个控制器,因此每个 LUN 有 4 条路径。您可以在上面的 SCSI ID 编号示例中看到这一点,其格式为 [主机控制器 ID]:[通道 ID]:[目标控制器 ID]:[LUN ID]。然后,您可以在上面看到,活动路径都在控制器 #0 上,因为在这种情况下,控制器 #0 恰好“拥有”该 LUN;可以通过另一个控制器进行 IO,但性能会受到影响,因为另一个控制器(取决于控制器实现)需要将 IO 转发到拥有该 LUN 的控制器。因此,控制器报告指向控制器 #0 的路径具有更高的优先级。

因此,从您的问题可以看出,根本没有通往其他控制器的路径。而且,如果您没有冗余控制器和网络,为什么还要费心使用多路径呢?

答案2

IBM SAN 的文档中通常有一个定义良好的 multipath.conf 示例,你不是从那里开始的吗?我将保留该部分给读者一个练习。此外,您的 SAN 管理员还欠您一点支持。一些要点

  • 像你所描述的路径振荡通常是由于路径检查器配置错误造成的,在你的两次迭代中,你从读取扇区0没有任何,可能采用该品牌和型号的多路径默认值,很可能图尔(测试单元准备就绪)。

  • 没有定义优先级检查器,没有优先级检查器,没有优先级。

  • 可能需要硬件处理程序,该硬件处理程序在文档中有明确定义。

我发现的最佳 IBM 1815 战争故事这是, 概括:

  • 安装 rdac 驱动程序,modprobe scsi_dh_rdac并将其添加到你的 initrd
  • 使用以下 multipath.conf:

blacklist {
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z]"
    devnode "^sda"
    device {
        vendor "Maxtor*"
        product "OneTouch*"
    }
}
blacklist_exceptions {
    device {
            vendor  "IBM"
            product "1815*"
    }
}
defaults {
    failback                immediate
    no_path_retry           queue
    user_friendly_names     no
    path_grouping_policy    failover
}
devices {
    device {
            vendor                  "IBM"
            product                 "1815*"
            failback                manual
            hardware_handler        "1 rdac"
            path_checker            rdac
            prio_callout            "/sbin/mpath_prio_rdac /dev/%n"
    }
}

让我们知道结果如何。祝你好运!

答案3

首先,您定义多总线,您确定您的存储支持这一点吗?询问您的 SAN 管理员您的存储是否是真正的主动/主动存储,主动被动存储不允许一直从控制器切换,这会给存储带来成本,也会给您的客户端带来问题。在第一个配置中,它未在配置中定义,这意味着您采用多路径中定义的默认配置(检查 /usr/share/doc/mulitpath.conf.anotted)或查看 multipathd -k show config 的输出以获得更好的视图。(无论如何,请根据您的存储规格检查默认配置,因为它们并不总是最好的:我在使用 HDS 和 rhel 时遇到了一些问题)

第二件事,您说 FS 上没有完整性问题,您确定 FS 正在使用多路径设备吗?如果我假设您使用 LVM,您是否检查过 lvm.conf 中的过滤器设置?如果设置不当,lvm 将直接使用该设备而不是使用 MPIO,这对于主动/被动存储来说可能是一个更大的问题,因为 lvm 将强制使用可能不是首选的控制器....我希望它能有所帮助。

相关内容