LVS + keepalived构建高可用的负载均衡方案

本章目录:

a) Keepalived简介

b) Keepalived VRRP协议 简介

c) Keepalived实现和配置

d) Keepalived 配置信息介绍

e) LVS + keepalived + Nginx + Tomcat构建高可用集群

f) LVS + keepalived + Tomcat负责均衡及高可用实现 

   i. LVS介绍

   ii. LVS常用的负载均衡技术及调度算法介绍

Keepalived简介

      keepalived主要是为了实现LVS的高可用而产生的,为此他实现了如下三个功能:ip地址转移、LVS规则转移和后端服务器健康状况检测。我们来一一分析。

     keepalived高可用对之间是通过VRRP协议通信的, VRRP协议是通过竞选机制确定主备的,主的优先级高于备,因此,工作时会获得所有的资源,备节点等待状态,当主节点挂了时候,备节点接管主节点资源,然后顶替主节点对外服务。通过IP多播方式实现通信,主发包,备接包,当备接不到主发的包的时候,就启动程序接管主的资源。

VRRP协议

     VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

   在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP。

( 为了解决网络高可用的实现机制,它能实现路由网关地址的漂移,以解决网关损坏而带来的网络故障)

而keepalived的ip地址转移功能正是通过软件的方式模拟了VRRP协议的实现,其工作示意图如下:

  blob.png

     一旦master出现故障,VRRP会根据优先级的高低在多个路由上选择master,并尝试重新获取原来master信息,如果在规定时间段内没有应答,新的网关将漂移到新master上。而多个路由之间则通过互传在线信息以确保自己的状态,一旦发现没有信息,在等待一定时间段后便可顶替成为master。这就是VRRP的工作流程。它还有很多的定义,如:

    备份组:将多个网关设备组成一个虚拟设备,这个虚拟设备就叫备份组

    角色:分为主设备和从设备,与其优先级有关。只能有一个主,可以有多个从。等

    双主模型:使多台设备互为主从关系来实现其功能。

    这些都能在官方文档中找到,就不在多讲了。主要在于keepalived正是借助于这个协议,运用内部模块虚拟出其功能,来实现ip地址转移功能。

Keepalived实现和配置

     试验环境:  CentOS7、pcre-8.12、nginx-1.0.10、apache-tomcat-7.0.23、keepalived-1.2.24、jdk-7u2-linux-x64.tar.gz、ipvsadm-1.26

  主服务器地址:192.168.1.105

  辅服务器地址:192.168.1.104

  tomcat1: 192.168.1.104:8081

  tomcat2: 192.168.0.105:8081

1、Nginx的安装与部署

     此处忽略;

2、安装Keepalived

   编译安装: 或者你可以通过yum 安装;

#wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz

#tar zxvf keepalived-1.2.7.tar.gz

#cd keepalived-1.2.7

#./configure

#make 

#make install

#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/

 3、将keepalived加入开机服务:

     systemctl enable keepalived.service  设置开机自动启动

      systemctl disable keepalived.service 取消开机自动启动

  或者:

     [root@localhost keepalived-1.1.20]# vi /etc/rc.local 

4、keepalived服务命令:

     ./etc/init.d/keepalived start | stop

      service keepalived start|stop

5、验证是否启动成功:

  blob.png

     说明启动成功

安装问题:

 blob.png

二:keepalived的配置参数解析:

     http://www.cnblogs.com/linuxliu/p/5825108.html

    一个功能比较完整的keepalived 的配置文件,其配置文件keepalived.conf 可以包含三个文本块:全局定义块、VRRP 实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP 实例定义块。

! Configuration File for keepalived
global_defs {
   notification_email {
     admin@lvtao.net #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
   }
   notification_email_from  admin@lvtao.net #设置邮件的发送地址
   smtp_server 127.0.0.1 #设置smtp server地址
   smtp_connect_timeout 30 #设置连接smtp server的超时时间
   router_id LVS_DEVEL #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
}

vrrp_instance VI_1 {
    state MASTER  #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
    interface eth0   #指定HA监测网络的接口
    virtual_router_id 51  #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    priority 100   #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    advert_int 1   #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {   #设置验证类型和密码
        auth_type PASS   #设置验证类型,主要有PASS和AH两种
        auth_pass 1111  #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {   #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        10.0.0.148
    }
}

virtual_server 10.0.0.148 80 {  #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 6        #设置运行情况检查时间,单位是秒
    lb_algo rr         #设置负载调度算法,这里设置为rr,即轮询算法
    lb_kind DR         #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50    #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。                
    protocol TCP #指定转发协议类型,有TCP和UDP两种
    real_server 10.0.0.137 80 {     #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
        weight 3  #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
              #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
        TCP_CHECK { #realserver的状态检测设置部分,单位是秒
            connect_timeout 10      #表示3秒无响应超时
            nb_get_retry 3          #表示重试次数
            delay_before_retry 3    #表示重试间隔
            connect_port 80
        }
    }
    real_server 10.0.0.139 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

其实配置文件中主要要修改的选项没有很多,有三个参数要注意

 route_id  XXX #MASTER和BACKUP不同

 virtual_router_id 51 #同一个实例下,MASTER和BACKUP相同

 priority 100 #优先级,同一个实例下,MASTER高于BACKUP

keepalived的健康检查方式 : 

    http://blog.chinaunix.net/uid-10480699-id-5179873.html

配置问题:

问题1:  

   在我的CentOS7网卡实例是eno16777736,然而在配置文件中配置的interface eth0

   造成keepalived自动断开服务。

   blob.png

      原因是:我的网卡实例是eno16777736;

问题2:

在配置keepalived出现裂脑问题(就是两台机器都有自己的虚拟IP) 如:我的虚拟IP是:192.168.1.120

  #ip add|grep 192.168.1.120

 blob.png

   如果两台机器都出现IP信息,则是出现裂脑问题;

   原因是:我的机器启动了防火墙,解决方式是:1.关闭防火墙 

   2、开启防火墙过滤

    -A INPUT -d 192.168.1.120  -j ACCEPT

    -A INPUT -p vrrp -j ACCEPT

   成功之后可以尝试切换,看看是否IP漂移成功。

   可以尝试把主keepalived stop 用 " ip add|grep 192.168.1.120" 查看备keepalived机器信息会出现虚拟VIP信息,说明两台机器配置成功了。

三、LVS + keepalived + Nginx + Tomcat构建高可用集群

我的架构图是:

 blob.png

       做两台nginx组成一个集群,分别部署上keepalived,设置成相同的虚IP,保证nginx的高可用,当一台nginx挂了,keepalived能够探测到,并将流量自动迁移到另一台nginx上,整个过程对调用方透明

       blob.png

   缺点:

      1)资源利用率只有50%

      2)nginx仍然是接入单点,如果接入吞吐量超过的nginx的性能上限怎么办,例如qps达到了50000咧?

http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959595&idx=1&sn=5f0633afd24c547b895f29f6538baa99&scene=1&srcid=0919Cywx3TamljhT7YTfVnDp#rd

     Nginx跟keepalived的关系比较特殊,keepalived+LVS才是原配。

     因为Nginx监听的是80端口,IP 是本机所有的IP信息。

     blob.png

     所有您的本机器,只要被keepalived配上一下IP,通过这个Vip就能访问到Nginx,所有Nginx+keepalived高可用配置是非常简单的。基于Nginx负载均衡到Tomcat服务此篇省略….,可以看之前的文章;

我的Nginx1(192.168.1.105)配置:

 blob.png

我的Nginx1(192.168.1.104)配置:

 blob.png

 主keepalived配置(192.168.1.105):

 blob.png

备keepalived配置(192.168.1.104):

 blob.png

验证服务有效性:

blob.png

把主keepalived stop 了

 blob.png

备keepalived接管服务。

keepalived的日记查看:

   tail -f /var/log/messages

     注:现在所有的日志都是写入到/var/log/message下的,由于message的日志太多了而keepalived的日志又很那分离出来,所以研究了一下keepalived的日志设置。

具体操作步骤如下:因为我的keepalived 是./configure 默认配置安装。

     我们只需要修改 /etc/sysconfig/keepalived 就可以了

     把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -S 0 -d "

    最后设置syslog,修改  #/etc/rsyslog.conf

      在最后添加:

       local0.*              /var/log/keepalived.log

  重新启动日志

   /etc/init.d/rsyslog restart

 使用以下命令进行验证

   /etc/init.d/keepalived restart;

   tailf /var/log/keepalived.log

 问题:

    当Nginx挂掉了, keepalived不能切换至其他服务上,解决方式:利用脚本定时检测Nginx进程状态,如果Nginx挂了,则stop keepalived服务。

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
 /usr/local/nginx/sbin/nginx
 sleep 5
 if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
 then
 killall keepalived
 fi
fi

接下来将介绍Kppealived的伴侣LVS

LVS介绍

    Linux Virtual Server是 Linux 虚拟服务器,可以把多台服务器虚拟为一个虚拟 IP ,同时实现各种负载均衡算法;

    参考资料: LVS 原理(调度算法、四种模式的实现、四层负载均衡和七层 的区别)

   

LVS(DR)+Keepalived+tomcat实现高可用方案:

IP规划表:

名称 IP 说明

VIP 192.168.1.120 虚拟IP,外部请求IP

调度主 192.168.1.105 Keepalived+LVS主

调度备 192.168.1.104 Keepalived+LVS备

后端服务1 192.168.1.105:80 后端真实服务器1(这里是WEB)

后端服务2 192.168.1.104:80 后端真实服务器2(这里是WEB)

(一) LVS安装

#wget    http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

  建立软连接

   #ln -s /usr/src/kernels/3.10.0-327.el7.x86_64 /usr/src/linux

解压服务安装;

# tar -zxvf ipvsadm-1.26.tar.gz

# cd ipvsadm-1.26

# make;make install 

  以上操作完成后,LVS已经完整完成,安装后的可执行文件ipvsadm在/sbin/下。LVS安装完成后无需独立配置,后续统一由Keepalived进行托管配置和管理。

安装过程遇到的问题:

 blob.png

    解决方式: yum install libnl* libpopt*

 blob.png

    解决方式:  yum install popt-static

(二) Keepalived安装与配置

     Keepalived安装如上述配置流程;

     编辑keepalived配置文件:/etc/keepalived/keepalived.conf,配置和定义虚拟服务器

配置主从服务器

! Configuration File for keepalived
global_defs {
   notification_email {
      acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL_1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.120
    }
}
virtual_server  192.168.1.120  23 {  
        delay_loop 3  
        lb_algo wrr   #权重轮训 lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
        lb_kind DR    #负载均衡转发规则NAT|DR|RUN
        persistence_timeout 0        //会话保存时长(秒),0表示不使用stickyness会话    
        protocol TCP  
        // 后端服务器定义  
        real_server 192.168.1.104 23 {  
           weight 1                   //权重  
           //HttpGET 方式验证真实服务有效性  
           /* HTTP_GET {                   
           url {  
                     //验证后端服务是否正常的访问地址  
                     path /checkRealServerHealth.28055dab3fc0a85271dddbeb0464bfdb  
                     //访问地址内容的 MD5 摘,通过对比摘要验证后端服务器是否可用  
                     digest 26f11e326fc7c597355f213e5677ae75  
               }  
               connect_timeout 3     //连接超时时间  
               nb_get_retry 3        //重试次数  
               delay_before_retry 3  //每次重试前等待延迟时间  
           }  */
         TCP_CHECK { #(通过tcpcheck判断real_Server的健康状态)
               connect_timeout 3 #(real_Server服务3秒无响应超时)
               nb_get_retry 3 #(重连次数3)
               delay_before_retry 3  #(重练间隔时间3)
               connect_port 80 #(健康检查端口)
               bindto 192.168.1.105 #IP 
             }
        }  
        // 后端服务器定义  
        real_server 192.168.1.104 23 {  
           weight 1                   //权重  
           TCP_CHECK {
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
               connect_port 80
                bindto 192.168.1.104
             }
        }  
}

配置备服务器

! Configuration File for keepalived
global_defs {
   notification_email {
      acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL_2
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.120
    }
}
virtual_server  192.168.1.120  23 {  
        delay_loop 3  
        lb_algo wrr                  //定义负载均衡算法,这里是权重轮训  
        lb_kind DR                   //定义模式,这里是Direct route  
        persistence_timeout 0        //会话保存时长(秒),0表示不使用stickyness会话    
        protocol TCP  
        // 后端服务器定义  
        real_server 192.168.1.104 23 {  
           weight 1                   //权重  
           //HttpGET 方式验证真实服务有效性  
           /* HTTP_GET {                   
           url {  
                     //验证后端服务是否正常的访问地址  
                     path /checkRealServerHealth.28055dab3fc0a85271dddbeb0464bfdb  
                     //访问地址内容的 MD5 摘,通过对比摘要验证后端服务器是否可用  
                     digest 26f11e326fc7c597355f213e5677ae75  
               }  
               connect_timeout 3     //连接超时时间  
               nb_get_retry 3        //重试次数  
               delay_before_retry 3  //每次重试前等待延迟时间  
           }  */
         TCP_CHECK {
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
               connect_port 8080
             }
        }  
      
        // 后端服务器定义  
        real_server 192.168.1.104 23 {  
           weight 1                   //权重  
           TCP_CHECK {
               connect_timeout 3
               nb_get_retry 3
               delay_before_retry 3
               connect_port 80
             }
        }  
}

  注:个人在配置的过程中如果connect_port设置的不是80端口, 到时使用VIP访问是会自动带上设定的端口。–待查阅资料。

(三) 配置LVS server客户端

     LVS-DR模式中,后端真实服务器(RealServer)无需安装相关软件,只需要对VIP进行绑定和路由设置等一系列操作,这里整理为一个脚本:lvs_realserver.sh,两个服务应用都需要,详细解释如下

[root@x3250-1 keepalived-1.2.7]# vi /sbin/Lvs_realserver.sh

Lvs_realserver.sh代码:

#!/bin/bash

VIP=192.168.1.120

/etc/rc.d/init.d/functions

case "$1" in

start)

        echo "start LVS of REALServer"

        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

#       /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

;;

stop)

        echo "close LVS REALserver"

        /sbin/ifconfig lo:0 down
#       /sbin/route del -host $VIP dev lo:0
        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 "Usage: $0 {start|stop}"
exit 1
esac

(四) 服务启动和关闭

   调度服务启动:service keepalived start

   调度服务关闭:service keepalived stop

   后端真实服务启动:

       # ./lvs_realserver.sh start

   然后在启动tomcat

(五) 验证测试

   1、停掉LVS_MASTER的keepAlived服务,看LVS_BACKUP是否可以自动加上虚拟IP地址,并且开始转发请求

   2、恢复主服务器的keepAlived服务后,主服务器立刻接替了从服务器的工作

   3、测试WEB服务器,看能否正常提供服务。先断掉104 WEB1,看下效果105WEB效果。

参考链接:

  https://my.oschina.net/shyloveliyi/blog/489754

  http://acooly.iteye.com/blog/1832742

推荐的链接:

  http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959585&idx=1&sn=0a9222cbfeb62a662edffafb7f0b43ae&scene=1&srcid=09197LRuGNSmd2ixl5YOLFfL#rd

  http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959595&idx=1&sn=5f0633afd24c547b895f29f6538baa99&scene=1&srcid=0919Cywx3TamljhT7YTfVnDp#rd

 http://mp.weixin.qq.com/s?__biz=MzA5ODM5MDU3MA==&mid=2650861862&idx=1&sn=976ddfe2517dc42796bc9977d379447c&scene=1&srcid=0726SDYMUxx4jVmEXFm6w1CO#rd

发表评论