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
对不起,这篇文章暂时关闭评论。