一:前言

     Lvs :(Linux Virtual Server)linux 虚拟服务器,是由国人章文嵩于1998年5月创建的开源项目;因其很好的可伸缩性,可靠性和可管理性,一直应用的非常普遍。lvs在实现前端高效的负载均衡的时候,在高并发的情况时,前端的分发器成为整个系统的单点故障。因此考虑对前端的分发器实现高可用,加入一个备用节点。遗憾的是lvs主备之间的资源故障切换在不加入其他软件的时候只能单纯的依靠脚本实现。同时前端分发器在对后端的真实服务的健康检查和故障移除以及故障恢复自动加入集群的功能,也只能以来脚本的实现。这种实现效率不高而且管理也极其不方便。

    keepliaved的出现,有效的解决了上面的问题,虽然keepalived不是唯一的解决方案,但是其轻量级,便捷管理,资源高效切换,服务健康检查等特性。使其和lvs结合使用变得非常普遍。

 

二:软件介绍

    Vrrp: Virtual Routing Redundent Protocol  :虚拟路由冗余协议,它实现了lvs前端分发器的vip地址的漂移,来实现高可用的功能;keepalived+lvs+httpd实现_Linux

如图,企业用户访问互联网的一种架构。为了避免路由器在工作的时候,出现单点故障。所以前端路由做了高可用。但是这种架构对客户端PC来说,带来了不便。因为无法指定一个固定的出口网关接口。所以在出口路由出现故障的时候,客户端必须重新指定网关地址。无疑在一些多PC的公司,这种方式无法让人接受。此时能不能在客户端上固定一个出口网关地址,而在前端路由单点故障的时候自动切换到新的网关设备,而且客户端的网关地址不发生改动。vrrp就可以实现,在开启vrrp协议的前端两台(可以有多台)网关设备,虚拟一层网关设备,而且虚拟出一个内网出口的网关地址。这个地址依附在真实的网关路由上,并通过事先定义的优先级来决定这个地址的绑定在哪台网关设备上。客户端只需要指定这个虚拟的网关地址,在前端一台路由发生单点故障时,能够自动切换路由,而且不会改变这个虚拟地址。这大大减轻了网管的劳动量。

 

vrrp的一些工作特性:

    vrrp可以工作在一主一从或者一主多从的模型型下,只是在主的工作时,从的一般都处于睡眠状态。资源利用率很低。所以现实环境一主一从的模型使用较多。主从的关系通过优先级来定义。从0-255 (0保留不能使用)。vrrp有两个工作模式,一种是抢占模式和非抢占模式。工作在抢占模式,当主节点(Master)出现故障,从节点(Backup)抢占了主的ip资源。而当主的重新上线时,由于优先级高于从节点,而且工作在抢占模式下。所以主节点会把ip资源抢回去。  非抢占模式是在主节点重新恢复,除非从节点故障,否则ip资源不会转移。主从节点之间的信息传递是通过通告来进行的。在主节点无法通告自己的状态时,从节点会在尝试几次(这个值可以定义)后,抢占ip资源。所以主从之间的通告安全认证就很重要。vrrp支持简单的字符认证和md5认证。

 

keepalived就是借助vrrp协议个功能来实现前端vip地址的漂移,从而实现高可用特性。当然keepalived的功能不仅这些。主要的功能如下:

        Ip 软件内部实现了vrrp协议,动态的vip地址漂移;

        Lvs 实现ipvs规则,在配置文件定义。

        Health check  实现后端Realserver的健康检查。

 

 

 

三: 实验

Lvs(DR) + Keepalived+Httpd 拓扑图:

 

keepalived+lvs+httpd实现_解决方案_02

 

注意:本文档使用的拓扑结构如上,用户可根据自己的实验环境做响应的改变!

为了实验配置成功率,需要提前实验的环境和实验前需要注意的事情:

 

实验环境

1.虚拟机版本: Vmware Workstation 9
2.Linux系统版本: Redhat5.8 32 位

实验前的准备: 

1.为了实验不受影响,本实验使用固定地址:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.145.146
NETMASK=255.255.255.0
GATEWAY=192.168.145.1
ONBOOT=yes
HWADDR=00:0c:29:1c:5a:d0

其他地址的修改类似,这里不再写了:

2.修改hosts文件,确保通信的稳定;

vi /etc/hosts
192.168.145.148     job4.node.com   job4   Realserver01
192.168.145.147     job3.node.com   job3   Realserver02 
192.168.145.146     job2.node.com   job2   Director01
192.168.145.137     job1.node.com   job1   Director02

复制这个文件到其他各个节点上面,可以使用scp命令如下:
scp /etc/hosts  job1@:/etc  :其他节点类似
注意:要保证uname -n 和hostname的结果一直


3.时间同步,本文使用的是ntpd服务器

ntpd 172.16.0.1 (这个地址是本地的一个时间服务器)。也可以写成任务计划,每五分钟执行一次命令。
crontab -e
5/*  *  *  *  *  /sbin/ntpd  172.16.0.1

注意: 执行这个命令的前提是,本机必须关闭ntpd服务器,不然会报错。
service  ntpd stop
chkconfig ntpd off


4.关闭iptables
由于lvs的ipvs工作在内核Netfilter框架上的INPUT链中,为了和iptables有冲突,所以要关闭iptables服务;

service  iptables save 
service iptables off
chkconfig iptables off


5.关闭selinux
由于本文档要用到web服务器httpd,所以要关闭selinux;

setenforce  0  :立即生效,重启就会失效

vi /etc/sysconfig/selinux  
SELINUX=permissive  : 这个配置是永久生效

6。配置YUM源,本文档使用的是iso镜像配置。

[base]
name=redhat
baseurl=file:///mnt/Server
gpgcheck=0
enable=1
[Cluster]         # 因为要使用到集群,所以这个仓库必须加上
name=Cluster
baseurl=file:///mnt/Cluster
gpgcheck=0
enable=1

mount  /dev/cdrom /mnt   :挂载iso镜像

其他节点操作如上:



  
配置LVS服务:

一.Realserver 01 和Realserver 02 上面的配置

1.配置arp响应和回复级别

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


2.本实验使用的是lvs的DR模式,所以Realserver需要响应客户端的请求。此时需要绑定vip。因为上面已经配置好了arp响应和回复级别,
所以这里不用担心,Realserver不通过Director的分发响应客户端的请求;

ifconfig lo:0 192.168.145.199 broadcast 192.168.145.199 netmask 255.255.255.255  up
route add -host 192.168.145.199 dev lo:0


3.安装web服务,这里使用web来做后端的负载均衡服务器

yum -y install httpd 

service httpd start
chkconfig httpd on

echo "job1"  >  /var/www/html/index.html
echo "job2" > /var/www/html/index.html    :这里之所以提供两个页面,主要是为了测试

curlhttp://localhost/index.html   :本地测试
 
 
  
4.脚本实现上面的步骤.

#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions

VIP=192.168.145.199
host=`/bin/hostname`
case "$1" in
start)
       # Start LVS-DR real server on this machine.
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        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

        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev lo:0
;;
stop)

        # Stop LVS-DR real server loopback device(s).
        /sbin/ifconfig lo:0 down
        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

;;
status)

        # Status of LVS-DR real server.
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
        if [ ! "$islothere" -o ! "isrothere" ];then
            # Either the route or the lo:0 device
            # not found.
            echo "LVS-DR real server Stopped."
        else
            echo "LVS-DR real server Running."
        fi
;;
*)
            # Invalid entry.
            echo "$0: Usage: $0 {start|status|stop}"
            exit 1
;;
esac


  
四: 配置前端Director分发器  

1.查看系统内核是否支持ipvs功能,如果有如下输出,则表示内核支持ipvs功能

grep -i 'ipvs' /boot/config-2.6.18-308.el5
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS application helper


2.安装ipvsadm工具;

yum -y install ipvsadm 


3.手动配置

ipvsadm -A  -t 192.168.145.199  -s rr    ##使用的是rr转发模式,生成环境多使用wlc

ipvsadm -a -t 192.168.145.199:80 -r 192.168.145.147  -m   ##rr没有指定权重,用户可以自行测试各个转发机制的不同

ipvsadm  -a -t 192.168.1445.199:80 -r 192.168.145.148  -m 


4.打开转发功能
echo 1 >  /proc/sys/net/ipv4/ip_forward

5.添加主机路由
ifconfig eth0:0  192.168.145.199 briadcast 192.168.145.199 netmask 255.255.255.255 up
route add -host 192.168.145.199 dev eth0:0

6.脚本实现上面的配置
#!/bin/bash
#
# LVS script for VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=192.168.145.199
RIP1=192.168.145.147
RIP2=192.168.145.148
PORT=80

#
case "$1" in
start)          

  /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
  /sbin/route add -host $VIP dev eth0:0

# Since this is the Director we must be able to forward packets
  echo 1 > /proc/sys/net/ipv4/ip_forward

# Clear all iptables rules.
  /sbin/iptables -F

# Reset iptables counters.
  /sbin/iptables -Z

# Clear all ipvsadm rules/services.
  /sbin/ipvsadm -C


# In production, however, you should use a weighted, dynamic scheduling method.
  /sbin/ipvsadm -A -t $VIP:80 -s wlc

# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2

  /bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;

stop)
# Stop forwarding packets
  echo 0 > /proc/sys/net/ipv4/ip_forward

# Reset ipvsadm
  /sbin/ipvsadm -C

# Bring down the VIP interface
  /sbin/ifconfig eth0:1 down
  /sbin/route del $VIP
  /bin/rm -f /var/lock/subsys/ipvsadm
  echo "ipvs is stopped..."
;;

status)
  if [ ! -e /var/lock/subsys/ipvsadm ]; then
    echo "ipvsadm is stopped ..."
  else
    echo "ipvs is running ..."
    ipvsadm -L -n
  fi
;;
*)
  echo "Usage: $0 {start|stop|status}"
;;
esac

7.测试


  
四: keepalived的安装,注意keepalived安装在Director01 和Director02 上面

1.本实验使用自制的rpm包,用户也可以用源码包,这里不再演示;

yum -y  --nogpgcheck install keepalived-1.2.7-5.el5.i386

2.配置keepalived基本功能:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost         # 报警邮件发给谁
   }
   notification_email_from #root@localhost   发件人
   smtp_server 127.0.0.1     #   邮件服务器地址
   smtp_connect_timeout 30   #联系超时时间
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {    #定义虚拟路由
    state BACKUP      #  另一端为BACKUP
    interface eth0  # 通告信息和虚拟路由工作在哪个接口
    virtual_router_id 99   #两端必须相同
    priority 100  #  优先级,主节点要大于备用节点
    advert_int 1   #每隔多长时间发送通告信息
    authentication {   #认证
        auth_type PASS
        auth_pass PASSWORD
    }
    virtual_ipaddress {
        192.168.145.199/24  dev eth0 label eth0:0
    }
}

virtual_server 192.168.145.199 80 {  #虚拟地址定义
    delay_loop 6
    lb_algo rr
    lb_kind DR  # lvs使用DR
    nat_mask 255.255.255.0
#    persistence_timeout 50  不需要持久连接
    protocol TCP

    real_server 192.168.145.147 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200   #获取主页的状态码
            }
            connect_timeout 3   #连接超时时长
            nb_get_retry 3      #重试次数
            delay_before_retry 3  #延迟时间
        }
    }
    real_server 192.168.145.148 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200   #获取主页的状态码
            }
            connect_timeout 3   #连接超时时长
            nb_get_retry 3      #重试次数
            delay_before_retry 3  #延迟时间
        }
    }
}


3.复制一份到BACKUP节点上面,并修改相应的参数

scp /etc/keepalived/keepalived.conf  job2:/etc/keepalived/

vi  /etc/keepalived/keepalived.conf  :修改如下参数

state BACKUP  :角色改为BACKUP
priority 100  :优先级改为100




4.在两个Director节点上启动keepalived,并测试。
service keepalived start

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.145.199:80 rr
  -> 192.168.145.148:80           Route   1      0          10       
  -> 192.168.145.147:80           Route   1      0          9    

ifconfig : 查看地址绑定情况

eth0      Link encap:Ethernet  HWaddr 00:0C:29:1C:5A:D0 
          inet addr:192.168.145.146  Bcast:192.168.145.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3197 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2719 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:535406 (522.8 KiB)  TX bytes:553645 (540.6 KiB)
          Interrupt:59 Base address:0x2000

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:1C:5A:D0 
          inet addr:192.168.145.199  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:59 Base address:0x2000

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)

 
网页页面测试
keepalived+lvs+httpd实现_Linux_03



五:keepalive功能测试

FailBack测试,在Realserver全都down掉以后,依然给用户提供一个提醒页面;



1.Director01 和Director 02 安装httpd服务

yum -y install httpd 

echo "服务正在维护!!" > /var/www/html/index.html

service httpd start

2.配置keepalived

vi   /etc/keepalived/keepalived.conf

virtual_server 192.168.145.199 80 {  #虚拟地址定义
    delay_loop 6
    lb_algo rr
    lb_kind DR  # lvs使用DR
    nat_mask 255.255.255.0
#    persistence_timeout 50  不需要持久连接
    protocol TCP

     sorry_server 127.0.0.1  80   #注意:  这一行是多加的行

    real_server 192.168.145.147 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200   #获取主页的状态码
            }
            connect_timeout 3   #连接超时时长
            nb_get_retry 3      #重试次数
            delay_before_retry 3  #延迟时间
        }
    }

3.重启keepalived服务
service  keepalived restart


4.关闭realserver的web服务器

service httpd stop


5.在Director查看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.145.199:80 rr
  -> 127.0.0.1:80                 Local   1      0          0    


6.页面测试

keepalived+lvs+httpd实现_解决方案_04

 

 

  

7.此时把Realserver 的web服务启动
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.145.199:80 rr
  -> 192.168.145.147:80           Route   1      0          0        
  -> 192.168.145.148:80           Route   1      0          0  

注意:此时127.0.0.1,被删除,Realserver重新上线;

keepalive自己建立测试脚本,完成模式切换;

vi /etc/keepalived/keepalived.conf :注意在实例之外加入如下内容

vrrp_script  chk_schedown {
        script "[ -e /etc/keepalived/down ] && exit 1 || exit 0"  # 监测是否有这个文件有执行下面的命令,没有>退出
        interval 2  #监测时间
        weight -2   # 如果有down文件服务的优先级减2
        fall  2   #失败几次为失败
        rise 1 #成功一次就成功
}


另外在实例内添加如下内容:

virtual_ipaddress {
        192.168.145.199/24  dev eth0 label eth0:0
    }
    track_script {         #从这行起往下三行为添加内容
        chk_schedown
}



2.重启keepalived服务

service keepalived restart


3.测试
cd /etc/keepalived

touch down

查看日志,显示地址转移了:
tail   /var/log/messages
May 16 21:30:35 job2 Keepalived_vrrp[4503]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.145.199
May 16 21:30:35 job2 Keepalived_vrrp[4503]: Netlink reflector reports IP 192.168.145.199 added
May 16 21:30:40 job2 Keepalived_vrrp[4503]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.145.199
May 16 21:32:58 job2 Keepalived_vrrp[4503]: VRRP_Script(chk_schedown) failed
May 16 21:32:58 job2 Keepalived_vrrp[4503]: VRRP_Instance(VI_1) Received higher prio advert
May 16 21:32:58 job2 Keepalived_vrrp[4503]: VRRP_Instance(VI_1) Entering BACKUP STATE
May 16 21:32:58 job2 Keepalived_vrrp[4503]: VRRP_Instance(VI_1) removing protocol VIPs.
May 16 21:32:58 job2 Keepalived_vrrp[4503]: Netlink reflector reports IP 192.168.145.199 removed
May 16 21:32:58 job2 Keepalived_healthcheckers[4501]: Netlink reflector reports IP 192.168.145.199 removed
May 16 21:32:58 job2 avahi-daemon[3149]: Withdrawing address record for 192.168.145.199 on eth0.