就高可用性而言,从单个节点上配置共享存储的最好方法是什么 ?
解决方法:

客户的服务器从本地硬盘启动,服务需要访问共享存储卷,这个卷在同一时刻只能由单个节点访问,而且服务器有多个到存储的冗余路径,客户不知道如何配置RHEL访问阵列输出的卷,而且客户需要安装和设置HA集群。

配置实现该目的有多个方法,这里将使用最适用的方法,但是需要先明确以下内容:

   * 这里假设客户对共享存储以及相关组件和技术已经有基本的概念。
   * 阵列在启动时通过初始ramdisk会自动激活并被加载,在RHEL3U3中不支持,在以后的版本中会支持。
   * 在启动时在多个节点共享的多路径存储上使用LVM有一些已经知道的问题,如果节点只有一条路径连接到存储,那不会有问题的。
   * 如果在本地磁盘和共享存储上都使用LVM,可能会遇到一些问题,这个问题是和内核加载顺序有关的。最好是先加载HBA卡和多路径驱动,然后加载LVM驱动。
   * 你需要手工编写服务脚本来加载和卸载共享存储磁盘,下面会有一个例子。
   * 如果这里使用了多个,冗余的交换机和控制器,在控制器出现故障时,系统失效切换可能会出现问题。
   * 在进行其他配置以前,建议彻底测试共享存储配置。
   * 由于硬件的多样性,这里举例的配置不一定适合你的情况,所以您应该联系硬件厂商资讯。

假设你的HBA卡是X-AMPLE-1000,内核模块为xample1000,存储上的卷显示为/dev/sda, /dev/sdb, /dev/sdc, 和 /dev/sdd。

配置步骤:

1. 验证支持多路径的md和lvm没有被加载,这些模块名字为multipath, LVM-mod,使用lsmod可以列出目前内核加载的所有模块,可以使用rmmod来删除某个模块。 2. 为HBA加载驱动,假设这里在/etc/modules.conf已经做了配置,可以使用modprobe xample1000载入。 3. 使用devlabel工具来添加你的设备:devlabel add -d <device> -s /dev/exampleName --multipath ,这里<device>是设备名,例如:


     # rmmod LVM-mod
     # rmmod multipath
     # modprobe xample1000
     # devlabel add -d /dev/sda /dev/exampleName --multipath
     SYMLINK: /dev/exampleName_multipath0 -> /dev/sda
     Added /dev/exampleName_multipath0 to /etc/sysconfig/devlabel
     # devlabel add -d /dev/sdb /dev/exampleName --multipath
     SYMLINK: /dev/exampleName_multipath1 -> /dev/sdb
     Added /dev/exampleName_multipath1 to /etc/sysconfig/devlabel
     # devlabel add -d /dev/sdc /dev/exampleName --multipath
     SYMLINK: /dev/exampleName_multipath2 -> /dev/sdc
     Added /dev/exampleName_multipath2 to /etc/sysconfig/devlabel
     # devlabel add -d /dev/sdc /dev/exampleName --multipath
     SYMLINK: /dev/exampleName_multipath3 -> /dev/sdd
     Added /dev/exampleName_multipath3 to /etc/sysconfig/devlabel

4. 创建,激活和启动md的多路径设备:

         mdadm --create /dev/md0 --level=multipath --raid-devices=4
            /dev/exampleName_multipath0 /dev/exampleName_multipath1
            /dev/exampleName_multipath2 /dev/exampleName_multipath3

5. 加载LVM模块,并使用vgscan扫描所有设备。 6. 把md0设备转换为物理卷:pvcreate /dev/md0 7. 创建卷组:vgcreate vg0 /dev/md0 command. 8. 创建逻辑卷lvcreate -L <volume size> -n lv0 vg0 9. 创建文件系统:

         mke2fs -j /dev/vg0/lv0

10. 最后,加载逻辑卷: mount /dev/vg0/lv0 /mnt/test

     # mdadm --create /dev/md0 --level=multipath --raid-devices=4 \
     > /dev/exampleName_multipath0 \
     > /dev/exampleName_multipath1 \
     > /dev/exampleName_multipath2 \
     > /dev/exampleName_multipath3
     mdadm: array /dev/md0 started.
     # vgscan
     vgscan -- reading all physical volumes (this may take a while...)
     vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully created
     vgscan -- WARNING: This program does not do a VGDA backup of your volume group
     # pvcreate /dev/md0
     pvcreate -- physical volume "/dev/md0" successfully created
     # vgcreate vg0 /dev/md0
     vgcreate -- INFO: using default physical extent size 32 MB
     vgcreate -- INFO: maximum logical volume size is 2 Terabyte
     vgcreate -- doing automatic backup of volume group "vg0"
     vgcreate -- volume group "vg0" successfully created and activated
     # lvcreate -L 1G -n lv0 vg0
     lvcreate -- doing automatic backup of "vg0"
     lvcreate -- logical volume "/dev/vg0/lv0" successfully created
     # mke2fs -j /dev/vg0/lv0
     mke2fs 1.32 (09-Nov-2002)
     Filesystem label=
     OS type: Linux
     Block size=4096 (log=2)
     Fragment size=4096 (log=2)
     131072 inodes, 262144 blocks
     13107 blocks (5.00%) reserved for the super user
     First data block=0
     8 block groups
     32768 blocks per group, 32768 fragments per group
     16384 inodes per group
     Superblock backups stored on blocks:
              32768, 98304, 163840, 229376
     Writing inode tables: done
     Creating journal (8192 blocks): done
     Writing superblocks and filesystem accounting information: done
     This filesystem will be automatically checked every 38 mounts or
     180 days, whichever comes first.  Use tune2fs -c or -i to override.
     # mount /dev/vg0/lv0 /mnt/test
     # touch /mnt/test/test_file
     # ls /mnt/test
     test_file

需要注意的是:为了让系统在启动时自动加载文件系统,建议创建一个简单的sysvinit脚本,来激活和使用多路径设备,可以使用mdadm --assemble <md device> <member devices>来实现,这将创建/dev/md?设备,然后加载LVM模块,运行vgscan,然后加载文件系统:


# mdadm --assemble /dev/md0 \
> /dev/sandisk_multipath0 \
> /dev/sandisk_multipath1 \
> /dev/sandisk_multipath2 \
> /dev/sandisk_multipath3
mdadm: /dev/md0 has been started with 1 drive and 3 spares.

# modprobe lvm-mod
# vgscan
vgscan -- reading all physical volumes (this may take a while...)
vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully created
vgscan -- WARNING: This program does not do a VGDA backup of your volume group

# mount /dev/vg0/lv0 /mnt/whereever

正如我们前面提到的,如果系统也存放在LVM中,有时候会出现问题,因为vgscan在扫描物理设备时,会在发现md之前就报错退出。如果是这种情况,用户可能不能对系统和SAN文件系统同时使用LVM,这个问题在RHEL3U3以后版本中可能会被修复。

示例sysvinit脚本:


#!/bin/bash
#   
# chkconfig: 235 70 30
#    activate in runlevels 2, 3, and 5
#    start with a priority of 70 and stop with 30
# description: Start up multipath SAN device
# processname: sanstart

# source function library
. /etc/init.d/functions 

RETVAL=0
start() {

echo -n $"Starting multipath SAN devices: "

 mdadm --assemble /dev/md0 
   /dev/sandisk_multipath0 \
   /dev/sandisk_multipath1 \
   /dev/sandisk_multipath2 \
   /dev/sandisk_multipath3
 let "RETVAL += $?"
 modprobe lvm-mod
 let "RETVAL += $?"  
 vgchange -ay
 let "RETVAL += $?"  
 vgscan
 let "RETVAL += $?"
 mount /dev/vg0/lv0 /mnt/whereever
 let "RETVAL += $?"
 return $RETVAL
}
stop() {

echo -n $"Shutting down multipath SAN devices: "

 umount /mnt/whereever
 let "RETVAL += $?"
 vgchange -an
 rmmod lvm-mod
 let "RETVAL += $?"  
 mdadm --stop /dev/md0
 let "RETVAL += $?"
 return $RETVAL  
}
case "$1" in
 start)

start ;;

 stop)

stop ;;

 restart|reload)

stop start RETVAL=$? ;;

 *)

echo $"Usage: $0 {start|stop|restart}" exit 1

esac
exit $RETVAL