在高可用集群中在主节点当即后如果资源不能成功转移到该高可用集群的其他节点上那么这个集群的高可用性就无从谈起,所以在高可用集群中资源成功转移才是王道!
    在《一步步教你为LVS中的Director实现高可用集群》这篇文章中给大家讲解了怎样使用Heartbeat自带的软件包实现LVS中Director的高可用性集群的资源转移,可以说Heartbeat专门为LVS中Director实现高可用集群打造的软件包,只需要修改一个配置文件,所有的资源转移问题迎刃而解,我们除了使用这个专门的软件包之外完全可以使用自己手工编写的脚本来实现,下面我们就用自己编写的脚本来实现这个话题中的资源转移。
       

    我们本次讲解是基于DR的LVS中Director的高可用集群,所以先根据下图建立这个大的结构。

        手动实现高可用LVS的资源转移_休闲

    route为连接外网的路由器,switch为内网中的交换机,RS1提供web服务(主要是为了进行实验结果的验证,所以我们就只用一个realserver主机RS1),直接和交换机相连,ND1、ND2为LVS中的两个Director节点,我们要对这连个Director节点实现高可用集群服务,两个Director和交换机直接相连之外,两个节点之间还需要直接连接进行心跳等基本信息的传递。 
    每个有标记的块状物为网卡,上面是编号,在连个ND节点之间有一个被称为资源一部分的VIP在哪个节点上是不固定的,外网的用户也是通过这个VIP来访问我们的web服务的。

开始配置: 设定VIP为192.168.0.85/24

1、对RS1的配置

(1)对realserver配置内核参数:
先来解释一下修改内核参数的原因,因为在DR模型中RS1、RS2在lo:0上都配置了VIP的地址,是为了在数据包响应用户的时候源地址为用户访问的VIP地址,但是在数据包进入路由器之后,在我们的内网中有多个VIP地址,路由器将不能将其转发到应该得到数据包的ND上,为了避免这种情况出现,我们就修改内核参数来让RS上的VIP网卡不对路由器的产生响应即可。
   echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
   echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
   echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
   echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

(2)为RS1配置虚拟的VIP地址(是为了实现在数据包返回用户的时候源地址为用户访问的地址) 
 ifconfig lo:0 192.168.0.85 broadcast 192.168.0.85 netmask 255.255.255.255 up
 为RS1的eth0网卡添加地址
 ifconfig eth0 192.168.0.207/24

(3)给realserver主机添加路由信息
 route add -host 192.168.0.85 dev lo:0 设定相应的数据包的源地址都为这个地址

(4)为RS1安装web服务
 yum install php php-mbstring mysql mysql-server httpd php-mysql
(5)为实现结果为web指定一个有其代号的网页
 echo RS1 > /var/www/html/index.html

(6)测试httpd服务能否正常运行,测试结果如下:   

      
         
手动实现高可用LVS的资源转移_软件包_02

二、对两个Director节点进行配置:

   配置两个Director节点,ND1为node1,ND2为node2
1、给node1配置地址 
   ifconfig eth0 192.168.0.202/24 
   ifconfig eth1 1.1.1.1
   给noid2配置地址 
   ifconfig eth0 192.168.0.204/24
   ifconfig eth1 1.1.1.2
2、配置本地主机名称解析

   在node1上
   vim /etc/hosts 添加如下内容
   192.168.0.202 node1.a.org 
   192.168.0.204 node2.a.org

对node1、node2的主机名进行相应的修改
在node1上
 hostname node1.a.org
在node2上 
 hostname node2.a.org

 3、只有我们要多次在连个节点间拷贝文件,为了省去繁琐的密码输入,我们在两个节点上进行如下配置

在node1上
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.204
在node2上
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.202
从此我们在两个节点上拷贝文件就不需要输入密码了

4、开始安装集群服务

(1)、下载安装包 
heartbeat-2.1.4-9.el5.i386.rpm
heartbeat-pils-2.1.4-10.el5.i386.rpm
heartbeat-devel-2.1.4-9.el5.i386.rpm
heartbeat-stonith-2.1.4-10.el5.i386.rpm
heartbeat-gui-2.1.4-9.el5.i386.rpm
libnet-1.1.4-3.el5.i386.rpm
创建一个目录将所用的安装包都放在这个目录内
mkdir node
将软件包移动进目录的命令我就不再说明了

(2)、安装 这些软件包,因为他们之间有依赖关系,所以使用yum安装

cd node
yum localinstall * --nogpgcheck –y

前两步需要在两个节点上都进行同样的操作

(3)、将Heartbeat的主要配置文件拷贝到/etc/ha.d中

cd /usr/share/doc/heartbeat-2.1.4
cp ha.cf authkeys haresources /etc/ha.d

(4)、编辑配置文件/etc/ha.d/ha.cf

vim /etc/ha.d/ha.cf 进行如下修改
打开日志 logfile /var/log/ha-log
打开 udpport 694 两节点用此端口发送心跳信息
添加 bcast eth1 发送心跳信息的网卡
添加定义节点 node node1.a.org
node node2.a.org

(5)、编辑配置文件/etc/ha.d/authkeys
vim /etc/ha.d/authkeys 添加如下内容
auth 2
2 sha1 kfhslkdhfsk(md5加密后的字符串,想要得到这个字符串运行如下命令,在将结果粘贴即可
dd if=/dev/urandom bs=512 count=1 | md5sum)

将此文件的权限改为400
chmod 400 authkeys

(6)、编辑配置文件/etc/ha.d/haresources

vim /etc/ha.d/haressources 添加如下内容
node1.a.org 192.168.0.85/32/eth0/192.168.0.255  ipvs.sh
上面的内容依次为:主节点的主机名,提供服务的IP即VIP,设定VIP的端口,广播地址,运行的脚本(这个脚本就是实现资源转移的,我们在最后来编写)

(7)、将我们配置的这三个文件拷贝到node2上

cd /etc/ha.d
scp ha.cf authkeys ldirectord node2.a.org:/etc/ha.d

(8)、编写实现资源转移的脚本ipvs.sh,内容如下:

#!/bin/bash
VIP=192.168.0.85
RIP1=192.168.0.207

case "$1" in
start)
   /sbin/iptables -F
  /sbin/iptables -Z
  /sbin/ipvsadm -C
  /sbin/ipvsadm -A -t $VIP:80 -s wlc
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 3
  /bin/touch /var/lock/subsys/ipvsadm.lock
;;

stop)
  /sbin/ipvsadm -C
  /sbin/ifconfig eth0:0 down
  /sbin/route del -host 192.168.0.85 dev eth0:0
  rm -rf /var/lock/subsys/ipvsadm.lock
;;

status)
  [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..."
;;
*)
  echo "Usage: $0 {start|stop}"
;;
esac

给脚本添加执行权限
chmod +x ipvs.sh

将脚本加入服务列表
cp ipvs.sh /etc/init.d

(9)启动heartbeat
在哪个节点上启动第一个该服务,以后所有的这个服务必须在这个节点上启动
我们就在node1上启动heartbeat服务
/etc/init.d/heartbeat start
在node1上启动node2的heartbeat服务

查看我们的Director高可用集群主节点是第几个节点:
执行命令:

ifconfig
图片的信息表示Director的主节点为ND1

 手动实现高可用LVS的资源转移_休闲_03

查看主节点是否有ipvs的资源信息:

手动实现高可用LVS的资源转移_LVS_04

接下来我们在浏览器中输入192.168.0.85进行测试,看能够看到网页,如果看到表示LVS的服务正常: 

手动实现高可用LVS的资源转移_休闲_05

我们将主节点的服务关闭,看资源是否成功流转到ND2上
在node1上执行 /etc/init.d/heartbeat stop

至执行成功之后到node2上,在此查看资源状态 
ifconfig

手动实现高可用LVS的资源转移_软件包_06 

结果显示,node1已经宕机,此时node2已经称为主节点

查看资源是否已经成功流转到node2上

ipvsadm -L -n

手动实现高可用LVS的资源转移_休闲_07

我们再次验证,Director高性能集群能否提供LVS功能:
继续在浏览器中数据192.168.0.85 
手动实现高可用LVS的资源转移_资源_08
结果显示,我们手动编辑的脚本ipvs.sh完全可以实现DR类型的LVS中Director的高可用集群