www.moko.cc ----李俊
QQ:5161155
 
 
最近学习了lvs+keepalived的高可用,个人觉得比heartbeat+ldirectord+lvs要简单很多,下午没什么工作。
总结一下学习心得吧,大牛、老鸟们可以路过了 ·嘿嘿
至于什么是lvs 什么是heartbeat  什么是keepalived ,如果不懂请GOOGLE一下,这里就不多做说明了。
先做个两者对比吧,仅LVS应用高可用模式进行两者之间对比,纯属个人意见,如有不同观点,请留言指点我,先谢谢了,呵呵
heartbeat+ldirectord+lvs
优点:可用rpm或yum方式直接安装,尤其是ipvsadm不用以tarball方式安装,我用的2.6.18 kernel直接用YUM安装
不用单独为ipvsadm写脚本,直接在ldirectord.cf中设置即可。
缺点:安装设置比lvs+keepalived复杂,需要配置authkeys、ha.cf、haresources、ldirectord.cf 四个配置文件。新手上手比较生疏
 检测后端realserver需要在后端的站点中,单独制作一个页面,目的是为了ldirectord检测realserver的状态用。

lvs+keepalived
优点:配置文件只有一个keepalived.conf就搞定了,配置语法风格通俗易懂,新手上手快。当然,也利于维护。
检测realserver的方式是基于端口状态检测,无需在realserver的站点中单独制作页面(像Squid或Nginx堆后端的话,这点就比HA要好)
缺点:安装需要以tarball的方式,因为keepalived是基于2.4.X kernel的,所以安装的时候,要先安装kelnel source源码包(rpm,tarball都可以)
需要为ipvsadm单独写脚本,ipvsadm 启用并工作后,keepalived才会接管控制ipvsadm。做到检测realserver,同时LVS1和LVS2之间会相互检测(个人见解)

理解也就这么多了,呵呵,比较浅陋。
好了,废话不说了。接下来讲讲lvs+keepalived的安装过程及设置吧。
 系统环境:
                     CentOS 5.2   (2.6.18-53.el5)
                     Nginx             使用80端口
                     Squid             使用80端口
   
     软件包:
     kernel-2.6.18-53.el5.src.rpm                     *** 内核源码包 ***
     ipvsadm-1.24.tar.gz                                     *** ipvsadm的tarball ***
     keepalived-1.1.15.tar.gz                              *** keepalived的tarball ***
     openssl-devel                                               *** openssl的开发包 ***
     kernel-devel                                                  *** 内核的开发包 ***
 
  说明:测试机器共六台
      VIP1:192.168.2.130                                    *** 虚拟地址1 ***
      VIP2:192.168.2.140                                    *** 虚拟地址2 ***
           
      LVS1:192.168.2.131                                   *** 主LVS ***
      LVS2:192.168.2.132                                   *** 备用LVS ***
     
      RIP1:192.168.2.133                                   *** Nginx1 ***
      RIP2:192.168.2.134                                   *** Nginx2 ***
                   
      RIP3:192.168.2.135                                   *** Squid1 ***
      RIP4:192.168.2.136                                   *** Squid2 ***
登陆主lvs后,开始安装软件包
1.1 安装内核源码包
# rpm --import  /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5     *修正rpm包安装key警告*
# useradd  mockbuild                                           ***建立内核源码包安装所需用户***
# rpm -ivh kernel-2.6.18-53.el5.src.rpm
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target=i686 kernel-2.6.spec
#ln -s /usr/src/kernels/2.6.18-53.el5-i686  /usr/src/linux       ***为内核源码包做链接***
# cd /usr/src/linux
# vi Makefile
修改 EXTRAVERSION = -prep
该成 EXTRAVERSION = -53.el5
# uname -r                                         ***保持跟uname -r 的版本一致 检测一下***
2.6.18-53.el5
# head -n4 Makefile                         ***看到一致了***
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
EXTRAVERSION = -53.el5
 OK,内核源码包安装完了。
1.2 安装ipvsadm
#yum install openssl-devel             *** 安装openssl开发包***
#yum install kernel-devel                  *** 安装kernel开发包***
#tar zxvf ipvsadm-1.24.tar.gz
#cd ipvsadm-1.24
#make && make install
1.3 安装keepalived
#tar zxvf keepalived-1.1.15.tar.gz
#cd keepalived-1.1.15
.#/configure –sysconf=/etc/     
#make && make install
如果刚才你配置的时候没加 --sysconf=/etc/ ,那么就执行以下命令,把配置文件和执行文件拷贝到相应的目录里。
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/
 
1.4 配置ipvsadm,编写启动脚本
#vi dlvs
输入以下代码
#!/bin/bash
#2009-06-02 by Minyoni  http://adidas.blog.51cto.com
#Nginx Realserver ipaddress
RIP1=192.168.2.133
RIP2=192.168.2.134
#Squid Realserver ipaddress
RIP3=192.168.2.135
RIP4=192.168.2.136
#Virtual ipaddress
VIP1=192.168.2.130
VIP2=192.168.2.140
/etc/rc.d/init.d/functions
 
case "$1" in
 
start)
echo " start LVS of DirectorServer"
 
# set the Virtual IP Address and sysctl parameter
/sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
/sbin/ifconfig eth0:1 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
/sbin/route add -host $VIP1 dev eth0:0
/sbin/route add -host $VIP2 dev eth0:1
echo "1" >/proc/sys/net/ipv4/ip_forward
 
#Clear IPVS table
/sbin/ipvsadm -C
 
#set LVS
#Nginx Realserver
/sbin/ipvsadm -A -t $VIP1:80 -s wrr -p 600
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g
#Squid Realserver
/sbin/ipvsadm -A -t $VIP2:80 -s wrr -p 600
/sbin/ipvsadm -a -t $VIP2:80 -r $RIP3:80 -g
/sbin/ipvsadm -a -t $VIP2:80 -r $RIP4:80 -g
 
#Run LVS
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
/sbin/ifconfig eth0:1 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
好,:wq 保存退出。
这样LVS的ipvsadm启动脚本就写好了,接着
#chmod 755  dlvs                                         *** 赋予可执行权限***
1.5  配置keepalived
#mv /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf.old
#vi /etc/keepalived/keepalived.conf
输入以下代码
! Configuration File for keepalived
global_defs {
   notification_email {
     lijun_hot@163.com           #如果本机没有SMTP服务,报警信还是发不出去,汗
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_instance VI_1 {
    state MASTER             #备份服务器上将MASTER改为BACKUP
    interface eth0       #HA监测网络接口
    virtual_router_id 51     #主、备机的virtual_router_id一定要相同,必须相同!!!
    priority 100       #主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1       #VRRP Multicast广播周期秒数
    authentication {  
        auth_type PASS      #VRRP认证方式
        auth_pass 1111      #VRRP口令字
    }
    virtual_ipaddress {
        192.168.2.130      #LVS虚拟地址,可写多个VIP,一行一个VIP
        192.168.2.140
    }
}
 
virtual_server 192.168.2.130 80 {
    delay_loop 2                      #延时等待时间           
    lb_algo wrr                         #轮询算法
    lb_kind DR                         #传输模式
    persistence_timeout 600                 #单一链接重连保持时间,这里设置600秒
    protocol TCP
 
  real_server 192.168.2.133 80 {
        weight 1                           #权重
        TCP_CHECK {               #realserve的状态检测设置部分,单位是秒
            connect_timeout 3   
            nb_get_retry 3           
            delay_before_retry 3
        }
    }
  real_server 192.168.2.134 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
virtual_server 192.168.2.140 80 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    persistence_timeout 600
    protocol TCP
 
  real_server 192.168.2.135 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
  real_server 192.168.2.136 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

好,:wq保存退出。
1.5 配置sysctl.conf并使其新配置生效
#vi  /etc/sysctl.conf
输入以下代码
net.ipv4.ip_forward=0
net.ipv4.conf.all.send_redirects=1
net.ipv4.conf.default.send_redirects=1
net.ipv4.conf.eth0.send_redirects=1
好,:wq保存退出。
#sysctl -p                              ***新配置生效了***
到这里,主LVS的安装和设置工作就完成了。
备用LVS的安装和设置,和主LVS一样,不同的是配置keepalived的时候,只要把主LVS的配置文件/etc/keepalived/keepalived.conf ,拷贝到备用LVS的对应位置/etc/keepalived/keepalived.conf。
然后更改以下两项,其他安装和配置和主LVS一样。
1.
state MASTER             #备份服务器上将MASTER改为BACKUP,因为备用LVS一定要
                                           用BACKUP
更改完后就是这样的
state BACKUP
2.
priority 100              #主、备机取不同的优先级,主机值较大,备份机值较小,所以备
                                     用LVS我取90
更改完后就是这样的
priority 90
OK,这样,就可以了。主,备LVS,都已经安装配置完了
现在我们设置realserver就可以了
2.1 配置realserver,编写启动脚本
我们先来配置Nginx应用的realserver。
登陆RIP1:192.168.2.133                    (Nginx1)
#vi rs
输入以下代码
#!/bin/bash
#2009-06-02 by Minyoni  http://adidas.blog.51cto.com
VIP=192.168.2.130
 
/etc/rc.d/init.d/functions
 
case "$1" in
start)
       ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
 
       ;;
stop)
       ifconfig lo:0 down
       route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
 
exit 0
好,:wq保存退出
#chmod 755 rs                     ***赋予可执行权限***
登陆RIP3:192.168.2.134                    (Nginx2)
重复刚才的工作。
2.2 现在我们来配置Squid应用的realserver。
登陆RIP1:192.168.2.135                    (Squid1)
#vi rs
输入以下代码
#!/bin/bash
#2009-06-02 by Minyoni  http://adidas.blog.51cto.com
VIP=192.168.2.140
 
/etc/rc.d/init.d/functions
 
case "$1" in
start)
       ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
 
       ;;
stop)
       ifconfig lo:0 down
       route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
 
exit 0
好,:wq保存退出
#chmod 755 rs                     ***赋予可执行权限***
登陆RIP4:192.168.2.136                    (Squid2)
重复刚才的工作。
3.1 启动keepalived+lvs
到此为止,所有的安装配置工作全部都做完了。我们来启动keepalived+lvs,让其工作
首先登陆
      RIP1:192.168.2.133                                   *** Nginx1 ***
      RIP2:192.168.2.134                                   *** Nginx2 ***
                   
      RIP3:192.168.2.135                                   *** Squid1 ***
      RIP4:192.168.2.136                                   *** Squid2 ***
启动相应的应用程序Nginx和Squid
然后在这4台服务器上都执行rs脚本, 千万要记得你的rs脚本保存在哪里了
rs脚本的用法
#./rs start             ***启动realserver的虚拟IP***
#./rs stop             ***停止realserver的虚拟IP***
我们现在启动realserver的虚拟IP
#./rs start
RealServer Start OK                            ***提示启动虚拟IP成功***
接着查看一下
#ifconfig lo:0                               ***查看虚拟IP信息,你会看到信息***
然后把其余3台都执行一次
 #./rs star
现在登录
             LVS1:192.168.2.131                                    *** LVS1 ( 主)***
             LVS2:192.168.2.132                                    *** LVS2 备用)***
  
先在  LVS1:192.168.2.131  主LVS上执行dlvs脚本,用法
#./dlvs start    ***启动ipvsadm***
#./dlvs stop    ***停止ipvsadm***
执行
#./dlvs start    ***现在ipvsadm已经启动了***
执行
#service keepalived start                       ***启动keepalived进入LVS的高可用模式***                          
 
在 LVS2:192.168.2.132 备用LVS上执行
#./dlvs start    ***现在ipvsadm已经启动了***
#service keepalived start                       ***启动keepalived进入LVS的高可用模式***
现在LVS已经运行在高可用模式了
回到主LVS上查看ipvsadm 运行情况
#watch ipvsadm -ln
 
停掉RIP1:192.168.2.133    (Nginx1) 的 WEB服务
192.168.2.133 不在列表中了


启动RIP1:192.168.2.133    (Nginx1) 的 WEB服务
192.168.2.133 恢复到列表中了

以上说明了keepalived会自动接管ipvsadm,自动检测realserver的状态
 
 现在来测试主LVS和备用LVS之间的相互检测
停掉主LVS
#./dlvs stop
#service keepalived stop

查看备用LVS的运行状态
先查看下messages
#tail -f /var/log/messages
备用LVS已经接管了工作,状态为MASTER STATE

备用LVS上查看ipvsadm 运行情况
一切还是正常的,接管了工作

 
如果这时候启动主LVS
#./dlvs start
#service keepalived start
查看messages日志
#tail -f /var/log/messages
主LVS又主动接管了工作,状态为MASTER STATE

这个时候,备用LVS的状态一定是BACKUP STATE
 
测试到此就结束了,以上就是我对keepalived+lvs学习的一些总结。过程也许不够好,有错误的地方,希望大家多指点我,我一定虚心受教,先谢谢了。
 
 
注:文中脚本和配置文件,我打包了。
         下载附件即可更改使用