目录
一、LVS的简介
LVS:Linux Virtual Server,负载调度器,是一种基于Linux操作系统内核的高性能、高可用网络服务负载均衡解决方案。
LVS工作原理基于网络层(四层,传输层)的负载均衡技术,它通过内核级别的IP虚拟服务器(IPVS)模块实现透明的流量分发。
LVS
相关术语:
- VS: Virtual Server,负责调度
- RS:RealServer,负责真正提供服务
- CIP:Client IP
- VIP: Virtual serve IP VS外网的IP
- DIP: Director IP VS内网的IP
- RIP: Real server IP
二、LVS集群体系结构
VS
根据请求报文的目标
IP
和目标协议及端口将其调度转发至某
RS
,根据调度算法来挑选
RS。
三、LVS集群类型
1、net模式集群
- 客户端发送访问请求,请求数据包中含有请求来源(CIP),访问目标地址(VIP)访问目标端口 (9000port)
- VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
- RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)
- VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-》80)
- VS服务器把修改过报文的响应数据包回传给客户端
- lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
2、dr模式集群
- 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
- VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
- RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
四、LVS的调度算法
1、静态调度算法
- RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
- WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
- SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往
- 第一次挑中的RS,从而实现会话绑定
- DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请
- 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
2、动态调度算法
- LC:least connections(最少链接法):主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度
- WLC:Weighted LC(权重最少链接): 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
- SED:Shortest Expection Delay:默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
- NQ:Never Queue,第一轮均匀分配,后续SED,初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight ,但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接。
- LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
- LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
五、LVS的实战案例
1、LVS部署相关命令介绍
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:/etc/sysconfig/ipvsadm
管理集群服务中的增删改查: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]- 管理集群中realserver的增删改查:ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
管理集群服务中的增删改查 | 管理集群中realserver的增删改查 |
-A #
添加
| -a #添加realserver |
-E #修改 | -e #更改realserver |
-t #tcp服务 | -t #tcp协议 |
-u #udp
服务
| -u #udp协议 |
-p #
设置持久连接超时
| -r #realserver地址 |
-f #firewall mask
火墙标记,是一个数字
| -g #直连路由模式 |
-m #nat模式 | |
-w #设置权重 | |
-f #火墙标签 | |
-L #查看全部策略 | |
-C #清除所有策略 |
2、部署nat模式集群
2.1.实验环境
主机名 | IP | VIP |
lvs | 172.25.254.100(nat) | 192.168.0.100(仅主机) |
webserver1 | 192.168.0.10(仅主机),gateway:192.168.0.100 | null |
webserver2 | 192.168.0.20(仅主机),gateway:192.168.0.100 | null |
2.2.实验内容
2.2.1设置vs、rs的ip
vs:
webserver1:
vim /etc/NetworkManager/system-connections/eth0.nmconnection
webserver2:
vim /etc/NetworkManager/system-connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
2.2.2在lvs中打开内核路由功能
vim /etc/sysctl.conf
sysctl -p
2.2.3在webserver安装apache
dnf install httpd -y #安装
echo webserver1-192.168.0.10 > /var/www/html/index.html #将不同内容写入网站首页
echo webserver2-192.168.0.20 > /var/www/html/index.html
在lvs测试一下:
2.2.4在lvs中加策略
安装ipvsadm:
dnf install ipvsadm -y
加策略:rr轮询策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -Ln
2.2.4检测
3、部署dr模式集群
3.1实验环境
主机名 | ip | vip |
client | 172.25.254.200(nat) | |
router | 172.25.254.100(nat),192.168.0.100(仅主机) | |
vs | 192.168.0.50(仅主机) | 192.168.0.200(lo) |
werserver1 | 192.168.0.10(仅主机) | 192.168.0.200 |
wevserver2 | 192.168.0.20(仅主机) | 192.168.0.200 |
3.2实验内容
3.2.1配置IP
vim /etc/NetworkManager/system-connections/eth0.nmconnection
nmcli connection reload
nmcli connection up eth0
client:需要将网关设置为路由器router的ip:
router:需要两个网卡,一个为nat模式,一个为仅主机模式:
vs:网关同样设置为路由器router的ip:
webserver1:网关同样设置为router的ip
3.2.2添加vip
在vs、wevserver1、webserver2上lo上添加vip
- 使rs中的vip不对外生效
-
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
- 添加vip
ip a a 192.168.0.200/32 dev lo
3.2.3在lvs中添加策略
策略算法为wrr:基于权重的轮询,分别设置webserver1的权重为1、webserver2为2。
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
3.2.3在client中检测
4、防火墙标签解决轮询调度问题
4.1.轮询调度问题
以
http
和
https
为例,当我们在
RS
中同时开放
80
和
443
端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题 :当我第一次访问80
被轮询到
RS1
后下次访问
443
仍然可能会被轮询到
RS1
上。
#在lvs添加rr策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s rr
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
轮询错误:
4.2.解决轮询调度问题
4.2.1安装mod_ssl模块,让rs支持https
yum install mod_ssl -y
4.2.2.在lvs主机中为端口做标记
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
4.2.3.在lvs中添加策略
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
4.2.4在client中检测
做端口标记后,rr轮询调度正常.。