文章目录
一、lvs三种负载均衡技术对比:
NAT:原路径返回,性能较低;若VS和RS不在同一个网段,NAT可以进行转换;
LVS-TUN:ip隧道,不修改请求报文的IP首部,而是通过在原有的IP首部(CIP-VIP)之外,再封装一个ip首部(DIP-RIP)
LVS-FULLNAT:源地址和目标地址都会改变
LVS-DR:传输走2层数据链路层,性能最快
现实中:调度器和真实服务器可能不在同一地点,必须使用互联网,可以使用隧道模式(支持广域网)
对比项 | 网络地址转换(NAT) | 直接路由(DR) | IP隧道(IP TUN) |
---|---|---|---|
建立难度 | 易 | 有一定难度 | 有一定难度 |
可扩展性 | 差 | 好 | 很好 |
带宽 | 小 | 大 | 大 |
延迟 | 最大 | 小 | 大 |
支持的服务器数量 | 少(10"20) | 多(>100) | 多(100) |
IP包修改 | 修改IP地址和端口 | 修改IP包的IAO地址 | 对请求包进行IP包装 |
后台服务器0S | 任何支持NAT的0S | 多数 | 支持IP Tunnel |
网络连接要求 | 局罅网 | 本地或远程 | |
缺省路由 | 负戟均衡服务器 | 不限 | 不限 |
实际服务器限制 | 无 | Lo不响应ARP | TunI设备不怕应ARP |
服务端口映射 | 可以 | 不可以 | 不可以 |
二、LVS模式-DR
工作原理:
客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP
负载均衡器接收到报文后,发现请求的是在ipvs规则中存在的地址和端口,那么它将客户端请求报文的源MAC地址改为自己的MAC地址,目标MAC改为了Real Server的MAC地址,并将此包发送给Real Server
Real Server发现请求报文中的目标MAC地址是自己,就会把此报文接受下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡,直接发送给客户端。
VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP 的网络请求。
三、ipvsadm配置参数
参数 | 解释 |
---|---|
-A --add-service | 添加一条新的虚拟服务 |
-E --edit-service | 编辑虚拟服务 |
-D --delete-service | 删除虚拟服务 |
-C --clear | 清除所有的虚拟服务规则 |
-R --restore | 恢复虚拟服务规则 |
-a --add-server | 在一个虚拟服务中添加一个新的真实服务器 |
-e --edit-server | 编辑某个真实服务器 |
-d --delete-server | 删除某个真实服务器 |
-L / -l --list | 显示内核中的虚拟服务规则 |
-n --numeric | 以数字形式显示IP端口 |
-c --connection | 显示ipvs中目前存在的连接,也可以用于分析调度情况 |
-Z --zero | 将转发消息的统计清零 |
-p --persistent | 配置持久化时间 |
–set tcp tcpfin udp | 配置三个超时时间(tcp/tcpfin/udp) |
-t /-u | TCP/UDP协议的虚拟服务 |
-g /-m / -i | LVS模式为:DR / NAT / TUN |
-w | 配置真实服务器的权重 |
-s | 配置负载均衡算法,如:rr轮训, wrr, lc等 |
–timeout | 显示配置的tcp/tcpfin/udp超时时间 |
–stats | 显示历史转发消息统计(累加值) |
–rate | 显示转发速率信息(瞬时值) |
四、DR模式的部署
主机名 ip vip 角色
server1 192.168.175.11 192.168.175.100 调度器(VS)
server2 192.168.175.12 192.168.175.100 真实服务器(RS)
server3 192.168.175.13 192.168.175.100 真实服务器(RS)
server4 192.168.175.14 测试机
实验时:server1-4虚拟机为NAT网络模式,并且在分配的同一个vlan中(Virtual Local Area Network:虚拟局域网);只有VS的客户端对外响应;
ARP协议在第二层,传输不需要网络,经过转发请求,通过VS主机中目的MAC地址修改,客户端可以访问服务机
整个过程中,源地址和目标地址是没有变化的,所以服务器不需要回传,直接把数据传给客户端
1.server1:调度器(VS)
yum install -y ipvsadm
2.server2:真实服务器(RS)
yum install -y httpd
3.server3:真实服务器(RS)
yum install -y httpd
注意:完成上述操作后,到此步骤功能都可以实现了,但是此时是随机访问的,调度器无反应,因为192.168.175.88在server1-3均有,server1,2,3都有可能被访问,上面的情况是随机访问到server3(真实服务器),显然在企业中是不可能的,客户端不能访问到真实服务器,所以我们要让真实服务器屏蔽客户端,即客户端就访问不到server2和server3,只能访问到调度器(server1)
4.真实服务器(server2和server3)屏蔽客户端
yum install arptables
5.server4进行测试:
6.纯代码步骤演示
调度器配置
[root@server1 ~]# yum install -y ipvsadm
[root@server1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
添加vip
[root@server1 ~]# ip addr add 192.168.56.100/24 dev eth0
添加lvs策略
[root@server1 ~]# ipvsadm -A -t 192.168.56.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 192.168.56.100:80 -r 192.168.56.12:80 -g
[root@server1 ~]# ipvsadm -a -t 192.168.56.100:80 -r 192.168.56.13:80 -g
[root@server1 ~]# 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.56.100:80 rr
-> 192.168.56.12:80 Route 1 0 0
-> 192.168.56.13:80 Route 1 0 0
真实服务器配置
server2:
安装测试服务
[root@server2 ~]# yum install -y httpd
[root@server2 ~]# systemctl start httpd
[root@server2 ~]# echo server2 > /var/www/html/index.html
[root@server2 ~]# systemctl enable httpd
rs也需要添加vip
[root@server2 ~]# ip a a 192.168.56.100/24 dev eth0
禁用arp
[root@server2 ~]# yum install arptables
[root@server2 ~]# arptables -A INPUT -d 192.168.56.100 -j DROP
[root@server2 ~]# arptables -A OUTPUT -s 192.168.56.100 -j mangle --mangle-ip-s 192.168.56.12
[root@server2 ~]# arptables-save > /etc/sysconfig/arptables
server3:
安装测试服务
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# systemctl enable --now httpd
[root@server3 ~]# echo server2 > /var/www/html/index.html
rs也需要添加vip
[root@server3 ~]# ip a a 192.168.56.100/24 dev eth0
禁用arp
[root@server3 ~]# yum install arptables
[root@server3 ~]# arptables -A INPUT -d 192.168.56.100 -j DROP
[root@server3 ~]# arptables -A OUTPUT -s 192.168.56.100 -j mangle --mangle-ip-s 192.168.56.13
[root@server3 ~]# arptables-save > /etc/sysconfig/arptables
测试
[root@server4 ~]# for i in {1..10}; do curl 192.168.56.100 ;done
server3
server2
server3
server2
server3
server2
server3
server2
server3
server2