记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

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




转载请标明出处【iSCSI 多路径实现 KVM 高可用】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论