目录
一、概念
二、LVS工作原理
1. ipvs/ipvsadm
2.名词:
三、常用命令
四、工作模式
1.NAT地址转换模式
(1)工作流程
(2)特点
(3)实验过程
a.环境准备:
b.修改测试机的IP信息:
c.修改负载均衡服务器网卡信息
d.修改应用服务器的IP
e.负载均衡服务器-配置集群
f.测试机访问测试
g.应用服务器监听日志
h.测试机进行压力测试
2.DR路由模式
(1)工作流程
(2)特点
(3)实验过程
a.客户端修改IP
b.应用服务器修改IP
c.负载调度器修改IP
d.路由器修改IP
e.负载调度器配置路由转发
f.应用服务器配置
g.负载调度器创建集群
h.客户端访问测试
i.路由器配置DNAT规则
j.客户端访问测试
k.路由器配置SNAT规则
l.应用服务器关闭长连接
m.测试机访问测试
3.IP Tunneling (IP 隧道)模式
(1)工作流程
(2)特点
五、负载均衡算法
1.静态算法:
2.动态算法
一、概念
LVS" 通常指的是 "Linux Virtual Server",这是 Linux 内核中的一种负载平衡解决方案。Linux Virtual Server 用于提升网络服务的可扩展性和可靠性,它通过将传入的请求分发到后端服务器集群来实现。
二、LVS工作原理
1. ipvs/ipvsadm
- IPVS:钩子函数,内核机制,在请求没有到达目的地址之前,捕获并取得优先控制权的函数。把所有的数据包根据匹配判断规则审核,决定如何处理(内核机制)
-
IPVSADM:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器(管理命令)
2.名词:
CIP:客户端IP
DIP:负载调度器IP(指单个负载调度服务器)
VIP:集群IP(代表整个服务器组,集群)
RIP:真实服务器IP
三、常用命令
#命令:
ipvsadm
#常用参数:
-A, --add-service:添加一个新服务。
-E, --edit-service:修改一个已存在的服务。
-D, --delete-service:删除一个服务。
-C, --clear:清除所有虚拟服务和它们的服务器。
-L, --list:列出所有虚拟服务及其的服务器。
-a, --add-server:向服务添加一个服务器(真实服务器)。
-e, --edit-server:修改一个真实服务器的参数。
-d, --delete-server:从服务中删除一个服务器
#服务和服务器指定参数:
-t, --tcp-service:指定 TCP 服务,需跟上服务地址和端口。
-u, --udp-service:指定 UDP 服务,同样需跟上地址和端口。
-f, --firewall-mark:指定使用防火墙标记的服务。
-r, --real-server:指定真实服务器地址和端口。
-g, --gatewaying:使用 Direct Routing 网关方式。
-i, --ipip:使用 IPIP 隧道模式(Tunneling)。
-m, --masquerading:使用 NAT 模式。
#调度算法参数:
-s, --scheduler:指定服务使用的调度算法,如 rr(轮询)、wrr(加权轮询)、lc(最少链接)等。
#查看集群
ipvsadm -ln
#查看集群流量信息
ipvsadm -lnt 10.88.54.31:80 --stats
#创建集群
ipvsadm -A -t 192.168.10.110:80 -s rr
#向已存在的集群中添加应用服务器(使用NAT模式)
ipvsadm -a -t 192.168.10.110:80 -r 192.168.11.120:80 -m
ipvsadm -a -t 192.168.10.110:80 -r 192.168.11.130:80 -m
#从指定集群中删除某应用服务器
ipvsadm -d -t 192.168.10.110:80 -r 192.168.11.120:80
#删除集群
ipvsadm -D -t 192.168.79.10.110:80
#修改指定集群内某应用服务器的【模式】和【权重】
ipvsadm -e -t 192.168.10.110:80 -r 192.168.79.11.120:80 -g -w 2
#修改指定集群的算法
ipvsadm -E -t 192.168.10.110:80 -s wrr
四、工作模式
1.NAT地址转换模式
(1)工作流程
1.客户端将请求交给负载调度器,客户端发出数据包,此时这个数据包的源ip为CIP,目标ip为VIP(集群ip)
2.数据包到达负载调度器后,修改数据包的目标ip地址为真实服务器的ip,此时数据包的源ip为CIP,目标ip为RIP
3.将数据包发送给RS,之后RS响应将数据包发回给负载调度器,此时数据包的源ip为RIP,目标ip为CIP
4.负载调度器在转发时,会将源ip地址改为自己的VIP地址,然后再发给客户端,此时数据包的源ip为VIP,目标ip为CIP。
(2)特点
1.负载调度器和真实服务器,必须位于同一网络
2.真实服务器的网关必须指向DIP
3.负载调度器必须位于客户端和真实服务器之间
4.RIP通常都是私有地址,仅用于各个集群节点通信
5.支持端口映射
6.真实服务器可以使用任意操作系统、负载调度器必须是LINUX系统
(3)实验过程
a.环境准备:
四台虚拟机:一台图形化(测试机),一台均衡负载服务器,两台httpd应用服务器
使用10和11网段,测试机修改网卡为vmnet10(仅主机模式);
均衡负载服务器,添加一张网卡,vmnet10(仅主机模式)和vmnet11(仅主机模式);
两台httpd应用服务器vmnet11(仅主机模式)
b.修改测试机的IP信息:
更改网段,网关指向负载调度器
修改hosts文件
#均衡负载服务器IP
192.168.10.86 www.hongfuedu.com
c.修改负载均衡服务器网卡信息
#先修改10网段
#查看需要增加的网卡名
ip a
#修改网卡名和11网段,删除UUID
#开启路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
#检查路由转发功能是否开启成功
sysctl -p
d.修改应用服务器的IP
#应用服务器一
#修改IP地址,网关指向均衡服务器
#配置访问网页文件
yum -y install httpd
echo “120...” >> /var/www/html/index.html
systemctl restart network httpd
#应用服务器二
#修改IP地址,网关指向均衡服务器
#配置访问网页文件
yum -y install httpd
echo “130...” >> /var/www/html/index.html
systemctl restart network httpd
e.负载均衡服务器-配置集群
#安装命令行
yum -y install ipvsadm
#查看集群
ipvsadm -ln
#创建集群
ipvsadm -A -t 192.168.10.110:80 -s rr
#向192.168.10.110的集群中添加192.168.11.120的应用服务器,-m代表NAT模式
ipvsadm -a -t 192.168.10.110:80 -r 192.168.11.120:80 -m
ipvsadm -a -t 192.168.10.110:80 -r 192.168.11.130:80 -m
#再次查看集群的信息
ipvsadm -ln
f.测试机访问测试
1.先打开浏览器单独访问192.168.11.120和130
2.浏览器访问www.hongfuedu.com
#可以成功,轮询有间隔是应用服务器keepalive的问题
3.多次执行查看效果
curl www.hongfuedu.com
4.关闭长连接
#两台应用服务器执行
cd /etc/httpd/conf.d && cp -a /usr/share/doc/httpd-2.4.6/httpd-default.conf ./
#修改配置文件中KeepAlive值为Off
vim httpd-default.conf
KeepAlive Off
#重启服务
systemctl restart httpd
5.回到测试机浏览器再次访问浏览器,效果显示成功
g.应用服务器监听日志
#监听浏览器访问日志
tailf /var/log/httpd/access_log
#测试机的浏览器再次刷新,查看日志的变化效果
h.测试机进行压力测试
#查看是否有ab命令
which ab
#安装服务
yum -y install httpd-tools
#进行压力测试
#-c指定并发数量,-n为总访问次数,一次访问100个,共访问10次
ab -c 100 -n 1000 http://www.hongfuedu.com/index.html
ab -c 1000 -n 10000 http://www.hongfuedu.com/index.html
#查看两台应用服务器监听的日志
wc -l /var/log/httpd/access_log
#ab命令执行后再次查看
wc -l /var/log/httpd/access_log
2.DR路由模式
(1)工作流程
1.客户端发出数据包,源ip是CIP,目标ip是VIP
2.依靠路由把数据发送给负载调度器,负载调度器将数据包的源MAC地址修改为DIP的MAC地址。
3.目标MAC地址修改为RIP的MAC地址,此时源ip和目标ip均未修改。
4.由于DS和RS在同一网络中,所以通过二层来传输,通过路由再将数据包发到RS
5.RS接收数据包,之后通过lo接口传送给eth0向外发出,此时的源ip是VIP,目标ip为CIP。
6.最后通过路由发给客户端。
(2)特点
1.负载调度器和真实服务器,必须位于同一网络
2.真实服务器的网关必须指向路由器
3.负载调度只处理入站请求
4.RIP可以是私有地址,也可以是公网地址
5.真实服务器可以使用任意操作系统,负载调度器必须是LINUX系统
(3)实验过程
a.客户端修改IP
1.测试机
a.修改IP地址信息
IP:192.168.10.86
网关:192.168.10.81 #网关指向路由器的外网网卡
systemctl restart network
b.应用服务器修改IP
应用服务器C7-5
a.修改IP地址信息
IP:192.168.11.84
网关:192.168.11.81 #网关指向路由器的内网网卡
systemctl restart network
应用服务器C7-4
a.修改IP地址信息
IP:192.168.11.83
网关:192.168.11.81 #网关指向路由器的内网网卡
systemctl restart network
c.负载调度器修改IP
4.负载调度器C7-3
a.修改IP地址信息
IP:192.168.11.82
网关:192.168.11.81 #网关指向路由器的内网网卡
systemctl restart network
d.路由器修改IP
5.路由器C7-2
a.修改IP地址信息
IP:192.168.10.81
systemctl restart network
b.cd /etc/sysconfig/network-scripts/
ip addr #查看需要增加网卡名称
cp -a ifcfg-ens33 ifcfg-ens3* #添加网卡,修改IP(内网),修改网卡名,删除UUID
c.vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #开启路由转发功能
e.负载调度器配置路由转发
6.负载调度器C7-3
a.cd /etc/sysconfig/network-scripts/
cp -a ifcfg-ens33 ifcfg-ens33:0 #添加子网卡接口,修改IP(VIP)和网卡名
192.168.11.200
b.vim /etc/sysctl.conf
新增:net.ipv4.conf.all.send_redirects = 0 #关闭路由重定向功能(防止更改目标IP)
sysctl -p
f.应用服务器配置
7.应用服务器C7-4和C7-5同时控制
a.yum -y install httpd
b.echo “83” >> /var/www/html/index.html
c.systemctl start httpd
systemctl enable httpd
d.vim /etc/sysctl.conf
新增:net.ipv4.conf.all.arp_ignore = 1 #关闭arp协议关于IP和MAC地址绑定的检查机制
net.ipv4.conf.all.arp_announce = 2 #关闭arp协议关于IP和MAC地址绑定的检查机制
sysctl -p
e.cd /etc/sysconfig/network-scripts/
cp -a ifcfg-lo ifcfg-lo:0 #新增回环网卡接口
vim ifcfg-lo:0
修改设备名lo:0
IP地址改为192.168.11.200
掩码:255.255.255.255
systemctl restart network ifconfig lo:0 #查看回环网卡是否启动成功
f.vim /etc/rc.local
新增:route add -host 192.168.11.200 dev lo:0 #添加路由记录,使物理网卡和回环网卡能通信
chmod +x /etc/rc.local
route add -host 192.168.11.200 dev lo:0 #执行命令,使修改的配置生效
route -n #查看添加的路由记录是否生效
tailf /var/log/httpd/access_log #监听日志
g.负载调度器创建集群
8.负载调度器C7-3
a.yum -y install ipvsadm
ipvsadm -A -t 192.168.11.200:80 -s rr #创建集群
ipvsadm -a -t 192.168.11.200:80 -r 192.168.11.83:80 -g #向集群中添加DR类型服务器
ipvsadm -a -t 192.168.11.200:80 -r 192.168.11.84:80 -g
ipvsadm -ln #查看集群的状态
h.客户端访问测试
9.测试机C7-6
curl 192.168.11.200 #已经成功实现访问轮询
i.路由器配置DNAT规则
10.路由器C7-2
cd /etc/sysconfig/ yum -y install iptables-services
vim iptables
iptables -t nat -L #查看nat表里的防火墙规则
iptables -t nat -L -n #数字化显示防火墙规则
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.81 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.200:80 #进行目标地址转换
iptables -t nat -L -n #再次查看防火墙规则
j.客户端访问测试
11.测试机C7-6
curl 192.168.10.81 #测试查看效果
k.路由器配置SNAT规则
12.路由器C7-2
iptables -t nat -A POSTROUTING -o ens33 -s 192.168.11.0/24 -p tcp --sport 80 -j SNAT --to-source 192.168.10.81 #源地址转换
service iptables save #保存防火墙规则
l.应用服务器关闭长连接
13.应用服务器C7-4和C7-5
cp -a /usr/share/doc/httpd-2.4.6/httpd-default.conf /etc/httpd/conf.d/
vim /etc/httpd/conf.d/httpd-default.conf
KeepAlive On改为Off
systemctl restart httpd
m.测试机访问测试
14.测试机C7-6
浏览器访问192.168.10.81
yum -y install httpd-tools
ab -c 1000 -n 10000 http://192.168.10.81/index.html
3.IP Tunneling (IP 隧道)模式
(1)工作流程
1.客户端发送数据包到负载调度器,此时数据包的源ip为CIP,目标ip为VIP。
2.负载调度器会在数据包的外面再次封装一层ip数据包,封装源ip为DIP,目标ip为RIP。此时源ip为DIP,目标ip为RIP。
3.之后负载调度器将数据包发给RS(因为在外层封装多了一层ip首部,所以可以理解为此时通过隧道传输),此时源ip为DIP,目标ip为RIP。
4.RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP。
5.之后将数据包发给客户端。
(2)特点
1.所有真实服务器节点既要有RIP,又要有VIP,并且RIP、必须是公网ip
2.负载调度器和真实服务器必须支持隧道功能
3.负载调度器只处理入站请求
4.真实服务器一定不能使用负载调度集群做默认网关
5.不支持端口映射
五、负载均衡算法
1.静态算法:
静态算法:只考虑算法本身,不考虑后端服务器状态
rr(轮循):从1开始到n结束
wrr(加权轮循):按权重比例进行调度,权重越大,负责的请求越多
sh(源地址hash):实现会话绑定,保留之前建立的会话信息。将来自于同一个ip地址的请求发送给 一个真实服务器。(同一个ip重复访问)
dh(目标地址hash):将同一个目标地址的请求,发送给同一个服务器节点。提高缓存命中率(不同 的ip访问同一个资源)
2.动态算法
动态算法:既要考虑算法本身,也要考虑后台服务器状态(原理:通过hash表记录连接状态---- active/inactive)能不能扛得住
LC(最少连接):将新的连接请求分配给当前连接数最少的服务器。 公式:活动连接*256+非活动连接
WLC(加权最少连接):最少连接的特殊模式。 公式:(活动连接*256+非活动连接)/权重
SED(最短期望延迟):加权最少连接的特殊模式。 公式:(活动连接 +1)*256/权重
NQ (永不排队):sed的特殊模式,当某台真实服务器连接为0时,直接分配,不计算
LBLC(基于局部性的最少连接):dh的特殊模式,既要提高缓存命中率,又要考虑连接数量。先根据 请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且 有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
LBLCR(带复制的基于局部性的最少连接):LBLCR=LBLC+缓存共享机制
最好的是dh、LBLC、LBLCR。