负载均衡技术类型
四层负载均衡器 也称为 4 层交换机,主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等;
七层负载均衡器 也称为 7 层交换机,位于 OSI 的最高层,即应用层,此负载均衡器支持多种协议,如HTTP、FTP、SMTP 等。7 层负载均衡器可根据报文内容,配合一定的负载均衡算法来选择后端服务器,即“内容交换器”。如常见的 HAProxy、Nginx。
负载均衡实现方式
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
LVS结构
三层结构:负载调度器、服务器池、共享存储
架构对象:
VS:Virtual Server,也称为 Director,负载均衡服务器
RS:Real Server,真正的服务器,集群中各节点
VIP:Director 向外部提供服务的 IP
DIP:Director 向内部与 RS 通信的 IP
RIP:真实服务器的 IP
CIP:客户端的 IP
LVS工作模式
LVS-NAT(NAT模式)
LVS-DR(直接路由模式)(应用最广泛)
LVS-TUN(IP隧道(Tunnel)模式,不常用)
FULL-NAT模式(双向转换模式,不常用)
LVS负载均衡算法
静态负载均衡:
rr(round robin,轮询 )
wrr(weight round robin,加权轮询)
sh(source hashing,源地址散列算法(HASH))
dh(destination hashing,目标地址 HASH)
动态负载均衡:
lc(leash-connection,最少连接 )
简单算法:active * 256 + inactive (谁的小选谁)
wlc(加权最少连接)
简单算法:(active * 256 + inactive) / weight(谁的小选谁)
sed(最少期望延迟)
简单算法:(active + 1) * 256 / weight (谁的小选谁)
nq(never queue,永不排队)
LBLC(基于局部性的最少连接 )
LBLCR(基于局部性的带复制功能的最少连接)
ipvsadm命令详解
-A | 添加虚拟服务节点 |
-D | 删除虚拟服务节点 |
-L | 查看虚拟服务节点列表 |
-a | 添加真实服务节点 |
-d | 删除真实服务节点 |
-l | 查看真实服务节点列表 |
-t | 指定虚拟服务器IP地址 |
-s | 指定调度算法 |
-r | 指定真实服务器节点IP地址 |
-w | 指定权重值 |
-g | 直接路由模式(默认) |
-i | 隧道模式(不常用) |
-m | NAT模式 |
案例 | ipvsadm -A -t 207.175.44.110:80 -s rr ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m |
基础配置 |
systemctl stop firewalld.service systemctl stop NetworkManager setenforce 0 sed -i "s/ONBOOT=no/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-ens33 cat /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network |
修改主机名 |
关闭防火墙 |
关闭Selinux |
关闭Networkmanager |
配置IP地址 |
实现NAT模型搭建
负载调度器配置
配置IP地址
增加一块网卡
配置ens33和ens37网卡添加路由转发
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
#网卡1配置
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.4
PREFIX=24
GATEWAY=192.168.31.2
DNS1=192.168.31.2
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens37
#网卡2配置
TYPE=Ethernet
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.217.100
PREFIX=24
GATEWAY=192.168.217.3
DNS1=192.168.217.3
[root@localhost ~]# vim /etc/sysctl.d/route.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p /etc/sysctl/route.conf
查看网卡
测试网通性
安装nginx
#LVS2机器上nginx1网页配置
[root@localhost html]# yum -y install nginx
[root@localhost html]# systemctl start nginx
[root@localhost html]# ss -anl | grep :80
nl UNCONN 0 0 0:805 *
nl UNCONN 0 0 0:805 *
tcp LISTEN 0 128 *:80 *:*
tcp LISTEN 0 128 [::]:80 [::]:*
#网络源安装完成后修改网关联到LVS主机ens37上
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.5
PREFIX=24
GATEWAY=192.168.217.100
DNS1=192.168.31.2
[root@localhost html]# ifdown ens33 && ifup ens33
成功断开设备 "ens33"。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)
#写网页内容一会测试用
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# echo nginx1 index.html
nginx1 index.html
[root@localhost html]# echo nginx1 > index.html
#LVS3机器上nginx2网页
[root@localhost html]# yum -y install nginx
[root@localhost html]# systemctl start nginx
[root@localhost html]# ss -anl | grep :80
nl UNCONN 0 0 0:809 *
nl UNCONN 0 0 0:809 *
nl UNCONN 0 0 15:809 *
nl UNCONN 0 0 15:809 *
nl UNCONN 0 0 16:809 *
tcp LISTEN 0 128 *:80 *:*
tcp LISTEN 0 128 [::]:80 [::]:*
#网络源安装完成后修改网关联到LVS主机ens37上
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.6
PREFIX=24
GATEWAY=192.168.217.100
DNS1=192.168.31.2
[root@localhost html]# ifdown ens33 && ifup ens33
成功断开设备 "ens33"。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)
#写网页内容一会测试用
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# echo nginx2 index.html
nginx1 index.html
[root@localhost html]# echo nginx2 > index.html
通信与配置后主机安装
yum install -y ipvsadm
加载ip_vs模块并检测
启动ipvsadm服务
systemctl start ipvsadm
启动会报错少目录文件
创建目录
#创建目录后可以启动但没有文件
[root@localhost ~]# mkdir /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm
[root@localhost ~]# ipvsadm -A -t 192.168.217.100:80 -s rr
[root@localhost ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
[root@localhost ~]# 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.217.100:80 rr
#移动到ipvadm配置负载分配策略
root@localhost sysctl.d]# ipvsadm -A -t 192.168.217.100:80 -s rr
[root@localhost sysctl.d]# ipvsadm -a -t 192.168.217.100:80 -r 192.168.31.5:80 -m
[root@localhost sysctl.d]# ipvsadm -a -t 192.168.217.100:80 -r 192.168.31.6:80 -m
[root@localhost sysctl.d]# 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.217.100:80 rr
-> 192.168.31.5:80 Masq 1 0 0
-> 192.168.31.6:80 Masq 1 0 0
[root@localhost sysctl.d]# ipvsadm-save > /etc/sysconfig/ipvsadm/ipvsadm
[root@localhost sysctl.d]# cd /etc/sysconfig/ipvsadm/
[root@localhost ipvsadm]# ls
ipvsadm
配置好后测试ctrl+f5刷新会从web1和web2一直跳转
DR模型原理
LVS-DR的工作原理就是:通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变
LVS-DR:直接路由的特点
Director和各RS上都配置使用VIP
(1)确保前端路由将目标IP为VIP的请求报文发往Director
(a)在前端网关做静态绑定
(b)在RS上使用arptables
(c)在RS上修改内核参数以限制ARP通告和应答级别
arp_announce
arp-ignore
(2)RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一IP网络,RIP的网关不能指向DIP,以确保响应报文不会经由Director
(3)RS跟Director要在同一个物理网络
(4)请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client
(5)不支持端口映射
还用刚才的试验机所以要关闭网卡2 清空数据还原成新的主机
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
删除ens37配置文件
留一块ens33的配置文件网卡
删除ipvsadm的配置文件 并创建新的ipvsadm配置文件
[root@localhost ~]# rm -rf /etc/sysconfig/ipvsadm
[root@localhost ~]# touch /etc//sysconfig/ipvsadm
删除路由转发功能
[root@localhost ~]# cd /etc/sysctl.d/
[root@localhost ~]# rm -rf route.conf
复制网卡配置ens33:0
[root@localhost sysctl.d]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:0
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.31.200
PREFIX=24
#GATEWAY=192.168.31.2
#DNS1=192.168.31.2
[root@localhost network-scripts]# systemctl restart network
配置负载分配策略
[root@localhost network-scripts]# ipvsadm -A -t 192.168.31.200:80 -s rr
[root@localhost network-scripts]# ipvsadm -a -t 192.168.31.200:80 -r 192.168.31.5:80 -g
[root@localhost network-scripts]# ipvsadm -a -t 192.168.31.200:80 -r 192.168.31.6:80 -g
[root@localhost network-scripts]# 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.31.200:80 rr
-> 192.168.31.5:80 Route 1 0 0
-> 192.168.31.6:80 Route 1 0 0
保存策略
[root@localhost network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
接下来配置两台web
先将两台web服务器上注销网关与DNS
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]# systemctl restart network
首先负载调度器配置
内核参数配置生效后才可以进行配置web节点配置
调整ARP参数
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
配置虚拟ip地址
注意:web服务器虚拟地址为32位子网验码
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens33 ifdown-ib ifdown-routes ifup-aliases ifup-isdn ifup-sit network-functions
ifdown-ippp ifdown-sit ifup-bnep ifup-plip ifup-Team network-functions-ipv6
ifcfg-lo ifdown-ipv6 ifdown-Team ifup-eth ifup-plusb ifup-TeamPort
ifdown ifdown-isdn ifdown-TeamPort ifup-ib ifup-post ifup-tunnel
ifdown-bnep ifdown-post ifdown-tunnel ifup-ippp ifup-ppp ifup-wireless
ifdown-eth ifdown-ppp ifup ifup-ipv6 ifup-routes init.ipv6-global
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.31.200
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback:0
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
1: lo: 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
inet 192.168.31.200/32 brd 192.168.31.200 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:12:94:c3 brd ff:ff:ff:ff:ff:ff
inet 192.168.31.5/24 brd 192.168.31.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe12:94c3/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:45:34:d8 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:45:34:d8 brd ff:ff:ff:ff:ff:ff
web服务器分别添加回环路由
[root@localhost network-scripts]# route add -host 192.168.31.200/32 dev lo:0
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.31.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
这样重启就没有了 写到etc下的bashrc或
写下来就可以访问了
ctrl+f5
也可以先tcpdump抓包
tcpdump -i ens33:0 >> ./tcpdump.txt
查找看http的包
或者用Wireshark抓包软件 可以看到全是200网段看不到web1、2的ip地址
课下了解内容CDN内容分发网络—网页缓存加速