LVS 简介
LVS(Linux Virtual Server):负载均衡调度器,负载均衡又分为四层和七层,本文章讲述的是四层的LVS负载均衡调度器。
DS:调度器,lvs的前端设备
RS:真正提供服务的后端服务器
RIP:后端服务器的ip地址
DIP:调度器和后端服务器通信的ip
源IP:CIP(客户端的IP)
目的IP:VIP(设置的统一入口),对外公布的ip,客户请求进来的ip
源MAC地址:DS调度器的MAC地址
目的MAC地址:RS真正服务器的MAC地址
LVS 的集群的四种工作模式:
1、lvs-nat:修改请求报文的目标 IP ,多目标 IP 的 DNAT。
2、lvs-dr:操作封装新的MAC地址。
3、lvs-tun:在原请求 IP 报文之外新加一个 IP 首部。
4、lvs-fullnat:修改请求报文的源和目标 IP 。
LVS 的调度算法:
静态调度算法:轮询调度(RR)、加权轮询调度(WRR)、来源哈希调度(SH)、目标哈希调度(DH);
动态调度算法:最少链接调度(LC)、权重最少链接调度(WLC)、初始链接高权重调度(SED)、初始均分后初始链接高权重调度(NQ)、动态目标哈希调度(LBLC)、带复制功能的动态目标哈希调度(LBLCR)、灰度调度(FO)、OVF调度算法。
LVS 的工作原理:LVS 根据请求报文的目标 IP 和目标协议及端口将其调度转发至某 RS(服务主机),根据调度算法来挑选 RS。
LVS 集群的 NAT 模式
LVS-NAT 模式的工作原理
NAT:地址转换。
1、本质是多目标 IP 的 DNAT ,通过将请求报文中的目标地址和目标端口修改为某个挑出的 RS 的 RIP 和 PORT 实现转发;
2、RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址;RS 的网关要指向DIP;
3、请求报文和响应报文都必须经由 Director 转发,Director 易于成为系统瓶颈;
4、支持端口映射,可修改请求报文的目标 PORT;
5、VS必须是Linux系统,RS可以是任意OS系统。
LVS-NAT 模式的数据逻辑
注意:LVS 的 NAT 模式接收和返回客户端数据包时都要经过 LVS 的调度机,所以 LVS 调度机很容易阻塞。
1、客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP),访问目标端口(9000port);
2、VS服务器接收到访问请求,做 DNAT 把请求数据包中的目标由 VIP 换成 RS 的 RIP 和相应端口;
3、RS1 回应请求,发送响应数据包,包中的数据为:数据的来源(RP1)、响应目标(CIP)、相应端口(9000port);
4、VS服务器接收到响应数据包,改变包中的数据来源(RIP1 -> VIP),响应目标端口(9000 -> 80);
5、VS 服务器把修改过的响应数据包报文回传给客户端。
LVS 集群的 DR 模式(广泛使用)
LVS-DR 模式的工作原理
DR(Direct Routing):直接路由。
LVS 默认模式,应用最广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在接口的 MAC 地址,目标 MAC 是某个挑选出的 RS 的 RIP 所在接口的MAC地址;源 IP/PORT,目标 IP/PORT 均保持不变。
LVS-DR 模式的数据逻辑
1、客户端发送数据帧给 VS 服务器,数据报文的内容为客户端IP、MAC 和 VIP、VIP 的 MAC 地址;
2、VS 服务器接收到数据报文后把报文中的 VIP 的 MAC 变为 RS1 的MAC,此时数据报文中的数据为客户端 IP、MAC 和 VIP、RS1 的MAC地址;
3、RS 得到 VS 服务器的数据包并做出响应回传数据包,数据包直接发送给客户端,不经过 VS 服务器,回传数据包中的内容为 VIP、RS1 的 MAC 地址和客户端 IP、MAC 地址。
LVS-DR 模式的特点
1、Director(路由器) 和各 RS 都配置有VIP;
2、确保前端路由器将目标 lP 为 VIP 的请求报文发往 Director ;
3、在前端网关做静态绑定 VIP 和 Director 的 MAC 地址;
4、RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP 在同一 IP 网络;
5、RIP 的网关不能指向 DIP,以确保响应报文不会经由 Director;
6、RS 和 Director 要在同一个物理网络;
7、请求报文要经由 Director , 但响应报文不经由 Director ,由 RS 直接发往 Client;
8、不支持端口映射(端口不能修改);
9、RS 可使用大多数 OS 系统;
10、在 RS 上使用 arptables 工具,修改内核参数限 arp 通告以及应答级别。
LVS 集群的 TUN 模式工作原理
不修改请求报文的 IP 首部(源 IP 为 CIP,目标 IP 为 VIP),而在原 IP 报文之外再封装一个 IP 首部(源 IP 是 DIP,目标 IP 是 RIP),将报文发往挑选出的目标 RS ;RS 直接响应给客户端(源 IP 是VIP,目标 IP 是 CIP )。
LVS 集群的 FULLNAT 模式工作原理
通过同时修改请求报文的源 IP 地址(CIP -> DIP)和目标 IP 地址(VIP -> RIP)进行转发(此类 kernel 默认不支持,需修改内核的参数)。
1、VIP 是公网地址,RIP 和 DIP 是私网地址,且通常不在同一 IP 网络;因此,RIP 的网关一般不会指向 DIP;
2、RS 收到的请求报文源地址是 DIP ,因此,只需响应给 DIP;但Director 还要将报文发往 Client;
3、请求和响应报文都经由 Director;
4、支持端口映射。
LVS 的调度算法
LVS 静态调度算法
1、RR(roundrobin):轮询,RS 分别被平等调度,当 RS 配置有差别时不推荐;
2、WRR(Weighted RR):加权轮询,根据 RS 的配置进行加权调度,性能差的 RS 可给较小的权(最小值为0:默认不调度),被调度的次数少;
3、SH(Source Hashing):源IP地址进行 hash(哈希算法),将来自于同一个 IP 地址的请求始终发往第一次挑中的 RS ,从而实现会话绑定;
4、DH(Destination Hashing):目标地址进行 hash(哈希算法),第一次轮询调度至 RS ,后续将发往同一个目标地址的请求始终转发至第一次挑中的 RS ,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商。
LVS 动态调度算法
主要根据 RS 当前的负载状态及调度算法进行调度,Overhead=value 较小的 RS 会被调度。
1、LC(least connections):最少链接
适用于长连接应用 Overhead(负载值) = activeconns (活动链接数) x 256 +
inactiveconns(非活动链接数) ;
2、WLC(Weighted LC):权重最少链接
默认调度方法 Overhead = ( activeconns x 256 + inactiveconns ) / weight ;
3.SED(Shortest Expection Delay):初始链接最高权重
初始连接高权重优先 Overhead = (activeconns + 1 + inactiveconns ) x 256 / weight
; 但是,当 node1 的权重为1,node2 的权重为10,经过运算,前几次的调度都会被 node 2 承接;
4、NQ(Never Queue),第一轮均匀分配,后续SED;
5、LBLC(Locality-Based LC),动态的 DH(目的地址哈希算法)算法,使用场景:根据负载状态实现正向代理;
6、LBLCR(LBLC with Replication),带复制功能的 LBLC,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的 RS ;
7、FO(Weighted Fai Over):常用作灰度发布
在此FO算法中,遍历虚拟服务所关联的真实服务器链接表,找到还未过载( 未设置 IP_VS_DEST_F OVERLOAD 标志
)的且权重最高的真实服务器,进行调度; 当服务器承接大量链接,我们可以对此服务器进行过载编辑( IP_VS_DEST_F OVERLOAD
),那么 VS 调度器就不会把链接调度到有过载标记的主机中;
8、OVF( Overflow-connection ):
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此
OVF 算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:1.
未过载(未设置IP_VS_DEST_F OVERLOAD标志 );2. 真实服务器当前的活动连接数量小于其权重值;3. 其权重值不为零。
LVS 四层均衡负载器真机实验
LVS-NAT 模式真机实验
设备:一台 LVS 服务器(VS)、两台服务器主机(RS)
环境配置( Vmware软件 ):三台虚拟机设备均可正常下载软件;VS 服务器配置两个网络适配器,一个网络适配器使用 ”NAT“ 模式,另一个网络适配器使用”仅主机” 模式,用来模拟外网和内网的环境;两台 RS 服务器的网络适配器使用 ”仅主机“ 模式,与 VS 服务器搭建成内网环境。
实验配置
1、将虚拟机的网络适配器进行添加和更改
VS 服务器网络适配器:
VS 服务器需要设置两个网络适配器,一个使用 “NAT” 模式,模拟外网环境,一个使用 “仅主机” 模式,模拟内网环境
如果只有一个网络适配器的话,可点击 “添加” 进行网络适配器的增加
RS 服务器网络适配器:
RS 服务器只需一个网络适配器即可,使用 “仅主机” 模式,模拟内网环境。
2、更改 IP 地址和网关,VS 服务器开启路由功能
VS 服务器:
网卡1 IP 地址为外网
[root@vs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.10/24,172.25.254.2
method=manual
网卡2 IP 地址为内网
[root@vs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
重新加载配置文件,并激活网络链接
[root@vs ~]# nmcli connection reload ----重新加载配置文件
[root@vs ~]# nmcli connection up eth0 ----激活网络链接
[root@vs ~]# nmcli connection up eth1
VS 服务器开启路由功能
[root@vs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 ----在文本末尾添加
[root@vs ~]# sysctl -p ----激活路由功能
net.ipv4.ip_forward = 1 ----显示此内容则表示已激活
查看路由信息
[root@vs ~]# route -n
RS 服务器:
RS1 网卡为内网 IP 地址
[root@rs1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
重新加载配置文件,并激活网络链接
[root@rs1 ~]# nmcli connection reload ----重新加载配置文件
[root@rs1 ~]# nmcli connection up eth0 ----激活网络链接
查看路由信息
RS2 网卡为内网 IP 地址
[root@rs2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
重新加载配置文件,并激活网络链接
[root@rs2 ~]# nmcli connection reload ----重新加载配置文件
[root@rs2 ~]# nmcli connection up eth0 ----激活网络链接
路由信息
3、RS 服务器下载 httpd 软件,并输入不同的网页内容,方便进行实验观察(真实企业搭建的网页内容应一致)
下载 httpd 软件
[root@rs1 ~]# yum install https -y
[root@rs2 ~]# yum install https -y
输入内容至网页内
[root@rs1 ~]# echo this is rs1 > /var/www/html/index.html
[root@rs2 ~]# echo this is rs2 > /var/www/html/index.html
重启服务,开机自启动
[root@rs1 ~]# systemctl enable --now httpd
[root@rs2 ~]# systemctl enable --now httpd
4、测试 VS 服务器能否访问 RS 服务器
[root@vs ~]# curl 192.168.0.10
5、VS 服务器下载 ipvsadm 软件,并设置策略
下载软件
[root@vs ~]# yum install ipvsadm -y
设置策略
[root@vs ~]# ipvsadm -A -t 172.25.254.10 -s rr
[root@vs ~]# ipvsadm -a -t 172.25.254.10:80 -r 192.168.0.10:80 -m
[root@vs ~]# ipvsadm -a -t 172.25.254.10:80 -r 192.168.0.20:80 -m
查看设置成功的策略(临时设置,重启设备后失效)
6、实验结果观察
LVS-DR 模式真机实验
设备:一台 LVS 服务器(VS)、一台路由器(RD)、一台客户端(CD)、两台服务器主机(RS)
环境配置( Vmware软件 ):五台虚拟机设备均可正常下载软件;VS 服务器的网络适配器使用”仅主机模式“ ;RD 设备配置两个网络适配器,一个网络适配器使用 ”NAT 模式“,另一个网络适配器使用”仅主机模式“,用来模拟内网和外网的环境;CD 设备网络适配器使用 “NAT” 模式,模拟外网环境;两台 RS 服务器的网络适配器使用 ”仅主机“ 模式,与 VS 服务器和 RD 设备搭建成内网环境。
实验配置
1、添加网络适配器并修改工作模式
客户端设备:
路由器设备:
VS 服务器:
RS 服务器:
2、更改 IP 地址和网关
客户端:
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.10/24,172.25.254.100
method=manual
重新加载配置文件,并激活网络链接
[root@client ~]# nmcli connection reload ----重新加载配置文件
[root@client ~]# nmcli connection up eth0 ----激活网络链接
路由器:
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
重新加载配置文件,并激活网络链接
[root@router ~]# nmcli connection reload ----重新加载配置文件
[root@router ~]# nmcli connection up eth0 ----激活网络链接
[root@router ~]# nmcli connection up eth1
VS 服务器:
[root@vs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
重新加载配置文件,并激活网络链接
[root@vs ~]# nmcli connection reload ----重新加载配置文件
[root@vs ~]# nmcli connection up eth0 ----激活网络链接
RS 服务器:
[root@rs1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
[root@rs2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
重新加载配置文件,并激活网络链接
[root@rs1 ~]# nmcli connection reload ----重新加载配置文件
[root@rs1 ~]# nmcli connection up eth0 ----激活网络链接
[root@rs2 ~]# nmcli connection reload ----重新加载配置文件
[root@rs2 ~]# nmcli connection up eth0 ----激活网络链接
3、RS 服务器下载 httpd 软件,并在默认发布网页内输入内容
下载 httpd 软件
[root@rs1 ~]# yum install https -y
[root@rs2 ~]# yum install https -y
输入内容至网页内
[root@rs1 ~]# echo this is rs1 > /var/www/html/index.html
[root@rs2 ~]# echo this is rs2 > /var/www/html/index.html
重启服务,开机自启动
[root@rs1 ~]# systemctl enable --now httpd
[root@rs2 ~]# systemctl enable --now httpd
4、VS 服务器下载 ipvsadm 软件,并设置策略
下载软件
[root@vs ~]# yum install ipvsadm -y
设置策略
[root@vs ~]# ipvsadm -A -t 192.168.0.200 -s wrr
[root@vs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@vs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
查看设置成功的策略(临时设置,重启设备后失效)
5、路由器设备开启路由功能,并在 VS 服务器和 RS 服务器上添加 VIP 地址
开启路由功能
[root@router ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 ----在文本末尾添加
[root@router ~]# sysctl -p ----激活路由功能
net.ipv4.ip_forward = 1 ----显示此内容则表示已激活
添加 VIP
[root@vs ~]# ip address add 192.168.0.200/32 dev lo
6、客户端访问服务端结果观察
防火墙标签解决轮询错误
在已经配置好的 LVS-DR 模式下进行相关的配置
RS 服务器:
安装 mod_ssl 模块,使 RS 服务器支持 https
[root@rs1 ~]# yum install mod_ssl -y
[root@rs2 ~]# yum install mod_ssl -y
开启 httpd 服务
[root@rs1 ~]# systemctl restart httpd
[root@rs2 ~]# systemctl restart httpd
VS 服务器:
添加新的策略
[root@vs ~]# ipvsadm -A -t 192.168.0.200:443 -s wrr
[root@vs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@vs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
查看设置的策略
为端口做标记
[root@vs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
客户端测试