当前位置: > 其它学习 > 网络基础 >

LVS-NAT, LVS-DR, LVS-KEEPALIVED,LVS-TUN配置

时间:2020-01-04 13:09来源:linux.it.net.cn 作者:IT
LVS
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

LVS的组成
一般来说,LVS集群采用三层结构,三层主要组成部分为:

1 负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
2 服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
3 共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。


lvs工作原理
1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器


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地址。


针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:
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)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。


查看ipvsadm设置的规则

[root@lockey packs]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.6:80 wrr
  -> 172.6.6.6:80                 Masq    1      0          0        
  -> 172.6.6.7:80                 Masq    1      0          0        
[root@lockey packs]#


3.测试
在Director主机上通过浏览器测试2台real server的web内容http://192.168.1.6

分别停掉172.6.6.6和172.6.6.7上的Nginx服务然后刷新页面可以看到获取到的数据是不一样的:当6关掉后获取的数据是7上的(7服务正常);当7关掉后获取的数据是6上的(6服务正常);当两台server都关掉的时候提示Unable to connect

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

1.实验环境配置

Director: (eth0 172.25.5.30 vip eth0:0 172.25.5.200) ipvsadm

server1(eth0 172.25.5.10 vip lo:0 172.25.5.200)nginx

server2(eth0 172.25.5.40 vip lo:0 172.25.5.200)nginx


2.运行配置

director配置脚本

#!/bin/bash
echo 1 >/proc/sys/net/ipv4/ip_forward
# director服务器上开启路由转发功能:
ipv=/sbin/ipvsadm
vip=172.25.5.200
rs1=172.25.5.10
rs2=172.25.5.40
ifconfig eth0:0 down
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 3
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1


server1和server2配置脚本

#!/bin/bash
vip=172.25.5.200
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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


3.在Director主机上通过浏览器测试2台real server的web内容http://172.6.6.9,测试结果与NAT的结果类似

3. LVS 与 keepalive
LVS可以实现负载均衡,但是不能够进行健康检查,比如一个real server出现故障,LVS 仍然会把请求转发给故障的real server服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题。

1.实验环境配置,四台主机,两台director1,两台real server

director1:172.25.5.20(ipvsadm + keepalived) BACKUP
director2:172.25.5.30(ipvsadm + keepalived) MASTER

real server1:172.25.5.10(nginx)

real server2:172.25.5.40(nginx)

virtual ip 172.25.5.99


2.运行配置

real server1 和 server2的配置脚本

#!/bin/bash
vip=172.25.5.99
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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


keepalived1 和 keepalived2配置

# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.5.99
    }
}

virtual_server 172.25.5.99 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 1
    protocol TCP

    real_server 172.25.5.10 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 10
                nb_get_retry 2
                delay_before_retry 3
                connect_port 80
        }
    }
    real_server 172.25.5.40 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 10
                nb_get_retry 2
                delay_before_retry 3
                connect_port 80
        }
        }
}


两台keepalived主机的大体配置如上,有一些配置细节需要修改

keepalived1 (172.25.5.30):

vrrp_instance VI_1 {
    state MASTER#作为主控
    priority 100#优先级高

keepalived2 (172.25.5.20):
vrrp_instance VI_1 {
    state BACKUP#作为备控
    priority 90#优先级较主控低


配置完成查看状态ipvsadm:

[root@server3 ~]# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  172.25.5.99:http                  114      704        0    61747        0
  -> 172.25.5.40:http                   53      313        0    24199        0


[root@server2 ~]# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  172.25.5.99:http                    0        0        0        0        0
  -> 172.25.5.40:http                    0        0        0        0        0


3.结果测试,需要在外部可访问主机进行测试(浏览器或者使用curl命令皆可)

for i in {1..50}; do curl 172.25.5.99;sleep 1;done
1
stop nginx on 172.25.5.10 or 172.25.5.40 you will find the rusult be different

当系统运行起来之后虚拟ip首先会在主控节点上,如果我们停掉了主控节点的keepalived服务,那么虚拟ip就会转移到备份节点上,这称之为ip漂移。只要两个控制节点有一个是正常运行的,那么服务就不会中断。

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

IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP 的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

1.环境配置

director: eth0: 172.25.5.30(ipvsadm)
vip(tunl0): 172.25.5.100

real server1: eth0:172.25.5.10(Nginx)
tunl0(vip)  :172.25.5.100

real server2: eth0:172.25.5.20(Nginx)
tunl0(vip) :172.25.5.100

2.运行配置

director(172.25.5.30)配置

  yum install ipvsadm -y
  ifconfig tunl0 172.25.5.100 broadcast 172.25.5.100 netmask 255.255.255.0 up
  route add -host $VIP dev tunl0
  ipvsadm -A -t 172.25.5.100:80 -s rr
  ipvsadm -a -t 172.25.5.100:80 -r 172.25.5.10 -i
  ipvsadm -a -t 172.25.5.100:80 -r 172.25.5.20 -i

real server1 和 real server2(配置同下)

ifconfig tunl0 172.25.5.100 netmask 255.255.255.0 broadcast 172.25.5.100 up
route add -host 172.25.5.100 dev tunl0
echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

3.测试,通过外部主机访问http://172.25.5.100查看页面呈现


(责任编辑:IT)
------分隔线----------------------------