LVS+KEEPALIVED实现高可用负载均衡架构

LVS+Keepalived实现高可用群集

本实验主要使用LVS的DR模型配合keepalived实现高可用集群

首先我们先来了解一下LVS具体的实现原理

LVS中的DR(directory route)模型基本原理:

当参与集群的计算机和作为控制管理的计算机在同一个网段是可以采用直接路由技术来实现LVS。DR接收到请求包是将直接送到参与集群的节点。VS/DR通过改写请求报文的MAC地址,将请求包发送到RS中,再有RS将响应直接发送回给client。VS/DR技术可以极大地提高集群系统的伸缩性。DR模型对集群中的真实服务器也没有必须想TUN模型一样需要支持ip隧道协议的要求,但是要求调度器与真实服务器通过网卡连接在同一网段中。

LVS的NAT模型基本原理

通过网络地址转换,调度器重写请求报文的目标地址,调度器跟剧相应的调度算法将请求发给相应的RS,后端RS在响应报文通过调度器的时候,报文的源地址会被重写,然后由调度器发给client,从而完成整个调度过程。同时在对数据包进行转换的过程也是需要消耗资源的。

LVS中的TUN模型基本原理

使用NAT技术,由于请求和响应报文都必须经过调度器进行重写,当客户端请求越来越多是,调度器的处理能力可能会成为瓶颈。为了解决这个问题,调度器可以吧请求报文通过ip隧道转发至真正的服务器,在有真正的服务器将响应直接返回给client,这样调度器只需要处理请求报文即可,这点跟DR模型很是相似,但是DR需要所有的机器必须在同一个逻辑局域网中,而TUN模型没有这样的限制。当然TUN模型通过隧道转发就需要重写ip包头因此在性能上面相比于DR模型会比较弱一些。

LVS中支持的常见调度算法:

1、轮询(round robin, rr),加权轮询(Weighted round robin, wrr)――新的连接请求被轮流分配至各RealServer;算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。轮叫调度算法假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度。该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器间的负载不平衡。


2、最少连接(least connected, lc), 加权最少连接(weighted least connection, wlc)――新的连接请求将被分配至当前连接数最少的RealServer;最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各

个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中止或超时,其连接数减一。


3、基于局部性的最少链接调度(Locality-Based Least Connections Scheduling,lblc)――针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用“最少链接”的原则

选出一个可用的服务器,将请求发送到该服务器。


4、带复制的基于局部性最少链接调度(Locality-Based Least Connections with Replication Scheduling,lblcr)――也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而 LBLC算法维护从一个目标IP地址到一台服务器的映射。对于一个“热门”站点的服务请求,一台Cache 服务器可能会忙不过来处理这些请求。这时,LBLC调度算法会从所有的Cache服务器中按“最小连接”原则选出一台Cache服务器,映射该“热门”站点到这台

Cache服务器,很快这台Cache服务器也会超载,就会重复上述过程选出新的Cache服务器。这样,可能会导致该“热门”站点的映像会出现在所有的Cache服务器上,降低了Cache服务器的使用效率。LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合)当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载;当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。


5、目标地址散列调度(Destination Hashing,dh)算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。


6、源地址散列调度(Source Hashing,sh)算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外,它的算法流程与目标地址散列调度算法的基本相似。在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。

7、加权轮询(weighted round robin)

调度器通过“加权轮询”调度算法根据真实服务器的不同处理能力来调度访问请求,这

样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动查询真实服务器

的负载情况,并动态的调整其权值。


注意:在运行LVS中的计算机不能同时运行iptables,因为LVS是监控在iptables中的input链中。

为了实验的顺利进行最好执行以下命令

iptables -F 

setenforce 0 如果对SELINUX熟悉也可以不用关闭该选项。


一、keepalived概述

keepalived是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换和健康检查功能――判断LVS负载调度器,节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集。

1、keepalived的热备原理概述

keepalived采用VRRP(虚拟路由冗余协议)热备份协议,以软件的方式实现Linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案――有多台路由组成一个热备组,通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主路由器提供服务 ,其他路由器处于冗余状态,若当前在线路由器失败,则其他路由器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。热备组内的每台路由器都有可能成为主路由器,虚拟路由器的IP地址可以在热备组内的路由器之间进行转移,所以也称为漂移IP地址。使用keepalived时,漂移地址的实现不需要手动建立虚接口配置文件,而是由keepalived根据配置文件自动管理。


2、安装keepalived所需要支持的软件包

在编译安装keepalived之前,必须先安装内核开发包kernel-devel,以及openssl-devel和popt-devel等支持库。

[root@master /]#yum -y install kernel-devel openssl-devel popt-devel


3、编译安装keepalived

使用指定Linux内核位置对keepalived进行配置,并将安装路径指定为根目录,这样就无需额外创建链接文件了。


[root@master /]#tar zxf keepalived-1.2.2.tar.gz -C /usr/local/

[root@master /]#cd /usr/local/keepalived-1.2.2

[root@master keepalived-1.2.2]#./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-131.0.15.e16.i686

[root@master keepalived-1.2.2]#make && make install


4、启动keepalived服务进程执行make install操作以后,会自动生成“/etc/init.d/keepalived”脚本文件,但还需要手动添加为系统服务,这样就可以使用service,chkconfig工具来对keepalived服务

进程进行管理了。

[root@master /]#chkconfig --add keepalived

[root@master /]#chkconfig keepalived on


二、配置LVS+Keepalived高可用群集

keepalived的设计目标是构建可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器,管理服务器池,而不仅仅用来做双击热备。使用keepalived构建LVS群集更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性,对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入。在基于LVS-Keepalived实现的LVS群集结构中,至少包括两台热备的负载调度器,两台以上的节点服务器,本例将以DR模式的LVS群集为基础,增加一台从负载调度器,使用Keepalived来实现主、从调度器的热备,从而构建建有负载均衡、高可用两

种能力的LVS网站群集平台。拓扑图如下:


实验环境:参照上图可知每台主机网卡的IP地址,如下所示:共7台主机

VIP(虚拟IP地址):192.168.245.100/24

DR_master 192.168.245.130/24

DR_slave 192.168.245.131/24

RS1 192.168.245.128/24

RS2 192.168.245.129/24

具体操作步骤如下:

1、配置各服务器的IP地址以及相应的软件包

调度器:主调度器和从调度器上分别安装keepalived和ipvsadm等软件包,并安装这些软件包的依赖包,具体操作参考文章的上述部分。


2、配置主调度器

Keepalived服务的配置目录位于/etc/keepalived。其中keepalived.conf是主配置文件,另外包括一个子目录samples/,提供了许多配

置样列作为参考。在keepalived的配置文件中,使用”global_defs {……}”区段指定全局参数。使用”vrrp_instance 实例名称 {……}”区

段指定VRRP热备参数,注释文字以”!”符号开头。


[root@master /]#vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived     #!表示注释

global_defs

   notification_email {

        [email protected]                #接收警报的邮箱,可以添加多个

   }

   notification_email_from root@master

   smtp_server 127.0.0.1                #使用本机转发 email

   smtp_connect_timeout 30

   router_id  MASTER                #本服务器的名称,备份组内唯一

}

vrrp_instance  VI_1 {                   #定义VRRP热备实例

    state MASTER           #热备状态,MASTER(主);SLAVE(从);BACKUP(备份)

    interface eth0                      #承载VIP地址的物理接口

    virtual_router_id 50                #虚拟路由器的ID号,组内保存一致

    priority 100                        #优先级,数值越大优先级越高。

    advert_int 1                      #主备之间的通告间隔秒数(心跳频率)

    authentication {                  #认证信息,每个热备组保持一致

        auth_type PASS                #认证类型,主备切换时的验证

        auth_pass 1111                #密码字串

    }

    virtual_ipaddress {               #指定漂移地址(VIP),可以有多个

        192.168.245.100                 #HA 虚拟 ip,可加多个

    }

}

virtual_server 192.168.245.100 80 {  #虚拟服务器地址(VIP)、端口

    delay_loop 6                   #健康检查的间隔时间(秒)

    lb_algo rr                     #lvs 调度算法,这里使用轮询

    lb_kind DR                     #lvs 负载均衡机制,这里使用直连路由

!    persistence_timeout  50       #同一IP连接50秒内被分配到同一台服务器

    protocol TCP                     #用 TCP 协议检查 realserver 状态

    real_server 192.168.245.128 80 {  #第一个WEB节点的地址、端口

        weight 1                     #节点的权重

        TCP_CHECK {                  #健康检查方式

            connect_port 80          #检查的目标端口

            connect_timeout 3        #故障重试秒数(即连接超时)

            nb_get_retry 3           #重试延迟(即重试次数)

            delay_before_retry 3     #重试间隔(秒)

        }

    }

    real_server 192.168.245.129 80 {  #第二个WEB节点的地址、端口

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

 real_server 172.16.16.179 80 {  #第三个WEB节点的地址、端口

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

 real_server 172.16.16.180 80 {  #第四个WEB节点的地址、端口

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

[root@master /]#service keeplaived restart      //重启keepalived服务

配置完keepalived后,还需要配置负载调度器,加载ip_vs模块,安装ipvsadm软件包.这里使用的是LVS-DR模式,需要调整/proc系统的内核响应参数。


[root@master ~]# yum install ipvsadm

然后再编辑:

[root@master ~]# vim /etc/sysctl.conf 

添加如下内容

......//省略部分内容

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.eth0.send_redirects = 0

net.ipv4.conf.eth1.send_redirects = 0

[root@master /]#sysctl -p


3、配置从调度器

从调度器的配置与主调度器基本相同,也包括全局参数、热备参数、服务器池配置,只需要调整router_id、state、prority参数即可,

其余内容完全相同,配置完成以后重启keepalived服务。


[root@slave /]#vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived 

global_defs

   notification_email {

        [email protected]            

   }

   notification_email_from root@slave

   smtp_server 127.0.0.1            

   smtp_connect_timeout 30

   router_id  SLAVE            

}

vrrp_instance  VI_1 {               

    state BACKUP      

    interface eth0                  

    virtual_router_id 50            

    priority 99                    

    advert_int 1                  

    authentication {              

        auth_type PASS            

        auth_pass 1111            

    }

    virtual_ipaddress {           

        192.168.245.100             

    }

}

virtual_server 192.168.245.100 80 {

    delay_loop 6               

    lb_algo rr                 

    lb_kind DR                 

!    persistence_timeout  50   

    protocol TCP                 

    real_server 192.168.245.128 80 {  #第一个WEB节点的地址、端口

        weight 1                 

        TCP_CHECK {              

            connect_port 80      

            connect_timeout 3 

            nb_get_retry 3       

            delay_before_retry 3 

        }

    }

    real_server 192.168.245.129 80 {  #第二个WEB节点的地址、端口

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

[root@slave ~]# /etc/init.d/keepalived restart      //重启keepalived服务

配置完keepalived后,还需要配置负载调度器,加载ip_vs模块,安装ipvsadm软件包.这里使用的是LVS-DR模式,需要调整/proc系统的内核响应参数。


[root@slave ~]# yum install ipvsadm

然后再编辑:

[root@slave ~]# vim /etc/sysctl.conf 

添加如下内容

......//省略部分内容

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.eth0.send_redirects = 0

net.ipv4.conf.eth1.send_redirects = 0

[root@slave /]#sysctl -p

当主从服务器的keepalived服务都起来之后,我们可以使用“ip addr show dev eth0”命令来查看VIP所在的位置,在主调度器上执行此命令时,

发现VIP当前是在主调度器上的。当将主调度器的eth0网卡宕掉时,VIP会转移到从调度器上。


4、配置web节点服务器

配置web节点的时候只需要执行下面脚本可以了。


#!/bin/bash

VIP=192.168.245.100

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

        echo "RealServer start OK"

        ;;  

stop)

        ifconfig lo:0 down

        route del $VIP &> /dev/null

        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 Stop"

        ;;  

*)

        echo "Usage: $0 {start|stop}"

        exit 1

        ;;

esac

exit 0


你可能感兴趣的:(负载均衡,LVS,模型)