keepalived+LVS+apache双机搭建高可用负载均衡web服务[原创]

keepalived程序因为他的配置简单,维护容易而广为各位linuxer使用,蚊子自然也不会放过这么好的一款软件了,关于keepalived的做lvs高可用的文章已经满google都是了,蚊子自然就不在这里赘述了。蚊子这篇文章讲述的是如何只使用两台机器使用keepalived搭建web服务的高可用和负载均衡。

之前在蚊子的《》一篇文章中,介绍了使用heartbeat,lvs和squid来搭建双机高可用负载均衡的上网服务器,有兴趣的朋友可以对比一下现在这篇和上篇。

一、试验环境

vmware6.0
linux01 192.168.211.128  CentOS release 5.3 (Final)
linux02 192.168.211.129  CentOS release 5.3 (Final)
web:httpd-2.2.3-31.el5.centos
keepalived版本:keepalived-1.1.19.tar.gz

二、安装程序

1、keepalived的安装

首先到http://www.keepalived.org/download.html下载最新的keepalived程序

# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure –prefix=/ –with-kernel-dir=/usr/src/kernels/2.6.18-128.el5-i686
# make
# make install

# cp keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived
# chmod +x /etc/init.d/keepalived
# cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived

2、web的安装

因为蚊子只是为了实现功能,所以只使用了centos自己的apache,如果默认系统没有按照httpd,使用

# yum –y install httpd

3、ipvsadm的安装

ipvsadm的安装也很简单,如果系统默认没有,则使用

# yum –y install ipvsadm

以上两个步骤在两台机器上是一样的。

三、 配置部分

1、linux01上的配置

1.1、keepalived的配置

编辑/etc/keepalived/keepalived.conf

# vi /etc/keepalived/keepalived.conf ,添加如下内容

! Configuration File for keepalived

global_defs {
   notification_email {
     admin@example.com
   }
   notification_email_from admin@example.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id linux01
}

vrrp_instance VI_1 {                               #定义一个实例
    state BACKUP                                    #设置为backup,然后通过priority控制哪台提升为主
    interface eth0
    virtual_router_id 51
    priority 100
    nopreempt                                          #在priority高的这台设置这个参数,方便当主恢复后
    advert_int 1                                        #可以自动接管
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.211.110 dev eth0 label eth0:0                #这里使用label标签启用eth0:0
    }
}

virtual_server 192.168.211.110 80 {                        #这里往下是定义LVS
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    protocol TCP

    real_server 127.0.0.1 80 {                            #其中一台是本地web服务
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }
    real_server 192.168.211.129 80 {             #另一台的web服务
        weight 1
        TCP_CHECK {
            connect_timeout 3
        }
    }  
}

1.2、web配置

web使用apache默认的配置,唯一修改的就是添加了自己的index.html文件,为了方便之后的测试

# echo “linux01”>/var/www/html/index.html

1.3、关于本机启动回环地址

众所周知,要是用lvs的dr模式,必须在realserver上启动回环地址,所以,搭建两台机器的负载均衡,当然就得在本机也启动相应的回环地址,才能实现所要的功能,脚本如下

# vi /usr/local/bin/startlo

#!/bin/sh

VIP=192.168.211.110

case "$1" in
  stop)
        # close lo:0 interface

        echo $"Close lo:0 interface"
        /sbin/route del -host $VIP dev lo:0
        /sbin/ifconfig lo:0 down
        echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
        echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
        ;;
  start)
        # start lo:0 interface

        echo $"Start lo:0 interface"
        /sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:0
        echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
        echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
        ;;
  *)
        echo $"Usage: $0 (start|stop)"
        exit 1
        ;;
esac

但由于keepalived不像heartbeat里有ldirectord来控制回环地址的启动和停止,所以我们需要人为的判断应该在哪台机器上启动回环地址,所以蚊子就写了下面的一个脚本,

# vi /usr/local/bin/check_interface

#!/bin/bash
#
#作者:蚊子
#
#脚本说明:
#本脚本用于判断当前server是否是master
#如果当前server不是master,则启动回环地址
#否则停止回环地址
#
#VIP_interface请根据自己的情况自行设定,这个是VIP接口
#lo_interface请根据自己的情况自行设定,是回环地址接口

VIP_interface="eth0:0"
lo_interface="lo:0"

i=10

while [ $i != 0 ]
do
    /sbin/ifconfig |grep $VIP_interface &>/dev/null
    retval=$?
    if [ ! $retval -eq 0 ];then
        /sbin/ifconfig |grep $lo_interface &>/dev/null
        retval=$?
        if [ ! $retval -eq 0 ];then
            /usr/local/bin/startlo start
        fi
    else
        /sbin/ifconfig |grep $lo_interface &>/dev/null
        retval=$?
        if [ $retval -eq 0 ];then
            /usr/local/bin/startlo stop
        fi
    fi
    i=10
    sleep 10
done

2、linux02上的配置

2.1、keepalived的配置

具体的配置这里就不给出了,请参考linux01上的配置,唯一的区别

A、priority的值小于linux01上值,蚊子设置为50
B、在vrrp_instance VI_1的配置中不用设置nopreempt  
C、修改realserver部分的ip为本机和另外一台server的ip地址

2.2、web的配置

apache的配置和linux01一样使用默认配置,同意是编辑默认的index.html文件

# echo “linux02”>/var/www/html/index.html

2.3、本地回环地址的设置

这部分内容和linux01上的一样,相关脚本可以拷贝过来直接使用

四、启动测试

到此,一切准备就绪就可以测试了

首先将所有需要的脚本设置可执行权限。依次启动相应的服务

A、# /etc/init.d/httpd start
B、# /usr/local/bin/check_interface &
C、# /etc/init.d/keepalived start

如果没有任何报错,说明服务已经启动,keepalived的日志存放在/var/log/messages中,如果有错误,请自行查看

测试1:当前状态下测试负载均衡情况

方法:打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换

测试2:停止linux01的keepalive,测试负载均衡情况

方法:

A、/etc/init.d/keepalived stop
然后等待几秒可以看到linux01上的lo:0地址已经启动,而linux02上的lo:0已经停止

B、打开ie浏览器,输入http://192.168.211.110,然后不断用ctrl+F5强制刷新,可以看到网页内容在linux01和linux02中切换

测试3:开启linux01上的keepalived,观察linux01是否切换回master

方法:启动keepalived程序,使用ifconfig观察linux01上已经启动了eth0:0接口,同时lo:0接口停止,linux02上eth0;0接口停止,同时lo:0接口启动