首页 » 系统相关 » Linux多路经DM multipathd注意事项

Linux多路经DM multipathd注意事项

对于服务器与存储分离的数据库环境中,业务数据存储在外挂存储设备上,常见于之前的oracle RAC等集中式数据库,同样也可以用于达梦或mysql数据库,服务器与存储连接常用的有基于NSF的NAS存储和基于Fabric协议的SAN存储,而企业中对于数据库常使用SAN存储,需要专业硬件如HBA卡和SAN交换机。进一步为了高可用一般是多条路径的方式。而Linux RAC环境可以使用存储厂家的多路径软件,也可以使用DM Multipath软件,或使用ASM 的failgroup特性。

对于multipath环境遇到过几个客户配置了4条链路甚至6条,因为一批链路offline,没有switch链路,导致数据库一样会出现I/O失败现象。这里简单整理几个multipath相关的配置参数。

配置文件 /etc/multipath.conf中default { }有多个参数会影响错误检测和故障转移时间

defaults {
        user_friendly_names yes
        polling_interval 5
        fast_io_fail_tmo 5
        dev_loss_tmo 10
        checker_timeout 15
        max_polling_interval 4
        no_path_retry fail
}
-- 调整参数后 reload multipathd 服务
# service multipathd reload

有多个参数会影响错误检测和故障转移时间

polling_interval       指定两次路径检查之间的时间间隔,以秒为单位,缺省值为5。对于功能正常的路径,polling_interval表示最小轮询间隔,路径检查之间的实际时间最多间隔逐渐增加到max_polling_interval。检测到健康路径后,有效轮询间隔将加倍。在RHEL 5和RHEL 6中,翻倍的上限是指定值的4倍。这意味着在两次成功检查之后,轮询间隔是原始时间的4倍。在RHEL 7中,可以使用multipath.conf选项“max_polling_interval”将最大值设置为您想要的任何值。在这种情况下,默认值也是4 * polling_interval。

例如,polling_interval当前默认设置为5。如果以非常冗长的方式启动multipathd守护进程,很容易观察到,健康路径上的路径检查很快就会变成每20秒一次的模式。如果为polling_interval设置了自定义配置值10,那么检查的间隔最终将降至40秒,依此类推。这背后的理由是,确实没有理由如此频繁地检查未失败的路径。路径故障应该是非常罕见的.

max_polling_interval 指定两次路径检查之间的最大时间间隔,以秒为单位。默认值是 4 * polling_interval.

fast_io_fail_tmo       SCSI层在一个FC远程端口上检测到问题后,在对该远程端口上的设备进行I/O失败之前等待的秒数。该值必须小于dev_loss_tmo的值。将此设置为off将禁用超时。缺省值为5。 fast_io_fail_tmo选项覆盖底层路径设备的recovery_tmo和replacement_timeout选项的值。影响处于阻塞状态时io排队和保持的时间

dev_loss_tmo         在一个FC远程端口上检测到问题后,SCSI层在从系统中删除该端口之前等待的秒数。将其设置为无穷大将会将其设置为2147483647秒,或68年。默认值由操作系统决定。影响扩展链接超时,在驱动程序放弃等待端口返回之前,在链路断开事件发生后的几秒钟内保持in-flight I/O。默认值是30-35秒,因此in-flight的I/O可以在被终止之前保持几秒钟。超时过期后,报告将处于离线(down)状态。

checker_timeout      用于发出带有显式超时的SCSI命令的优先级排序器和路径检查器的超时,以秒为单位。“sys/block/sd<x>/device/timeout”目录中包含默认值。

no_path_retry  指定在禁用排队之前重试的次数,或者立即失败(没有排队)的失败次数,以及从不停止排队的排队次数。默认配置项为fail。然而,devices{}节将否决这一点。

检查方法

# fdisk -l
# ls -la /dev/disk/by-path/
# lsscsi -i
# multipath -ll

# for f in /sys/class/fc_remote_ports/rport-*/fast_io_fail_tmo; do d=$(dirname $f); echo $(basename $d):$(cat $d/node_name):$(cat $f); done
rport-8:0-0:0x50014380113622b0:off
rport-8:0-1:0x50014380113622b0:off
rport-8:0-2:0x50014380113622b0:off
rport-8:0-3:0x50014380113622b0:off

# for f in /sys/class/fc_remote_ports/rport-*/dev_loss_tmo; do d=$(dirname $f); echo $(basename $d):$(cat $d/node_name):$(cat $f); done
rport-8:0-0:0x50014380113622b0:30
rport-8:0-1:0x50014380113622b0:30
rport-8:0-2:0x50014380113622b0:30
rport-8:0-3:0x50014380113622b0:30

References
https://access.redhat.com/solutions/137073
https://access.redhat.com/solutions/16141

打赏

对不起,这篇文章暂时关闭评论。