iSCSI 多路径实现 KVM 高可用
本文我们将以 Linux 平台为例,分别使用两台 Linux 主机来运行 iSCSI 目标和 iSCSI 启动器,然后在其中一台运行 iSCSI 启动器的主机上运行 KVM 虚拟机,两台主机之间存在多个网络连接,以此来实现提高 KVM 虚拟机的可用性。
回页首
配置 iSCSI(target 和 initiator)
iSCSI (Internet Small Computer System Interface), 即 Internet 小型计算机系统接口,它是一种基于 TCP/IP 的协议。通过它可以在 IP 网络传送 SCSI 命令和数据,实现建立和管理网络存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(SAN)。
iSCSI 协议定义了在 TCP/IP 网络发送、接收数据块级别的存储数据的规则和方法。发送端将 SCSI 命令和数据封装到 TCP/IP 包中通过网络转发,接收端收到 TCP/IP 包之后,将其还原为 SCSI 命令和数据并执行,完成之后将返回的 SCSI 命令和数据再封装到 TCP/IP 包中再传送回发送端。而整个过程在用户看来,使用远端的存储设备就如同访问本地 SCSI 设备一样简单。
其流程如下图:
iSCSI target, 即 iSCSI 目标,它是 iSCSI 网络的服务器组件,通常是一个存储设备,用于包含所需的数据并回应来自 iSCSI 启动器的请求。例如 IBM Storwize V7000 支持 iSCSI 外接主机通道,那么它就是个 iSCSI 目标。
iSCSI initiator, 即 iSCSI 启动器,从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(iSCSI 目标)。需要注意的是,iSCSI 启动器可以基于硬件实现,比如 iSCSI HBA 卡;同时它也可以基于软件实现,而软件 iSCSI 启动器适用于大部分主流操作系统平台。
前期环境准备情况如下:我们现有两台 Linux 主机,一台主机名为 neptune,将用来作为 iSCSI 目标;另台主机名为 uranus,将作为 iSCSI 启动器。它们安装的发行版本都为 Redhat 5.5,具体操作系统版本信息如下:
[root@neptune ~]# lsb_release -a LSB Version::core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64: graphics-3.1-ia32:graphics-3.1-noarch Distributor ID: RedHatEnterpriseServer Description: Red Hat Enterprise Linux Server release 5.5 (Tikanga) Release: 5.5 Codename: Tikanga [root@uranus ~]# lsb_release -a LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch: graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch Distributor ID: RedHatEnterpriseServer Description: Red Hat Enterprise Linux Server release 5.5 (Tikanga) Release: 5.5 Codename: Tikanga |
在 neptune 主机上安装 iSCSI 目标,其具体版本号为 scsi-target-utils-0.0-6.20091205snap.el5_4.1。
[root@neptune ~]# yum install scsi-target-utils
配置主机上的本地磁盘 sdb 为存储设备,需要注意的是此处直接使用 sdb 裸设备,在这之前并不需要对其进行格式化:
[root@neptune tgt]# vi /etc/tgt/targets.conf <target iqn.2012-09.com.ibm:neptune.target> backing-store /dev/sdb # Becomes LUN 1 </target> |
启动 iSCSI 目标服务:
[root@neptune tgt]# /etc/init.d/tgtd start Starting SCSI target daemon: Starting target framework daemon |
在 uranus 主机上安装 iSCSI 启动器,其具体版本号为 iscsi-initiator-utils-6.2.0.871-0.16.el5。
[root@uranus ~]# yum install iscsi-initiator-utils |
启动 iSCSI 启动器服务:
[root@uranus ~]# /etc/init.d/iscsi start iscsid (pid 6112) is running... [ OK ] [root@uranus ~]# /etc/init.d/iscsid start Starting iSCSI daemon: [ OK ] [ OK ] |
在配置使用 iSCSI 目标和启动器之前,我们先来了解下 iscsiadm 命令。其 iscsiadm 是基于命令行的 iSCSI 管理工具,提供了对 iSCSI 目标节点、会话、连接以及发现记录的操作。
其常用的参数有:
iscsiadm -m, 同 --mode, 其选项有 discovery, node, fw(启动值), host, iface(iSCSI 接口)和 session。 -I,同 --interface, 表示接口。 -o, 同 --op, 可实现对数据库的操作,其选项有 new, delete, update 和 show。 -n, 同 --name, 指定其数据记录里的名字。 -t, 同 --type, 其选项有 sendtargets(st), fw 和 isns, 仅在 -m 模式为 discovery 时有效。 -p, 同 --portal, 指定其目标主机的 IP 地址和端口,默认端口为 3260。 -L, 同 --loginall,其选项有 all,manual 和 automatic,指定其登录会话时的类型。 -T, 同 --targetname,表示其目标名字。 -v, 同 --value,通常在 --op=update 时指定其值。 |
更多详细参数的说明可查看 /usr/share/doc/iscsi-initiator-utils-6.2.0.871/README, 或者通过命令 man iscsiadm。
在 uranus 主机上创建 iSCSI 多路径接口:
[root@uranus ~]# iscsiadm -m iface -I ibr0 --op=new New interface ibr0 added [root@uranus ~]# iscsiadm -m iface -I ieth1 --op=new New interface ieth1 added |
更新刚创建多路径接口的配置,使它们指向主机真实的网络接口:
[root@uranus ~]# iscsiadm -m iface -I ibr0 --op=update -n iface.net_ifacename -v br0 ibr0 updated. [root@uranus ~]# iscsiadm -m iface -I ieth1 --op=update -n iface.net_ifacename -v eth1 ieth1 updated. |
查看接口配置文件,确认其使用正确的网络适配器:
[root@uranus ~]# cat /var/lib/iscsi/ifaces/ibr0 # BEGIN RECORD 2.0-871 iface.iscsi_ifacename = ibr0 iface.net_ifacename = br0 iface.transport_name = tcp # END RECORD [root@uranus ~]# cat /var/lib/iscsi/ifaces/ieth1 # BEGIN RECORD 2.0-871 iface.iscsi_ifacename = ieth1 iface.net_ifacename = eth1 iface.transport_name = tcp # END RECORD |
查看创建的 iSCSI 多路径接口的状态:
[root@uranus ~]# iscsiadm -m iface default tcp,<empty>,<empty>,<empty>,<empty> iser iser,<empty>,<empty>,<empty>,<empty> ieth1 tcp,<empty>,<empty>,eth1,<empty> bnx2i.00:1a:64:09:02:49 bnx2i,00:1a:64:09:02:49,<empty>,<empty>,<empty> bnx2i.00:1a:64:09:02:4b bnx2i,00:1a:64:09:02:4b,<empty>,<empty>,<empty> ibr0 tcp,<empty>,<empty>,br0,<empty> bnx2i.00:00:00:00:00:00 bnx2i,00:00:00:00:00:00,<empty>,<empty>,<empty> |
之前我们在运行 iSCSI 目标的主机 neptune 上配置了两个网络连接,查看其 IP 地址:
[root@neptune ~]# ifconfig br0 Link encap:Ethernet HWaddr 00:1A:64:09:69:98 inet addr:9.186.12.58 Bcast:9.186.12.255 Mask:255.255.255.0 inet6 addr: fec0::b:21a:64ff:fe09:6998/64 Scope:Site inet6 addr: 2002:977:2c4f:b:21a:64ff:fe09:6998/64 Scope:Global inet6 addr: 2002:97b:c7ab:2008:21a:64ff:fe09:6998/64 Scope:Global inet6 addr: 2002:97b:c7ab:2009:21a:64ff:fe09:6998/64 Scope:Global inet6 addr: fe80::21a:64ff:fe09:6998/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1026229 errors:0 dropped:0 overruns:0 frame:0 TX packets:4449 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:113665823 (108.4 MiB) TX bytes:317411 (309.9 KiB) eth0 Link encap:Ethernet HWaddr 00:1A:64:09:69:98 inet6 addr: fe80::21a:64ff:fe09:6998/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1105156 errors:0 dropped:0 overruns:0 frame:0 TX packets:6327 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:139306655 (132.8 MiB) TX bytes:964011 (941.4 KiB) Interrupt:122 Memory:ce000000-ce012800 eth1 Link encap:Ethernet HWaddr 00:1A:64:09:69:9A inet addr:9.186.12.59 Bcast:9.186.12.255 Mask:255.255.255.0 inet6 addr: fec0::b:21a:64ff:fe09:699a/64 Scope:Site inet6 addr: 2002:977:2c4f:b:21a:64ff:fe09:699a/64 Scope:Global inet6 addr: 2002:97b:c7ab:2008:21a:64ff:fe09:699a/64 Scope:Global inet6 addr: 2002:97b:c7ab:2009:21a:64ff:fe09:699a/64 Scope:Global inet6 addr: fe80::21a:64ff:fe09:699a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:827034 errors:0 dropped:0 overruns:0 frame:0 TX packets:142604 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:110709377 (105.5 MiB) TX bytes:45494197 (43.3 MiB) Interrupt:169 Memory:ca000000-ca012800 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:185774 errors:0 dropped:0 overruns:0 frame:0 TX packets:185774 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:112270981 (107.0 MiB) TX bytes:112270981 (107.0 MiB) |
在主机 unraus 上通过主机 neptune 的其中一个网络地址来查询目标存储的配置信息:
[root@uranus ~]# iscsiadm -m discovery -t st -p 9.186.12.58 -I ibr0 -I ieth1 9.186.12.58:3260,1 iqn.2012-09.com.ibm:neptune.target 9.186.12.58:3260,1 iqn.2012-09.com.ibm:neptune.target |
通过主机 neptune 上另一个网络来查询目标存储的配置信息:
[root@uranus ~]# iscsiadm -m discovery -t st -p 9.186.12.59 -I ibr0 -I ieth1 9.186.12.59:3260,1 iqn.2012-09.com.ibm:neptune.target 9.186.12.59:3260,1 iqn.2012-09.com.ibm:neptune.target |
查询其发现的所有目标节点:
[root@uranus ~]# iscsiadm -m node 9.186.12.59:3260,1 iqn.2012-09.com.ibm:neptune.target 9.186.12.59:3260,1 iqn.2012-09.com.ibm:neptune.target 9.186.12.58:3260,1 iqn.2012-09.com.ibm:neptune.target 9.186.12.58:3260,1 iqn.2012-09.com.ibm:neptune.target |
登录所有的目标节点:
[root@uranus ~]# iscsiadm -m node --loginall=all Logging in to [iface: ieth1, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.59,3260] Logging in to [iface: ibr0, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.59,3260] Logging in to [iface: ieth1, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.58,3260] Logging in to [iface: ibr0, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.58,3260] Login to [iface: ieth1, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.59,3260]: successful Login to [iface: ibr0, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.59,3260]: successful Login to [iface: ieth1, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.58,3260]: successful Login to [iface: ibr0, target: iqn.2012-09.com.ibm:neptune.target, portal: 9.186.12.58,3260]: successful 查询已登录目标节点的会话: [root@uranus ~]# iscsiadm -m session tcp: [3] 9.186.12.59:3260,1 iqn.2012-09.com.ibm:neptune.target tcp: [4] 9.186.12.59:3260,1 iqn.2012-09.com.ibm:neptune.target tcp: [5] 9.186.12.58:3260,1 iqn.2012-09.com.ibm:neptune.target tcp: [6] 9.186.12.58:3260,1 iqn.2012-09.com.ibm:neptune.target |
这时主机 uranus 上可检测到通过 iSCSI 多路径连接的存储设备,我们注意到系统上有多个磁盘的状态和容量都是一样的,其实它们是指向同一个 iSCSI 目标存储,只是访问的路径不同而已。
[root@uranus ~]# fdisk -l Disk /dev/sda: 36.2 GB, 36269195264 bytes 64 heads, 32 sectors/track, 34589 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 128 131056 83 Linux /dev/sda2 129 4224 4194304 82 Linux swap / Solaris /dev/sda3 4225 34589 31093760 83 Linux Disk /dev/sdb: 73.2 GB, 73283928064 bytes 255 heads, 63 sectors/track, 8909 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdb doesn't contain a valid partition table Disk /dev/dm-0: 73.2 GB, 73283928064 bytes 255 heads, 63 sectors/track, 8909 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/dm-0 doesn't contain a valid partition table Disk /dev/sdd: 73.2 GB, 73294413824 bytes 255 heads, 63 sectors/track, 8910 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdd doesn't contain a valid partition table Disk /dev/sde: 73.2 GB, 73294413824 bytes 255 heads, 63 sectors/track, 8910 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sde doesn't contain a valid partition table Disk /dev/sdf: 73.2 GB, 73294413824 bytes 255 heads, 63 sectors/track, 8910 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdf doesn't contain a valid partition table Disk /dev/sdg: 73.2 GB, 73294413824 bytes 255 heads, 63 sectors/track, 8910 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdg doesn't contain a valid partition table Disk /dev/dm-1: 73.2 GB, 73294413824 bytes 255 heads, 63 sectors/track, 8910 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/dm-1 doesn't contain a valid partition table |
回页首
iSCSI initiator 主机上安装 Multipath
为了主机可以使用 iSCSI 多路径访问存储设备,我们需要在主机上安装多路径设备映射器 (DM-Multipath)。多路径设备映射器可以实现主机节点和后端存储之间的多个 I/O 路径配置为一个单一逻辑设备,从而可以提供链路冗余和提高性能。主机通过访问包含多个 I/O 路径的逻辑设备,就可以有效提高后端存储系统的可靠性。
在主机 uranus 上安装 multipath,其具体版本号为 device-mapper-multipath-0.4.7-34.el5。
[root@uranus ~]# yum install device-mapper-multipath |
启动 multipath 服务:
[root@uranus ~]# /etc/init.d/multipathd start Starting multipathd daemon: [ OK ] |
查询多路径设备,其包含四条路径:
[root@uranus etc]# multipath -ll mpath29 (1IET_00010001) dm-1 IET,VIRTUAL-DISK [size=68G][features=0][hwhandler=0][rw] \_ round-robin 0 [prio=1][active] \_ 10:0:0:1 sde 8:64 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 11:0:0:1 sdd 8:48 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 12:0:0:1 sdf 8:80 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 13:0:0:1 sdg 8:96 [active][ready] |
编辑 multipath 配置文件来自定义多路径设备别名,使得易于识别管理:
[root@uranus etc]# vi /etc/multipath.conf multipaths { multipath { wwid 1IET_00010001 alias kvm } } |
重新启动 multipath 服务:
[root@uranus etc]# /etc/init.d/multipathd restart Stopping multipathd daemon: [ OK ] Starting multipathd daemon: [ OK ] |
现在多路径设备别名已更新:
[root@uranus etc]# multipath -ll kvm (1IET_00010001) dm-1 IET,VIRTUAL-DISK [size=68G][features=0][hwhandler=0][rw] \_ round-robin 0 [prio=1][active] \_ 10:0:0:1 sde 8:64 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 11:0:0:1 sdd 8:48 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 12:0:0:1 sdf 8:80 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 13:0:0:1 sdg 8:96 [active][ready] |
回页首
iSCSI initiator 主机上安装 KVM
KVM 全称 Kernel-based Virtual Machine,是 x86 硬件平台上基于 Linux 内核的全虚拟化应用解决方案。它需要 CPU 硬件支持,如 Intel VT 技术或者 AMD V 技术。
在主机 uranus 上安装 KVM,其包含的版本分别为 kvm-83-164.el5、python-virtinst-0.400.3-9.el5、libvirt-python-0.6.3-33.el5、virt-manager-0.6.1-12.el5、virt-viewer-0.0.2-3.el5。
[root@uranus ~]# yum install kvm python-virtinst libvirt libvirt-python \ virt-manager virt-viewer |
为了让虚拟机可以使用桥接网络,我们则需要编辑对应的网络配置文件,内容类似如下。
[root@uranus network-scripts]# vi ifcfg-eth0 # Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet DEVICE=eth0 BRIDGE=br0 HWADDR=00:1a:64:09:02:48 ONBOOT=yes [root@uranus network-scripts]# vi ifcfg-br0 # Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet DEVICE=br0 BOOTPROTO=static BROADCAST=9.186.12.255 HWADDR=00:1a:64:09:02:48 IPADDR=9.186.12.56 IPV6INIT=yes IPV6_AUTOCONF=yes NETMASK=255.255.255.0 NETWORK=9.186.12.0 ONBOOT=yes TYPE=Bridge |
重起网络服务后桥接网络已启用,这样虚拟机就可以使用和主机同一个网段的 IP 地址。
[root@uranus ~]# ifconfig br0 Link encap:Ethernet HWaddr 00:1A:64:09:02:48 inet addr:9.186.12.56 Bcast:9.186.12.255 Mask:255.255.255.0 inet6 addr: fec0::b:21a:64ff:fe09:248/64 Scope:Site inet6 addr: 2002:977:2c4f:b:21a:64ff:fe09:248/64 Scope:Global inet6 addr: 2002:97b:c7ab:2008:21a:64ff:fe09:248/64 Scope:Global inet6 addr: 2002:97b:c7ab:2009:21a:64ff:fe09:248/64 Scope:Global inet6 addr: fe80::21a:64ff:fe09:248/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:914176 errors:0 dropped:0 overruns:0 frame:0 TX packets:80832 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:104945835 (100.0 MiB) TX bytes:7270936 (6.9 MiB) eth0 Link encap:Ethernet HWaddr 00:1A:64:09:02:48 inet6 addr: fe80::21a:64ff:fe09:248/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:985686 errors:0 dropped:0 overruns:0 frame:0 TX packets:80816 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:127906207 (121.9 MiB) TX bytes:7595400 (7.2 MiB) Interrupt:122 Memory:ce000000-ce012800 eth1 Link encap:Ethernet HWaddr 00:1A:64:09:02:4A inet addr:9.186.12.55 Bcast:9.186.12.255 Mask:255.255.255.0 inet6 addr: fec0::b:21a:64ff:fe09:24a/64 Scope:Site inet6 addr: 2002:977:2c4f:b:21a:64ff:fe09:24a/64 Scope:Global inet6 addr: 2002:97b:c7ab:2008:21a:64ff:fe09:24a/64 Scope:Global inet6 addr: 2002:97b:c7ab:2009:21a:64ff:fe09:24a/64 Scope:Global inet6 addr: fe80::21a:64ff:fe09:24a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:679630 errors:0 dropped:0 overruns:0 frame:0 TX packets:116675 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:95098446 (90.6 MiB) TX bytes:28497709 (27.1 MiB) Interrupt:169 Memory:ca000000-ca012800 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:2692997 errors:0 dropped:0 overruns:0 frame:0 TX packets:2692997 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3617264060 (3.3 GiB) TX bytes:3617264060 (3.3 GiB) virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:468 (468.0 b) |
回页首
使用 iSCSI 多路径存储设备安装 KVM 虚拟机
通过虚拟机管理工具 virt-manager 我们开始创建一个新的 KVM 虚拟机,选择刚更新别名的多路径设备作为其系统磁盘。
选择使用桥接网络为其网络设备。
确认后开始安装系统。
为虚拟机配置和主机同属网段的 IP 地址。
开始安装系统。
回页首
中断部分 iSCSI 路径测试 KVM 虚拟机可用性
在虚拟机系统安装的过程中,我们断开主机 uranus 上网络适配器 eth1 的网络连接,其所配置的 IP 地址为 9.186.12.55,查询其 iSCSI 主机信息:
[root@uranus iscsi_host]# iscsiadm -m host bnx2i: [8] <empty>,[00:1a:64:09:02:4b],eth1 <empty> bnx2i: [9] <empty>,[00:1a:64:09:02:49],eth0 <empty> tcp: [10] 9.186.12.55,[<empty>],eth1 <empty> tcp: [11] 9.186.12.56,[<empty>],br0 <empty> tcp: [12] 9.186.12.55,[<empty>],eth1 <empty> |
tcp: [13] 9.186.12.56,[<empty>],br0 <empty>
其主机信息也可以通过如下方法查询获得:
[root@uranus ~]# cat /sys/class/iscsi_host/host10/ipaddress 9.186.12.55 [root@uranus ~]# cat /sys/class/iscsi_host/host12/ipaddress 9.186.12.55 |
据此可以推断主机 10 和 12 所连接的两条路径会受影响。
查询其链路情况确认其中主机 10 和 12 所连接的两条路径已经被中断。此处需要注意的是,输出结果中的 10:0:0:1 对应的是 Host:Chanel:Id:Lun,其首位代表主机 id。
[root@uranus ~]# multipath -ll sde: checker msg is "readsector0 checker reports path is down" sdf: checker msg is "readsector0 checker reports path is down" kvm (1IET_00010001) dm-1 IET,VIRTUAL-DISK [size=68G][features=0][hwhandler=0][rw] \_ round-robin 0 [prio=0][enabled] \_ 10:0:0:1 sde 8:64 [failed][faulty] \_ round-robin 0 [prio=1][active] \_ 11:0:0:1 sdd 8:48 [active][ready] \_ round-robin 0 [prio=0][enabled] \_ 12:0:0:1 sdf 8:80 [failed][faulty] \_ round-robin 0 [prio=1][enabled] \_ 13:0:0:1 sdg 8:96 [active][ready] |
此时系统继续正常安装,不受影响。
重新恢复刚断开的网络连接后,其多路径链接即恢复正常。
[root@uranus ~]# multipath -ll kvm (1IET_00010001) dm-1 IET,VIRTUAL-DISK [size=68G][features=0][hwhandler=0][rw] \_ round-robin 0 [prio=1][enabled] \_ 10:0:0:1 sde 8:64 [active][ready] \_ round-robin 0 [prio=1][active] \_ 11:0:0:1 sdd 8:48 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 12:0:0:1 sdf 8:80 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 13:0:0:1 sdg 8:96 [active][ready] |
此时系统继续正常安装。
直至系统安装结束。
虚拟机系统正常启动后,在 ping 它的过程中,断开主机 neptune 上的其一网络连接后等待一段时间后重新恢复其连接。我们发现期间没有丢包,且响应时间稳定,可以说系统不受影响。
图 9. Ping 测试
登录虚拟机终端,前后分别测试其在正常多路径和中断一半 iSCSI 路径时系统 IO:
[root@kvm ~]# dd if=/dev/zero of=file1 bs=64k count=16k conv=fsync 16384+0 records in 16384+0 records out 1073741824 bytes (1.1 GB) copied, 96.6503 seconds, 11.1 MB/s [root@kvm ~]# dd if=/dev/zero of=file2 bs=64k count=16k conv=fsync 16384+0 records in 16384+0 records out 1073741824 bytes (1.1 GB) copied, 99.5537 seconds, 10.8 MB/s |
可注意到前后 I/O 差异很小。
类似地,前后分别测试其在正常多路径和中断一半 iSCSI 路径时系统读写性能:
[root@kvm ~]# time dd if=/dev/vda of=file3 bs=8k count=128k 131072+0 records in 131072+0 records out 1073741824 bytes (1.1 GB) copied, 193.559 seconds, 5.5 MB/s real 3m13.582s user 0m0.100s sys 0m3.440s [root@kvm ~]# time dd if=/dev/vda of=file4 bs=8k count=128k 131072+0 records in 131072+0 records out 1073741824 bytes (1.1 GB) copied, 191.428 seconds, 5.6 MB/s real 3m11.797s user 0m0.090s sys 0m3.562s |
同样,前后性能差异也很小。
另外当系统如仅剩一条 iSCSI 路径则磁盘 IO 吞吐量肯定会下降,此处不再做进一步测试说明。
回页首
总结
本文介绍了如何使用 iSCSI 多路径及测试中断部分路径后系统的稳定性和 IO 性能,证实了使用 iSCSI 多路径可以实现提高 KVM 虚拟机的可用性。但仅只是证实了其方案的可行性,不代表可以直接应用于生产环境。如需应用生产环境则需要进一步更严谨的系统测试来排除潜在风险,否则生产系统出现问题,本人对此不承担任何责任。
参考资料
学习
参考 Wikipedia,了解更多关于 iSCSI 的信息。
参考 IBM InfoCenter,了解更多关于 KVM 的安装和配置。
参考 RED HAT DOCUMENTATION,查看更多关于 Multipath 多路径配置及管理。
在 developerWorks Linux 专区寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料。
讨论
加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
关于作者
祝珍泉,目前在 IBM 中国开发中心从事 Tivoli Storage UI 的 FVT 工作,产品涉及 DS8K, SONAS 以及 SVC/V7000 等。