LVS-DR模式及lvs结合keepalived实现高可用

lvs定义

LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士开发的一个开源项目,1998年5月发布,是中国国内最早出现的自由软件项目之一。我们只要在server上装了ipvsadm软件包就可以定义ipvs规则,在linux kernel的2.6版本之后kernel是直接支持ipvs的,在此之前的内核版本则需要重新编译内核。

lvs作用

LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

lvs相关术语

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

lvs的三种模式

在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术,它们的大致原理如下:
1.Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。

2.Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

3.Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。

LVS 的负载调度算法

在内核中的连接调度算法上,IPVS 已实现了以下八种调度算法:
1.轮叫调度(Round-Robin Scheduling )
轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行 i = (i + 1) mod n,并选出第 i 台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。

2.加权轮叫调度(Weighted Round-Robin Scheduling )
加权轮叫调度 (Weighted Round-Robin Scheduling)算法可以解决服务器间性能不一的情况,它用相应的权值表示服务器的处理性能,服务器的缺省权值为 1。假设服务器 A 的权值为 1,B 的 权值为 2,则表示服务器 B 的处理性能是 A 的两倍。加权轮叫调度算法是按权值的高低和轮叫方式分配请求到各服务器。权值高的服务器先收到的连接,权值高的服务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。

3.最小连接调度(Least-Connection Scheduling )
最小连接调度(Least- Connection Scheduling)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加 1;当连接中止或超时,其连接数减一。

4.加权最小连接调度(Weighted Least-Connection Scheduling)
加权最小连接调 度(Weighted Least-Connection Scheduling)算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为 1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。

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

6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
带复制的基于局部性最少链接调度(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地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服 务器从服务器组中删除,以降低复制的程度。

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

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

LVS-DR模式

DR模式(直接路由模式)是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境中。

工作原理

在这里插入图片描述
VS/DR模式的工作流程如上图所示,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实 服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

LVS-DR模式下的负责均衡
实验环境

物理机:172.25.254.14
vip:172.25.254.100
server1(VS):172.25.254.1
server2(RS):172.25.254.2
server3(RS):172.25.254.3

server1

修改yum源

vim /etc/yum.repos.d/rhel-source.repo
添加
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.254.14/rhel6.5/LoadBalancer
gpgcheck=0

在这里插入图片描述
安装ipvsadm工具

yum install ipvsadm -y
ip addr add 172.25.254.100/24 dev eth0
ipvsadm -A -t 172.25.254.100:80 -s rr                        #临时添加vip,rr轮询模式
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g       #给vip添加rip,-g表示DR模式 
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g
ipvsadm -ln              #ip方式显示内核虚拟服务器表

在这里插入图片描述

server2

配置apache
在这里插入图片描述
添加VIP
ip addr add 172.25.254.100/32 dev eth0

隐藏RS上的VIP:
DR模式工作在链路层,采用了arp协议,rs表示real server,vs表示vitrual server,假设client的ip为cip,mac地址为m1,调度器vs的ip为vip,mac地址为m2,后端服务器的ip为rip,mac地址为m3,由于DR模式工作在数据链路层,没有经过路由器,所以vs和rs必须在同一个网段,当client访问vip时,在DR模式下,vs通过它本身的一些算法m2改为m3,这样就可以实现直接将数据包丢给rs(这里rs上必须有vip,因为客户端访问的是vip),rs通过解封,得到了vip,通过与自己vip匹配判断数据包确实是给自己的,rs在通过封装,直接将数据发给client,数据包不用原路返回)。由于vs和rs上都有vip,为了避免客户端直接访问RS而不经过调度器,因此采用arptables协议,在rs上添加策略,控制数据传输

yum install  arptables_jf -y
arptables -L         # 查看策略
arptables -A IN -d 172.25.254.100 -j DROP           #当有客户访问此vip时,拒绝访问
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2    #将rip伪装成vip
/etc/init.d/arptables_jf save   # 保存策略

在这里插入图片描述

server3

与server2类似
配置apache
在这里插入图片描述
ip addr add 172.25.254.100/32 dev eth0
yum install arptables_jf -y
arptables -L
arptables -A IN -d 172.25.254.100 -j DROP
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.3
/etc/init.d/arptables_jf save
在这里插入图片描述

物理机测试:

curl 172.25.254.100 实现负载均衡
在这里插入图片描述

arp -an | grep 100      #查看vip的vmac地址,此时vmac地址为server1中eth0网卡的mac地址
arp -d 172.25.254.100   #清除vip的vmac缓存

在这里插入图片描述
在这里插入图片描述

健康检查
server1

directord:专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。
ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控,如果服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用, ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有相应则通过ipvsadm 进行添加。

ipvsadm -C ## 清除之前配置的策略
在这里插入图片描述
配置yum源
vim /etc/yum.repos.d/rhel-source.repo
添加
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.254.250/rhel6.5/HighAvailability
gpgcheck=0
在这里插入图片描述

安装ldirectord,安装包需自行下载
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
在这里插入图片描述

rpm -ql ldirectord      #查看软件在系统中安装文件的路径
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/

在这里插入图片描述

vim /etc/ha.d/ldirectord.cf             
修改
virtual=172.25.254.100:80
    real=172.25.254.2:80 gate
    real=172.25.254.3:80 gate
    fallback=127.0.0.1:80 gate
    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

在这里插入图片描述
配置apache
/etc/init.d/ldirectord start
在这里插入图片描述

物理机测试

curl 172.25.254.100
当server2 与 server3 http服务都正常工作时,实现访问轮询
在这里插入图片描述
二者中一个坏了,一直访问另一个
在这里插入图片描述
在这里插入图片描述
两个都坏了,访问调度器server1
在这里插入图片描述
在这里插入图片描述
当二者中一个恢复时,又继续访问RS
在这里插入图片描述
在这里插入图片描述

lvs结合keepalived实现高可用

Keepalived

Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。IPVS通常与keepalived配合使用,后者也是LVS项目的子项目之一,用于检测服务器的状态。
在lvs体系中,Keepalived主要有如下3个功能:
1 管理LVS负载均衡软件
2 实现对LVS集群节点的健康检查功能
3 作为系统网络服务的高可用功能

实验环境

主机系统:RHEL6 系列
selinux and iptables disabled
实验主机:
LVS ‐ MASTER: 172.25.254.1
LVS ‐ BACKUP: 172.25.254.4
LVS ‐ VIP: 172.25.254.100
Realsever: server2:172.25.254.2 server3:172.25.254.3

server1

关闭刚才的ldirectord
在这里插入图片描述
keepalived的编译安装及配置,安装包需自行下载

tar zxf keepalived-2.0.6.tar.gz
cd keepalived-2.0.6

在这里插入图片描述

yum install openssl-devel -y  #下一条命令需要
./configure --with-init=SYSV --prefix=/usr/local/keepalived  ##对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系,会生成一个Makefile文件,此命令需要安装gcc,--prefix指定安装路径

在这里插入图片描述

make             #是用来编译的,它从Makefile中读取指令,然后编译
make install     #是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

在这里插入图片描述
在这里插入图片描述

chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived              #加可执行权限
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/   #建立软链接
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

在这里插入图片描述
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
        root@localhost        #设置邮件的发送地址
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1      #设置 smtp server 地址
   smtp_connect_timeout 30    #设置连接 smtp 服务器超时时间
   router_id LVS_DEVEL        #load balancer 的标识 ID,用于 email 警报
   vrrp_skip_check_adv_addr
   #vrrp_strict               #严格执行VRRP协议规范,此模式不支持节点单播,必须注释,否则它会自动给server1上防火墙加一条策略,导致实验不能进行
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0            #HA 监测网络接口
    virtual_router_id 24      #主、备机的 virtual_router_id 必须相同,取值 0-255
    priority 100              #主机的优先级,主机优先级一定要大于备机
    advert_int 1              #主备之间的通告间隔秒数
    authentication {          #主备切换时的验证
        auth_type PASS        #设置验证类型,主要有 PASS 和 AH 两种
        auth_pass 1111        #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
    }
    virtual_ipaddress {       #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
        172.25.254.100
    }
}

virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50    
    protocol TCP

    real_server 172.25.254.2 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 172.25.254.3 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/etc/init.d/keepalived start
scp -r /usr/local/keepalived/ 172.25.254.4:/usr/local   #在server1中编译完了可直接拷给server4,不用在server4中再次编译

在这里插入图片描述

server4

配置yum源及安装ipvsadm
keepalived配置同server1:

ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

在这里插入图片描述
scp 172.25.254.1:/etc/keepalived/keepalived.conf /etc/keepalived/ # 将server1的配置文件拷过来
在这里插入图片描述
vim /etc/keepalived/keepalived.conf
修改:
state BACKUP
priority 50
在这里插入图片描述

/etc/init.d/keepalived start
server2与server3

配置apache及arptables策略
在这里插入图片描述
在这里插入图片描述

物理机测试

负载均衡测试:
在这里插入图片描述
高可用测试:
关闭server1的keepalived,server4便接管服务,当启动server1的keepalived时,server1又接管了服务。其间不影响负载均衡

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
健康检测:
在这里插入图片描述

双主模式

server2 和 server3 安装vsftpd服务 并在/var/ftp/建立文件 添加vip

server2

yum install vsftpd -y
/etc/init.d/vsftpd start
touch /var/ftp/server2
ip addr add 172.25.254.200/32 dev eth0
vim /etc/sysconfig/arptables
添加:
[0:0] -A IN -d 172.25.254.100 -j DROP
[0:0] -A IN -d 172.25.254.200 -j DROP
[0:0] -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2
[0:0] -A OUT -s 172.25.254.200 -j mangle --mangle-ip-s 172.25.254.2
/etc/init.d/arptables_jf restart
在这里插入图片描述

server3

类似于server2
yum install vsftpd -y
/etc/init.d/vsftpd start
touch /var/ftp/server3
ip addr add 172.25.254.200/32 dev eth0
vim /etc/sysconfig/arptables
添加:
[0:0] -A IN -d 172.25.254.100 -j DROP
[0:0] -A IN -d 172.25.254.200 -j DROP
[0:0] -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.3
[0:0] -A OUT -s 172.25.254.200 -j mangle --mangle-ip-s 172.25.254.3
/etc/init.d/arptables_jf restart
在这里插入图片描述

server1

vim /etc/keepalived/keepalived.conf
添加

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 124   
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200
    }
}

virtual_server 172.25.254.200 21 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 172.25.254.2 21 {
    	weight 1
    	TCP_CHECK {
        connect_timeout 3
        retry 3
        delay_before_retry 3
    }
}
    real_server 172.25.254.3 21 {
    	weight 1
    	TCP_CHECK {
        connect_timeout 3
        retry 3
        delay_before_retry 3
    }
}
}

在这里插入图片描述
在这里插入图片描述

scp /etc/keepalived/keepalived.conf 172.25.254.4:/etc/keepalived/
/etc/init.d/keepalived restart

在这里插入图片描述

server4

vim /etc/keepalived/keepalived.conf
修改vrrp_instance VI_1 与 vrrp_instance VI_2 的状态与优先级,使server1与server4互为主备
server1 httpd主 vsftpd备
server4 httpd备 vsftpd主
在这里插入图片描述
在这里插入图片描述

/etc/init.d/keepalived restart
物理机测试

高可用测试:
当server1与sever4都正常工作时
httpd服务使用的是server1
在这里插入图片描述
vsftpd服务使用的是server4
在这里插入图片描述
当server1关闭keepalived时,server4接管httpd服务
在这里插入图片描述
当server4关闭keepalived时,server1接管vsftpd服务
在这里插入图片描述
健康检查:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq657886445/article/details/82902116