本文讨论场景基于以下条件:
首先规定一下后面用到的例子中设备名称
首先在 /etc/multipath.conf 文件中配置设备信息。
如下例:
device {
# 3par configuration
vendor "3PARdata"
product "VV"
path_grouping_policy group_by_prio
path_selector "round-robin 0"
path_checker tur
features "0"
hardware_handler "1 alua"
prio alua
failback immediate
rr_weight uniform
no_path_retry 18
rr_min_io_rq 1
detect_prio yes
fast_io_fail_tmo 10
dev_loss_tmo 14
}
第二段设备配置信息包括wwid以及alias假名,如下例:
multipaths {
multipath {
# storage: sto-3par-xx-xx, LUN: 01
wwid 36000342345466342343522
alias san_lun_001
}
}
for i in $(ls /sys/class/scsi_host/); do echo "- - -"> /sys/class/scsi_host/$i/scan; done #发现新的scsi设备
multipath -F; multipath #加载multipath配置
磁盘容量改变后,在multipath刷新SAN硬盘信息
multipath -ll /dev/mapper/dev01_OLD
for i in $(ls /sys/class/scsi_device/); do echo 1> /sys/class/scsi_device/$i/device/rescan; done #扫描所有LUN
multipathd resize map /dev/mapper/dev01_OLD
pvresize /dev/mapper/dev01_OLD
通过pvmove命令,替换老的LUN,建议明确之定lv,可以实现热迁移:
pvmove -n LV01 /dev/mapper/dev01_OLD /dev/mapper/dev01_NEW
迁移前后可以通过以下命令进行查看lv与vg的关系
lvs -a -o +devices
pvmove命令非常可靠,如果中途暂停 pvmove -abort ,可以重新通过上面的pvmove命令继续未完成的任务。
vgreduce VG01 /dev/mapper/dev01_OLD
pvremove /dev/mapper/dev01_OLD
集群场景下,在主节点(node)执行迁移操作(保证主节点的vg是active状态并已挂载),其它节点在主节点操作其前必须将vg置于inactive状态,防止迁移过程中其它节点对文件系统的读写操作。
主节点迁移前,在从节点上
vgchange -a n VG01
主节点迁移完成后
pvscan && vgscan & lvscan
重新激活并刷新其它节点 mapper设备
vgchange -a y VG01
由于下一步会执行dmsetup remove, 设备将从multipath中删除,所以应当通过暂存路径号来保护scsi路径(dmsetup删除后将无法查看scsi路径号)。
multipath -ll /dev/mapper/dev01_OLD | grep : | expand | tr -s ' ' | cut -d ' ' -f 3 | sed 's/:/ /g'>> /tmp/san_path
从dmsetup 中删除设备
dmsetup remove /dev/mapper/dev01_OLD #磁盘和分区都要删掉
如果在删除scsi路径前不删除dmsetup,主机会尝试访问这些已经不存在的设备,从而导致io-wait激增问题。
删除 scsi路径(scsi-path)
这里就需要用到上面暂存的 tmp/san_path文件,用来获取scsi路径号。
while read F; do echo "scsi remove-sigle-device $F"> /proc/scsi/scsi; done </tmp/san_path
完成此步骤以后可以在san交换机上作Unmapping.
注意:Unmapping前千万不可rescan。否则设备会被重新发现。