iSCSI 多路径实现 KVM 高可用

来源:互联网 发布:锥度螺纹怎么编程循环 编辑:程序博客网 时间:2024/03/29 22:54

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 设备一样简单。

其流程如下图:

图 0. iSCSI 流程
图 0. iSCSI 流程

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 虚拟机,选择刚更新别名的多路径设备作为其系统磁盘。

图 1. 选用 mpath
图 1. 选用 mpath

选择使用桥接网络为其网络设备。

图 2. Bridged network
图 2. Bridged network

确认后开始安装系统。

图 3. Summary
图 3. Summary

为虚拟机配置和主机同属网段的 IP 地址。

图 4. IP address
图 4. IP address

开始安装系统。

图 5. 安装系统
图 5. 安装系统

中断部分 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]

此时系统继续正常安装,不受影响。

图 6. 中断路径
图 6. 中断路径

重新恢复刚断开的网络连接后,其多路径链接即恢复正常。

 [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]

此时系统继续正常安装。

图 7. 恢复路径
图 7. 恢复路径

直至系统安装结束。

图 8. 安装完成
图 8. 安装完成

虚拟机系统正常启动后,在 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 虚拟机的可用性。但仅只是证实了其方案的可行性,不代表可以直接应用于生产环境。如需应用生产环境则需要进一步更严谨的系统测试来排除潜在风险,否则生产系统出现问题,本人对此不承担任何责任。

原创粉丝点击