keepalived+lvs实现http的高可用性

实验前提:
1、本次实验作者使用的是RHEL5.8的32位系统平台。
2、实验所需软件为ipvsadm、keepalived、httpd
3、每个节点对应的ip地址如下:
direct1   192.168.108.199
direct2   192.168.108.201
realserver1  192.168.108.202
realserver2  192.168.108.150
VIP    192.168.108.100

实验拓扑如下:

技术分享


安装ipvsadm
在keepalived的配置文件中有一部分是关于LVS的配置,这部分配置在keepalived脚本启动后会作为参数传递给ipvsadm,ipvsadm从而会自动生成相关的IPVS规则。ipvsadm需要在两个direct上都安装
#yum -y  install  ipvsadm


安装keepalived
在这里使用编译的方式进行安装keepalived,软件下载地址http://www.keepalived.org/download.html
keepalived需要在前端2个direct上都安装

#tar xf keepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#./configure --prefix=/
#make && make install

如果在安装keepalived时出现如下错误,只需要在编译时,添加--disable-fwmark参数即可
checking for nl_socket_modify_cb in -lnl... no
configure: WARNING: keepalived will be built without libnl support.
checking for kernel version... 2.6.18
checking for IPVS syncd support... yes
checking for kernel macvlan support... no
checking whether SO_MARK is declared... no
configure: error: No SO_MARK declaration in headers


编辑配置文件/etc/keepalived.conf
global_defs {
   notification_email {
 root@localhost
   }
   notification_email_from xsl@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DIRECT1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass suiji
    }
    virtual_ipaddress {
        192.168.108.100
    }
}

virtual_server 192.168.108.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.108.150 80 {
        weight 1
        HTTP_GET {
            url {
              path /www/xsl.com/index.html
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
  
  
    real_server 192.168.108.202 80 {
        weight 1
        HTTP_GET {
            url {
               path /www/xsl.com/index.html
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}
编辑好配置文件后,可以将这个文件复制到另一个direct节点,另一个节点必须事先创建好/etc/keepalived目录
#scp /etc/keepalived/keepalived.conf   direct2:/etc/keepalived
然后在direct2上修改state为BACKUP,priority为90即可


#chkconfig  --add  keepalived
#chkconfig  keepalived  on


接在在这两个direct上启动keepalived服务
#service  keepalived start

当keepalived启动完成之后,可以检查虚拟IP地址是否已经生产,且虚拟IP地址位于MASTER上。
由于在配置文件中将direct1设置为MASTER,因此,只需要在direct上执行如下命令,即可检查配置是否成功
#ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:ed:fa:67 brd ff:ff:ff:ff:ff:ff
    inet 192.168.108.199/24 brd 192.168.108.255 scope global eth0
    inet 192.168.108.100/32 scope global eth0
    inet6 fe80::20c:29ff:feed:fa67/64 scope link
       valid_lft forever preferred_lft forever

需要说明的是虚拟ip地址是配置在接口上的,作为这个接口的第二地址,因此,使用ifconfig命令是看不出来的。

 

测试VIP漂移过程
当direct1发生故障时,测试VIP是否会漂移到direct2上去。
可以在direct1上执行如下命令来模拟direct1发生故障:
#service keepalived stop

执行命令完成之后,再在direct2上执行如下命令:
#ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:4f:f1:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.108.201/24 brd 192.168.108.255 scope global eth0
    inet 192.168.108.100/32 scope global eth0
    inet6 fe80::20c:29ff:fe4f:f16a/64 scope link
说明,当direct1发生故障时,VIP会立即漂移到direct2上去

其实配置到这里,keepalived的高可用功能已经实现了,接下来需要配置的是与lvs有关的内容


realserver上的配置   
安装httpd服务
在两个realserver上安装httpd服务
#yum -y install httpd

#service httpd start


安装完成后,最好是编辑一下每个realserver上的httpd默认根路径下的文件,即/var/www/html/index.html文件,使得2个文件保持不一致。方便后续测试。
然后在本机测试一下,看http服务是否可以正常访问,如果可以正常访问,则继续下面的操作。

将http服务设置为开机自启动。需要在两个realserver上都执行
#chkconfig  httpd on

在两个realserver上配置VIP,配置VIP的命令如下:
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#ifconfig lo:0 192.168.108.100 broadcast 192.168.108.100 netmask 255.255.255.255 up
#route add -host 192.168.108.100 dev lo:0

在MASTER上查看IPVS规则是否生成
#ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.108.100:80 rr
  -> 192.168.108.202:80           Route   1      0          0        
  -> 192.168.108.150:80           Route   1      0          0
 
测试一
在浏览器上面输入http://192.168.108.100,然后再观察页面的内容

技术分享


然后再次刷新页面,观察页面的内容

 技术分享

从上面测试知道,LVS的负载均衡功能已经实现。

 

测试二
当direct1发生故障时,direct1上的IPVS规则应该会被删除,direct2上的IPVS规则会被添加
在direct1上执行如下命令用来模拟MASTER发生故障
#service keepalived stop
执行完成以后,分别在direct1和direct2上执行如下命令,来观察各个direc上的IPVS规则:
#ipvsadm  -L -n 
执行完成后,就会发现direct1上面的规则没有了,而这些规则在direct2生成了。这里就不截图了。


测试三
当后端的realserver发生故障或运行在realserver上的服务发生故障时,则与这个realserver相关的IPVS规则会被删除。
如在realserver1上执行如下命令,来模拟httpd服务发生故障
#service httpd stop
然后再在作为MASTER上的服务器上查看IPVS规则,使用如下命令即可查看IPVS规则,这里我的direct2是作为MASTER。
#ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.108.100:80 rr
  -> 192.168.108.150:80           Route   1      0          0     
 看看,与realserver1相关的IPVS规则被删除了,说明测试成功。


其实,实验做到这里来,一个LVS+keepalived来实现web服务的高可用集群基本成功了。只是,对于这个实验仍然有许多不足之处,比如:
1、如果后端的realserver都发生故障,则前端的direct将无法响应客户端的请求,因此,会出现客户端打不开页面的情况,因此,在这种情况下,我们最好是返回一个提示信息给用户(如网站正在维护,请您稍后在浏览),这样给用户的感觉就比较直观。
2、其中在整个实验过程中,我们实现MASTER/BACKUP切换的主要是通过停止keepalived服务来进行的,那如何通过脚本来完成模式切换功能呢?
3、当VRRP切换事务发生时,如何发送警告给指定的管理员?


完美补充一
当后端的realserver都出现故障时,如何返回一个提示信息给用户?
配置步骤:
1、需要在所有的direct上安装httpd服务并将其设置为开机自启动,如:
#yum  -y  install  httpd
#chkconfig httpd  on


2、修改httpd服务默认根路径下的文件index.html的内容
echo  "Site is down for maintenance, please wait while browsing"  >  /www/xsl.com/index.html
说明:这里我采用的基于虚拟主机的httpd服务,因此,根路径可能不一样。如果是基于中心主机来配置的httpd服务,那么它的默认根路径下的文件为/var/www/html/index,即修改这个文件中的内容即可。


3、在所有的direct上启动httpd服务
#service httpd start

4、修改配置文件,需要在所有的direct上做修改
#vim  /etc/keepalived/keepalived.conf
需要在virtual_server 192.168.108.100 80 { }中添加一样这样的信息
sorry_server 127.0.0.1 80

如:
virtual_server 192.168.108.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP
    sorry_server 127.0.0.1 80
 ...
}


4、模拟所有的realserver都down掉,如下命令需要在所有的realserver上执行
#service httpd  stop

5、测试
在浏览器上面输入http://192.168.108.100,观察网页的内容

技术分享


发现网页的内容就是我们刚刚添加的内容。说明当所有的realserver都挂掉之后,访问的httpd服务是MASTER上的httpd服务,本地的httpd服务将返回本地页面中的内容给用户,该页面主要提供警示信息。


 

完美补充二、通过自写监测脚本来实现MASTER/BACKUP的切换
1、在所有的direct的配置文件/etc/keepalived/keepalived.conf添加如下配置:
vrrp_script chk_httpd_down {
        scripts "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"   这个表示要执行的命令或脚本
        interval 2    每个2秒检测一次
        weight 20     检测失败后,本节点的priority值会响应减少20
        fall 2        如果检测2次都失败了,则认为失败
        rise 1        如果检测一次成功,则认为是成功了。
}

这个需要添加到实例配置下
track_script {
        chk_httpd_down
}

如:
vrrp_script chk_httpd_down {
        script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0 "
        interval 2
        weight 20
        fall 2
        rise 1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 88
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass suiji
    }
    virtual_ipaddress {
        192.168.108.100
    }
    track_script {
        chk_httpd_down
    }
}

 

上述添加的内容的意思是:只要在/etc/keepalived/目录下存在down这个文件,则MASTER就会切换成BACKUP。

 

3、测试

在当前MASTER节点上的/etc/keepalived/目录下创建down文件,观察此时节点的状态,此时你会发现,VIP已经飘逸到之前的BACKUP上去了。此时此刻该节点的状态为BACKUP。

 

完美补充三、当VRRP切换事务发生时,如何发送警告给指定的管理员?
在所有的direct上修改配置文件,并添加如下配置
    notify_master  "/etc/keepalived/notify.sh master"
    notify_backup  "/etc/keepalived/notify.sh backup"
    notify_fault  "/etc/keepalived/notify.sh fault"

这段配置是配置在vrrp_instance VI_1 {}实例中的

编写通知脚本
#vim  notify.sh

通知脚本如下:
#vim notify.sh
#!/bin/bash

#author:xsl
#description: An example of notify script
#

vip=192.168.108.100
contact=‘root@localhost‘

notify() {
 mailsubjiect="`hostname` is to be $1 ,$vip floating"    #这里是邮件的主题
 mailbody="`date ‘+$F %H:%M:%S‘`:vrrp transition,`hostname` changed to be $1 "
 echo $mailbody | mail -s "$mailsubject" $contact
}

case $1 in
master)
 notify master
 /etc/rc.d/init.d/httpd start
 exit 0
 ;;
backup)
 notify backup
 /etc/rc.d/init.d/httpd restart
 exit 0
 ;;
fault)
 notify fault
 exit 0
 ;;
*)
 echo "usage:`basename $0` {master|backup|fault}"
 exit 1
 ;;
esac

 

给脚本加执行权限
#chmod +x notify.sh

 

然后将其赋值一份传给direct2
#scp  /etc/keepalived/notify.sh  direct2:/etc/keepalived/

 

测试,在direct1节点上添加down文件
#touch  /etc/keepalived/down

 

查看虚拟IP地址是否还位于direct1上
#ip addr show

查看ipvs规则是否已被删除
#ipvsadm -L  -n

如果虚拟ip地址不存在了且IPVS规则也被删除,则表示操作都成功了。一旦发生主从切换,root用户应该可以收到相关的邮件信息了。 

 

本文出自 “linux学习之路” 博客,请务必保留此出处http://xslwahaha.blog.51cto.com/4738972/1620658

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。