lvs实现负载均衡及keepalived高可用

#############1.相关概念

1.负载均衡集群
负载均衡集群是load–balance集群的简写,常用的负载均衡开源软件有nginx,lvs,haproxy,商业的硬件负载均衡设备F5,Netscale.负载均衡(LB)的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡的分发到后端真正服务器(real server)上,为了避免不同机器上用户请求得到的数据不一样,需要用到共享存储,这样保证所有机器请求的数据是一样的。
是这里主要是学习LVS。
2.负载均衡lvs基本介绍
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:
通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
LVS 集群分为三层结构:
1.负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器(多台LB IP)上执行,而client端认为是返回来一个同一个IP(通常把这个IP 称为虚拟IP/VIP)。
2.服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTP,MAIL,DNS。
3.共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务 。
3.Lvs的组成。
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
(1) ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
(2)ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
4.LVS的关键词总结。

    DS:Director Server。指的是前端负载均衡器节点。
    RS:Real Server。后端真实的工作服务器。
    VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
    DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
    RIP:Real Server IP,后端服务器的IP地址。
    CIP:Client IP,访问客户端的IP地址。

5.LVS的基本工作原理。
这里写图片描述

1.当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。
2.PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链.
3.IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链.
4.POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器.
6.LVS的十种调度算法
[1].轮叫调度(Round Robin)
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
[2].加权轮叫(Weighted Round Robin)
调度器通过”加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
[3].最少链接(Least Connections)
调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
[4].加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
[5]基于局部性的最少链接(Locality-Based Least Connections)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用”最少链接”的原则选出一个可用的服务 器,将请求发送到该服务器。
[6]带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。
[7].目标地址散列(Destination Hashing)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
[8]源地址散列(Source Hashing)
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
[9]. 最短的期望的延迟(Shortest Expected Delay Scheduling SED)
基于wlc算法。这个必须举例来说了ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算A:(1+1)/1B:(1+2)/2C:(1+3)/3根据运算结果,把连接交给C
[10].最少队列调度(Never Queue Scheduling NQ)
无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算

7. LVS的三种工作模式

1.DR工作模式,即Direct Routing模式。这种模式中,调度器直接重写进入包的mac地址,将其改为选定的目标服务器的mac地址,这样就可以到达服务器。但这样的话需要要求IPVS服务器需要和真实服务器在同一局域网内,且真实服务器必须有真实网卡(这样重写了mac地址的报文才可以才可以到达该服务器)
2.NAT工作模式,简单来说就是传统的NAT,进出流量都需要经过调度器,调度器会选择一个目的服务器,将进入流量的目标IP改写为负载均衡到的目标服务器,同时源IP地址也会改为调度器IP地址。机制简单,但限制大,IPVS需要维护每个映射关系,而且进出入流量都需要经过调度器,实际上这个会成为瓶颈。
3.TUN工作模式,即IP Tunneling模式。这种模式中,调度器将进入的包重新包成一个IP包,然后发送给选定的目的服务器,目的服务器处理后,直接将应答发送给客户(当然该重新封装的报文的源IP地址还是要填成调度器的)。
4.FULLNAT工作模式

Heartbeat
Heartbeat 项目是 Linux-HA 工程的一个组成部分,其与lvs在本质上无关。
Heartbeat提供了2个核心的功能正是lvs所需要的,心跳监测部分和资源接管,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,安装了 Heartbeat 的两台机器会通过心跳检测互相检测对方的状态,当检测到对方失效的时候会调用资源接管来做接管服务器,保证高可靠性。
在一个高可靠的lvs集群中,负载调度IPVS部分一般由2台服务器组成,一台负责调度,一台负责备用,当负责调度的服务器出现问题的时候迅速切换到备用机器上,而heartbeat 就是负责检测,负载调度 IPVS 的可用性,并在出现问题的时候切换到备用 IPVS 上面。
ldirectord
ldirectord是专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。
ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控,如果服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用, ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有响应则通过ipvsadm 进行添加。
Keepalived
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现 。IPVS通常与keepalived配合使用,后者也是LVS项目的子项目之一,用于检测服务器的状态。
在lvs体系中,Keepalived主要有如下3个功能:
1 管理LVS负载均衡软件
2 实现对LVS集群节点的健康检查功能
3 作为系统网络服务的高可用功能
即 Keepalived 实现了 heartbeat + ldirectord 的功能。

################2实验

实验前准备:
三台虚拟机(server1为调度器,server2和server3为后端服务器)一台物理机(客户端client)。
物理机:172.25.9.250
虚拟机;
server1:172.25.9.1
server2:172.25.9.2
server3:172.25.9.3
实验一:LVS/DR模式实现负载均衡
DR:client ->vs(调度server1) ->RS(server2.3) ->client
实验步骤:
在server1主机(调度器)上:
(1)配置完整的yum源,便于后面软件的安装。(先在真机上查看完整yum源,然后再调度器(server1)上配置)

root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo 

先查看:
这里写图片描述
后配置:
这里写图片描述
(2)server1的yum源配置完毕会发现包的数量增加;
这里写图片描述
(3)yum源配置好后就可以安装管理集群服务ipvsadm。

root@server1 ~]# yum install ipvsadm -y

(4)添加临时ip,并设置为lvs的vip

root@server1 ~]# ip addr add 172.25.9.100/24 dev eth0
 #添加临时ip
[root@server1 ~]# ipvsadm -A -t 172.25.9.100:80 -s rr 
#-A:添加策略 -t:TCP协议 -s:算法 rr:round roubin 轮询 
#若添加ip错误可用此命令ipvsadm -C 
##-C表示清空策略,后再次添加

(5)vip添加RS地址,并设置为DR模式

[root@server1 ~]# ipvsadm -a -t  172.25.9.100:80 -r 172.25.9.2:80 -g 
#-rRS地址,-gDR模式
[root@server1 ~]# ipvsadm -a -t  172.25.9.100:80 -r 172.25.9.3:80 -g

(6)查询ipvsadm状态
这里写图片描述
(7)保存ipvsadm操作
root@server1 ~]# /etc/init.d/ipvsadm save ##保存策略到文件中
在server2上(realserver):
(1)查看Apache服务测试页内容,并开启httpd服务
[root@server2 ~]# vim /var/www/html/index.html
[root@server2 ~]# /etc/init.d/httpd start
(2)server2作为Real server同样添加虚拟ip地址,与调度器虚拟ip地址一致
[root@server2 ~]# ip addr add 172.25.9.100/24 dev eth0
(3)安装服务并做出拦截IP

 [root@server2 ~]# yum install arptables_jf -y   ##安装arp防火墙 
 arp防火墙用来屏蔽数据包,拦截ip冲突,因为虚拟机与real server的地址一
 致,所以进入real server时需要把虚拟ip DROP掉,即拦截real server的虚拟ip
[root@server2 ~]# arptables -A IN -d 172.25.9.100 -j DROP 
##对input进行拒绝,拒绝客户端访问realserver的虚拟ip,只要输入进来直接DROP掉
[root@server2 ~]# arptables -A OUT -s 172.25.0.100 -j mangle --mangle-ip-s 172.25.0.2  
##对output进行伪装,由于tcp三次握手,出去时仍要以vip地址形式才会握手,而真正将数据传输
给客户端的就是realserver,mangle参数就是这个功能。
[root@server2 ~]# /etc/init.d/arptables_jf save

(4)查看arp防火墙状态。
这里写图片描述
在server3(realserver)上:
(1)查看Apache服务测试页内容,并开启httpd服务
[root@server2 ~]# vim /var/www/html/index.html
[root@server2 ~]# /etc/init.d/httpd start
(2)配置虚拟IP(vip)

[root@server3 ~]# yum install -y arptables_jf
[root@server3 ~]# ip addr add 172.25.7.100/24 dev eth0
[root@server3 ~]# arptables -A IN -d 172.25.7.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.7.100 -j mangle --mangle-ip-s 172.25.7.3
[root@server3 ~]# /etc/init.d/arptables_jf  save
Saving current rules to /etc/sysconfig/arptables:          [  OK  ]

实验测试:
在物理机上(client)访问虚拟IP(vip)
这里写图片描述
在调度器(server1)查看ipvsadm状态,server2、3负载均衡,ipvsadm -l ##表示查看策略
这里写图片描述
显示arp缓冲区中的条目
物理机arp缓冲区中MAC地址与server1的MAC地址相同,说明server1成功作为调度器被使用。
这里写图片描述
实验二:LVS健康检查
步骤:
在server1主机(VS:virtual server)上:
(1)下载并安装监控软件(下载地址:http://rpm.pbone.net/index.php3/stat/4/idpl/23860919/dir/centos_6/com/ldirectord-3.9.5-3.1.x86_64.rpm.html

root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm 
[root@server1 ~]# rpm -ql ldirectord     #查找配置文件
[root@server1 ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d
[root@server1 ~]# cd /etc/ha.d
[root@server1 ha.d]# ls
ldirectord.cf  resource.d  shellfuncs
[root@server1 ha.d]# vim ldirectord.cf         #修改配置文件

这里写图片描述

[root@server1 ha.d]# vim ldirectord.cf #修改配置文件
virtual=172.25.9.100:80              #vip指定
        real=172.25.9.2:80 gate      #RS指定
        real=172.25.9.3:80 gate
        fallback=127.0.0.1:80 gate   #server2、3服务down后,访问本机80端口
        service=http
        scheduler=rr         #轮询
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80         #端口
        request="index.html"          #访问文件
        #receive="Test Page"
        #virtualhost=www.x.y.z
[root@server1 ha.d]# /etc/init.d/ldirectord start  #开启服务

(2)修改server1默认发布页

root@server1 ha.d]# cd /var/www/html
[root@server1 html]# vim index.html  
 #注意:当安装 php 模块后,默认优先读取 index.php,应将index.php删除,
 才可读取Index.html.

这里写图片描述
(3)不支持端口转发,修改为默认端口80.

root@server1 html]# vim /etc/httpd/conf/httpd.conf
Listen 80
[root@server1 html]# /etc/init.d/httpd start
#若无法重启查看是否关闭了varnish(端口冲突,varnish之前端口为80)
# /etc/init.d/varnish stop

(4)在server1(vs)进行测试。
这里写图片描述
关闭server2(RS)和server3(RS)的httpd后,再次测试:

root@server2 ~]# /etc/init.d/httpd stop
[root@server3 ~]# /etc/init.d/httpd stop

查看ipvsadm的状态:
这里写图片描述
物理机测试(客户端访问vip)
这里写图片描述
实验三:高可用集群High-Avaliability
步骤:
在server1上(virtual server):
keepalived同样可以对lvs后端主机实现健康检查,同样也可以实现调度器高可用,架设多个keepalived可以实现高可用。
应该注意的是ldirectord和keepalived只能开启一个,开启两个会冲突。
(1)停止 ldirectord 服务

root@server1 ~]# /etc/init.d/ldirectord stop
[root@server1 ~]# chkconfig ldirectord off

(2)下载并压缩keepalived
下载地址:http://www.keepalived.org/software/

[root@server1 ~]# yum  install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm -y
[root@server1 ~]# tar  zxf  keepalived-2.0.6.tar.gz
[root@server1 ~]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV

注意:在./configure时会报错,要求安装依赖性服务,按要求安装没有的服务即可。
这里写图片描述
root@server1 keepalived-2.0.6]# yum install openssl-devel libnl3-devel ipset-devel iptables-devel libnfnetlink-devel
(3)进行源码编译

源码编译三部曲:
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV
[root@server1 keepalived-2.0.6]# make
[root@server1 keepalived-2.0.6]# make install

(4)在编译结束后,对keepalived进行配置。
先生成软链接:

[root@server1 ~]# cd /usr/local/keepalived/etc/rc.d/init.d/
[root@server1 init.d]# chmod +x keepalived 
[root@server1 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc
[root@server1 local]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
[root@server1 local]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/
[root@server1 local]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

再修改keepalived配置文件:

[root@server1 init.d]# vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict         ---一定要注释掉              
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 12          
    priority 100                         ##权重,数值要大于BACKUP的
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.9.100
    }
} 
virtual_server 172.25.9.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
   # persistence_timeout 50                
    protocol TCP

    real_server 172.25.9.2 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.9.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

(5)新建子镜像(快照)虚拟机server4.并将server1的配置文件复制给server4。

[root@server1 ~]# scp -r /usr/local/keepalived/ server4:/usr/local/
[root@server1 ~]# scp -r /etc/keepalived/keepalived.conf server4:/etc/keepalived/

(6)删除vip,开启keepalived服务。

[root@server1 keepalived]# ip addr del 172.25.7.100/24  dev eth0
[root@server1 keepalived]# /etc/init.d/keepalived start

在sever4主机中:
(1)安装ipvsadm服务。

root@server4 ~]# yum install ipvsadm -y

(2)配置keepalived服务。
同样先生成相同的软链接:

[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

然后再修改keepalived配置文件:

[root@server4 ~]#cd /usr/local/keepalived/etc/rc.d/init.d
[root@server4 init.d]# chmod +x keepalived 
[root@server4 init.d]# vim /etc/keepalived/keepalived.conf
其他不变,修改此段:
vrrp_instance VI_1 {
    state BACKUP        ###状态为备用
    interface eth0
    virtual_router_id 51
    priority 50        ###修改优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.14.100
    }
}

(3)开启服务

root@server4 keepalived]# /etc/init.d/keepalived start

(4)查看日至(物理机)
这里写图片描述
测试:当server1的keepalived服务关闭

root@server1 keepalived]# /etc/init.d/keepalived stop

这里写图片描述
在server2和server3中开启httpd服务:
/etc/init.d/httpd start
在物理机上:
这里写图片描述
server1主机开启keepalived服务时: (server1优先级高,主用,显示server1的Mac地址)
这里写图片描述
server1主机关闭keepalived服务时: (切换到server4主机,备用,显示server4的Mac地址)
这里写图片描述
注意:当sever1主机再次开启keepalived服务时,MAC地址从server4的变回到了server1的,也就说明了当主用机能够正常工作时,它的优先级高,不会让server4占有它的工作权力。

猜你喜欢

转载自blog.csdn.net/chao199512/article/details/81331920