Xen基于ISCSI共享实现Nginx实时迁移

来源:互联网 发布:火炮兰灵族捏脸数据 编辑:程序博客网 时间:2024/04/26 17:16

实时迁移简介
Xen提供了一种强大的功能,它就是动态迁移法。它能让Domain U在运行期间,以最小的服务中断为代价,迁移到另外的 Xen服务器上。
使用Xen动态迁移的主要优点列举如下:

  • Xen的动态迁移随同诸如 heartbeat 之类的高可用性解决方案一起使用,可以保证所有关键商业服务不会出现中断。
  • 它使我们能够以“治未病”方式来维护寄放虚拟机的物理服务器;可以监视服务器,然后通过转移系统来即时解决潜在的和可疑的问题。
  • 它使得在多个服务器之间实现负载均衡成为可能,能够更好地利用企业中的所有计算资源,使其利用情况达到最佳状态。需要注意的是, Xen的开源版本目前还不支持在 dom0上感应到故障时自动进行动态迁移的功能。
  • 它使得在需要时向系统配置添加计算能力变得更加轻松;可以根据需要更换硬件,而无需中断运行在该硬件上的服务。

实验架构
这里写图片描述
说明:配置一台服务器作为iSCSI共享存储,输出逻辑卷给两台Xen虚拟化平台使用;实验环境在中两台Xen的Domain 0都是基于VMware中的CentOS6.4_X86_64虚拟机构建,构建成功后,用两种方法实现Domain U上vm1这个微型linux启动,一种是基于Domain 0上的内核,另一种是在Domain U的vm1上微型linux创建GRUB,并复制Domain 0上的内核和虚拟文件系统镜像到vm1的/boot目录下。文中涉及到的每个模块详细配置说明可见此前博文,使用的bincp.sh脚本在上一篇博文中已经给出,这里不再赘述http://blog.csdn.net/celeste7777/article/details/49668713
实现过程
一、同步各节点时间

[root@DQ ~]# ansible xen -m shell -a 'ntpdate 10.33.1.129'

这里写图片描述
二、构建 iSCSI 共享存储
iSCSI 服务器构建步骤可参见http://blog.csdn.net/celeste7777/article/details/48783385
这里已经安装好软件包,添加一块新硬盘(也可使用有剩余空间的硬盘),在硬盘上创建一个10G的分区,而做一个容量为5G逻辑卷方便以后使用,卷大小可根据实际情况做相应调整
这里写图片描述
编辑iSCSI的配置文件,这里只做简单设置,省去了用户认证相关步骤,配置完成后即可启动服务
这里写图片描述
三、客户端节点 Xen 虚拟化环境构建
添加一个虚拟化节点,从Xen4CentO6这个源中下载xen,而后需要修改grub.conf配置文件;配置完成后重新启动系统

[root@DQ ~]# ansible dom0 -m yum -a "name=centos-release-xen" [root@DQ ~]# ansible dom0 -m yum -a "name=xen" [root@xen1 ~]#vim /boot/grub/grub.conf module /initramfs-3.18.21-16.el6.x86_64.img   ##在module /vmlinuz-3.18下面添加这行[root@xen1 ~]# scp /boot/grub/grub.conf 10.33.100.13:/boot/grub/grub.conf[root@DQ ~]# ansible dom0 -m shell -a "reboot"

重启后验证两个节点已经进入了Xen的 Dom0 环境:
这里写图片描述
四、iSCSI 客户端的安装和配置
确保两个节点已安装 iSCSI 客户端软件:
这里写图片描述
在管理机上启动两个xen虚拟化平台的iSCSI客户端;发现target端共享的存储,注册 iscsi 共享设备并登录

[root@DQ ~]# ansible dom0 -m service -a 'name=iscsid state=started'[root@DQ ~]# ansible dom0 -m shell -a 'iscsiadm -m discovery -t st -p 10.33.100.99'[root@DQ ~]# ansible dom0 -m shell -a 'iscsiadm -m node -T iqn.2015-11.com.DQ:xen.vm1 -p 10.33.100.99 -l'

查看target端输出的存储:
这里写图片描述
五、基于Dom0(CentOS6.4 x86_64)制作一个运行于Domain U的微型Linux系统
以下步骤只需要在其中一个节点构建即可;在xen1上对target输出的卷进行分区,sdb1,sdb2,sdb3分别作为稍后要创建的Domain U的/boot分区,/分区和/swap分区
这里写图片描述
格式化分区并挂载

[root@xen1 ~]# mkfs.ext4 /dev/sdb1[root@xen1 ~]# mkfs.ext4 /dev/sdb2[root@xen1 ~]# mkswap /dev/sdb3[root@xen1 ~]# mkdir /mnt/{boot,sysroot}[root@xen1 ~]# mount /dev/sdb1 /mnt/boot[root@xen1 ~]# mount /dev/sdb2 /mnt/sysroot

接下来执行脚本bincp.sh,拷贝需要的二进制程序所依赖的库文件到根目录下,而后在根目录下创建需要的目录,并复制xen-netfront模块文件到Domain U的lib目录
这里写图片描述
创建/sbin/init运行需要的简单配置文件rcS.conf,以及rcS.conf依赖的执行脚本/etc/rc.d/rc.sysinit
这里写图片描述
六、构建桥设备
确保两个虚拟化平台节点已安装libvirt包
这里写图片描述
在管理机上使用命令创建桥设备并验证

[root@DQ ~]# ansible dom0 -m service -a 'name=libvirtd state=started'[root@DQ ~]# ansible dom0 -m shell -a 'virsh iface-bridge eth0 br0'

这里写图片描述
七、编辑Domain U启动配置文件
启动xend服务后启动Domain U
这里写图片描述
成功启动虚拟机,网卡驱动也正常
这里写图片描述
按 CTRL+] 退出虚拟机,并destroy vm1
八、下面为Domain U添加属于其自身的内核,使用pygrub来引导启动
首先在/dev/sdb上安装GRUB,而后将内核和虚拟文件系统镜像拷贝到/boot,同步后卸载分区
这里写图片描述
修改Domain U启动配置文件并启动
这里写图片描述
这里写图片描述
测试网卡驱动一切正常后按 CTRL+] 退出虚拟机,并destroy vm1
这里写图片描述
九、测试两个虚拟化平台虚拟机的实时迁移
编辑配置文件使节点支持实时迁移,而后重启xend服务

[root@xen1 ~]# vim /etc/xen/xend-config.sxp (xend-relocation-server yes)(xend-relocation-port 8002)(xend-address '0.0.0.0')(xend-relocation-address '0.0.0.0')(xend-relocation-hosts-allow '')[root@xen1 ~]# scp /etc/xen/xend-config.sxp 10.33.100.13:/etc/xen/xend-config.sxp xend-config.sxp                                           100%   11KB  11.1KB/s   00:00 [root@DQ ~]# ansible dom0 -m service -a 'name=xend state=restarted'

这里写图片描述
启动节点xen1的vm1,执行ping命令以便查看迁移后的效果,而后将其迁移到xen2
这里写图片描述
这里写图片描述
连接上xen2的虚拟机查看,可以发现ping命令在持续执行,证明成功迁移,两个xm list分别在迁移之前和之后执行
这里写图片描述
十、将nginx服务移植到Domain U上做实时迁移测试
用strace命令追踪一下nginx命令执行过程,查看其进行的系统调用和打开的文件,为其创建依赖的运行环境

[root@xen1 ~]# strace nginxexecve("/usr/sbin/nginx", ["nginx"], [/* 34 vars */]) = 0open("/etc/ld.so.cache", O_RDONLY)      = 3open("/lib64/libcrypt.so.1", O_RDONLY)  = 3open("/lib64/libpcre.so.0", O_RDONLY)   = 3open("/usr/lib64/libssl.so.10", O_RDONLY) = 3open("/usr/lib64/libcrypto.so.10", O_RDONLY) = 3##此处省去许多库文件open("/var/log/nginx/error.log", O_WRONLY|O_CREAT|O_APPEND, 0644) = 3open("/etc/nginx/nginx.conf", O_RDONLY) = 4open("/etc/nginx/mime.types", O_RDONLY) = 5open("/etc/nsswitch.conf", O_RDONLY)    = 4open("/etc/ld.so.cache", O_RDONLY)      = 4open("/lib64/libnss_files.so.2", O_RDONLY) = 4

挂载分区到对应目录,在根目录下创建nginx运行时依赖的目录
这里写图片描述
执行bincp.sh脚本,将nginx命令执行所需的库文件拷贝到对应目录
这里写图片描述
在strace nginx命令执行结果中可知nginx启动会许多open,read等读写操,因此需要在系统启动重新挂载/为读写,添加/etc/fstab并修改/etc/rc.d/rc.sysinit添加mount一行;配置完成后卸载分区,启动vm1
这里写图片描述
成功登陆后启动nginx服务,查看端口监听,访问测试,而后重复上述迁移步骤测试,不间断刷新网页,web服务一直可正常访问,则说明迁移成功
这里写图片描述
这里写图片描述
主要参考
http://www.tuicool.com/articles/7NzmEjB

0 0