LVS负载均衡原理及实现(DR、TUN模式)

1.负载均衡介绍

(1)什么是负载均衡
负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。
通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。均衡负载能够平均分配客户请求到服务器列阵,借此提供快速获取重要数据,解决大量并发访问服务问题。

(2)常见的负载均衡器
根据工作的协议层可划分为:
四层负载均衡(位于内核层):根据请求报文中的目标地址和端口进行调度
七层负载均衡(位于应用层):根据请求报文的内容进行调度,这种调度属于“代理“的方式,如varnish

根据软硬件划分为:
硬件负载均衡:
F5 的 BIG-IP;Citrix 的 NetScaler
软件负载均衡:
a.TCP 层:LVS,HaProxy,Nginx;
b.基于 HTTP协议:Haproxy,Nginx,ATS(Apache Traffic Server),squid,varnish;
c.基于 MySQL 协议:mysql-proxy

2.LVS基础

(1)LVS介绍:

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群

(2)LVS工作原理:
在这里插入图片描述当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。

当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。

LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。

如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。

最后经由POSTROUTING链发往后端服务器

(3) LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
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 后端服务器调度模式(根据LVS工作模式的不同,真实服务器会选择不同的方式将客户需要的数据发送给终端客户)

1、LVS/NAT
2、LVS/DR
3、LVS/Tun
4、LVS/FULLNAT

(6)LVS的八种调度算法
1.轮询调度 rr

这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

  1. 加权轮叫 wrr

这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

  1. 最少链接 lc

这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

  1. 加权最少链接 wlc

这个算法比 lc 多了一个权重的概念。

  1. 基于局部性的最少连接调度算法 lblc

这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

  1. 复杂的基于局部性最少的连接算法 lblcr

记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

  1. 目标地址散列调度算法 dh

该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

  1. 源地址散列调度算法 sh

与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

3.LVS/DR模式的部署和实现

(1)DR模式原理
在这里插入图片描述
①客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。

③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

(2)部署实现:
所需环境:

DS: (DIP)172.25.33.1 和 (VIP)172.25.33.100 server1
RS:172.25.33.2/3 server2/3

<1> server1所作操作:

[root@server1 ~]yum install ipvsadm.x86_64 -y           #下载LVS管理工具ipvsadm
[root@server1 ~]ipvsadm -l                               #查看ipvs的策略
[root@server1 ~] touch /etc/sysconfig/ipvsadm            #ipvs的策略文件,添加以后自动生成
[root@server1 ~]# vim /etc/sysconfig/ipvsadm-config      #ipvs的配置策略,将重启更新的no改为yes
[root@server1 ~]# systemctl restart ipvsadm
[root@server1 ~]# ipvsadm -C                             #清除策略
[root@server1 ~]# ipvsadm -A -t 172.25.33.100:80 -s rr   #添加虚拟lvs的策略
[root@server1 ~]# ipvsadm -a -t 172.25.33.100:80 -r 172.25.33.3:80 -g  #添加lvs的后端服务器(vip)
[root@server1 ~]# ipvsadm -a -t 172.25.33.100:80 -r 172.25.33.2:80 -g
[root@server1 ~]# systemctl restart ipvsadm.service 
[root@server1 ~] ip addr add 172.25.33.100/24 dev eth0

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述<2> server2和server3中的操作:

[root@server2 ~]# systemctl start httpd
[root@server2 ~]# ip addr add 172.25.33.100/24 dev eth0   #因为DR模式是直接后台服务器反包,不会再调度器,所以该操作的目的是用来给客户端反包的
[root@server2 ~]# cd /var/www/html
[root@server2 html]# ls
index.html
[root@server2 html]# cat index.html   
server2

在这里插入图片描述在这里插入图片描述客户端(真机)测试:可以看到并没有轮询
在这里插入图片描述<3> 解决不轮询,server2/3操作如下:

[root@server2 html]yum install arptables  (根据MAC地址的策略)
[root@server2 html]# arptables -nL
Chain INPUT (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)
[root@server2 html]# arptables -A INPUT -d 172.25.33.100 -j DROP
[root@server2 html]# arptables -A OUTPUT -s 172.25.33.100 -j mangle --mangle-ip-s 172.25.33.2
[root@server2 html]# arptables -nL
Chain INPUT (policy ACCEPT)
-j DROP -d 172.25.33.100 

Chain OUTPUT (policy ACCEPT)
-j mangle -s 172.25.33.100 --mangle-ip-s 172.25.33.2 

Chain FORWARD (policy ACCEPT)
[root@server2 html]# cat /etc/sysconfig/arptables 
# Configure prior to use
[root@server2 html]# arptables-save > /etc/sysconfig/arptables
[root@server2 html]# cat /etc/sysconfig/arptables 
*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -j DROP -d 172.25.33.100 
-A OUTPUT -j mangle -s 172.25.33.100 --mangle-ip-s 172.25.33.2 
[root@server2 html]# systemctl start arptables

但是若策略书写错误:arptables -F 全部刷新

现在重新进行测试:实现了轮询
在这里插入图片描述DR模式总结:
1、通过在调度器 LB 上修改数据包的目的 MAC 地址实现转发。注意源地址仍然是 CIP,目的地址仍然是 VIP 地址。

2、请求的报文经过调度器,而 RS 响应处理后的报文无需经过调度器 LB,因此并发访问量大时使用效率很高(和 NAT 模式比)

3、因为 DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和调度器 LB 只能在一个局域网里面

4、RS 主机需要绑定 VIP 地址在 LO 接口(掩码32 位)上,并且需要配置 ARP 抑制。

5、RS 节点的默认网关不需要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就可以。

6、由于 DR 模式的调度器仅做 MAC 地址的改写,所以调度器 LB 就不能改写目标端口,那么 RS 服务器就得使用和 VIP 相同的端口提供服务。

7、直接对外的业务比如WEB等,RS 的IP最好是使用公网IP。对外的服务,比如数据库等最好使用内网IP。

4.LVS/TUN 隧道模式的部署和实现

(1)TUN原理:
在这里插入图片描述①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

(2)TUN模式的实现
<1> 所需环境同DR模式一样

<2> server1所需操作:

[root@server1 ~]# ipvsadm -C   #清除dr实验中的策略
[root@server1 ~]# ipvsadm -ln
[root@server1 ~]# modprobe ipip   #加载隧道模块,出现tunl0设备
[root@server1 ~]# ip addr del 172.25.33.100/24 dev eth0
[root@server1 ~]# ip addr add 172.25.33.100/24 dev tunl0
[root@server1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:ca:94:99 brd ff:ff:ff:ff:ff:ff
    inet 172.25.33.1/24 brd 172.25.33.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:feca:9499/64 scope link 
       valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
    inet 172.25.33.100/24 scope global tunl0
       valid_lft forever preferred_lft forever
[root@server1 ~]# ip link set up tunl0       #激活设备
[root@server1 ~]# ipvsadm -A -t 172.25.33.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.33.100:80 -r 172.25.33.2:80 -i
[root@server1 ~]# ipvsadm -a -t 172.25.33.100:80 -r 172.25.33.3:80 -i
[root@server1 ~]# systemctl restart ipvsadm
[root@server1 ~]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.33.100:80 -s rr
-a -t 172.25.33.100:80 -r 172.25.33.2:80 -i -w 1
-a -t 172.25.33.100:80 -r 172.25.33.3:80 -i -w 1

在这里插入图片描述在这里插入图片描述<3> server2/3所需操作

[root@server2 html]# modprobe ipip    #加载隧道模块
[root@server2 html]# ip addr del 172.25.33.100/24 dev eth0  
[root@server2 html]# ip addr add 172.25.33.100/24 dev tunl0
[root@server2 html]# ip link set up tunl0   #激活tunl0网卡
[root@server2 html]# sysctl -a | grep rp_filter  #反向过滤规则,如果进来的和出去的包不一样就会被过滤
[root@server2 html]# sysctl -w net.ipv4.conf.all.rp_filter=0   #将所有是1的该为0
net.ipv4.conf.all.rp_filter = 0
[root@server2 html]# sysctl -w net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.rp_filter = 0
[root@server2 html]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.eth0.rp_filter = 0
[root@server2 html]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter = 0
[root@server2 html]# sysctl -p   #激活设置

在这里插入图片描述在这里插入图片描述<4> 测试:实现了轮询
在这里插入图片描述
TUN模式总结:
1.TUNNEL 模式必须在所有的 realserver 机器上面绑定 VIP 的 IP 地址

2.TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内

3.TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了

4.TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用。

优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

发布了168 篇原创文章 · 获赞 1 · 访问量 2980

猜你喜欢

转载自blog.csdn.net/yrx420909/article/details/104423334