目录
VS:Virtual Server(调度器)
RS:Real Server (真实业务主机)
CIP:Client IP (客户端主机的ip)
VIP: Virtual serve IP VS外网的IP (对外开放的让客户访问的ip)
DIP: Director IP VS内网的IP (调度器负责访问内网的ip)
RIP: Real server IP (真实业务主机IP)
访问流程:CIP-->VIP == DIP-->RIP
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
工作原理
VS根据请求报文的目标IP和目标协议(tcp,udp)及端口将其调度转发至某RS,根据调度算法来挑选RS
lvs集群的类型
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部 (CDN服务更好,不介绍)
lvs-fullnat: 修改请求报文的源和目标IP (需要打阿里补丁重新编译内核)
常用命令
bash
#增加
ipvsadm -A -t 172.25.254.100:80 -s rr #A添加,t使用tcp,s算法
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m #r后端主机,m为nat模式
ipvsadm -A -f 66 -p 3000 #f防火墙标记,p持续链接
#修改
[root@lvs-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr #E和e修改
[root@lvs-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10 -w 2 -m
[root@lvs-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.20 -w 5 -i
#删除
[root@lvs-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.20
[root@lvs-server ~]# ipvsadm -C
[root@lvs-server ~]# ipvsadm -D -f 66
#查看和持久化
[root@lvs-server ~]# ipvsadm -Ln
[root@lvs-server ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm #重启服务会自动加载规则
[root@lvs-server ~]# ipvsadm-restore < /etc/sysconfig/ipvsadm
nat实验
|------|--------------|
| VIP | 172.25.1.40 |
| DIP | 192.168.0.40 |
| RIP1 | 192.1680.20 |
| RIP2 | 192.1680.30 |
实验前先搭建环境,保证互通且能正常访问后端web服务器

bash
ipvsadm -Ln #查看LVS的调度规则
ipvsadm -A -t 172.25.1.40:80 -s rr #创建 VIP 172.25.1.40:80,使用轮询调度算法。
ipvsadm -a -t 172.25.1.40:80 -r 192.168.0.30 -m #将 192.168.0.30 加入 VIP,NAT 模式转发。
ipvsadm -a -t 172.25.1.40:80 -r 192.168.0.20 -m #将 192.168.0.20 加入 VIP,NAT 模式转发。


NAT模式
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
支持端口映射,可修改请求报文的目标PORT
VS必须是Linux系统,RS可以是任意OS系统


bash
[root@vscode ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf #注意路由转发
DR模式
DR模式只改变mac地址,让RS把返回数据包发给路由器,需要在环回上配置VIP(VIP不需要通告和响应),调度器在内网环境同网络号的VIP,DIP。网关是路由器
RS修改通告命令:
前两个是确保收到询问VIP的ARP时保持ignore,后两个是确保服务重启是网卡lo的vip不主动announce。0有就回答,1只认自己网卡收到的回复,2在1的条件上只回复主ip
root@rs1 \~# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#默认值0只要本机有该IP,任何接口收到请求都回应。改为1后,物理网卡eth0收到询问VIP的ARP包时,会检查:该VIP是否属于eth0?显然不是(VIP 在 lo 上),于是沉默不回应。
root@rs1 \~# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore#优先级高于all,虽然理论上 lo 接口几乎不会在物理网络上收到 ARP 广播,但某些内核版本或网络桥接场景下,lo 仍可能被触发。这条命令堵死了 lo 主动回应 ARP 的最后漏洞。
root@rs1 \~# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce#当 RS 上的网络服务启动、或 IP 地址发生变化时,内核会发送"免费 ARP"(Gratuitous ARP)来通告自己的 IP-MAC 映射。设成 2 后,内核会强制使用 lo 接口的 IP(通常没有配置,或使用 127.0.0.1)作为源,彻底杜绝 VIP 被通告出去。
root@rs1 \~# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce#这是一个全局兜底策略。即使因为某些进程误操作,试图通过物理网卡 eth0 发送包含 VIP 的 ARP 包,all=2 会强制拦截,改为使用 eth0 自身的 IP。确保"从哪里发出的包,就填哪里的 IP"。
bash
#永久修改RS的宣告
[root@rs1 ~]# sysctl -a | grep net.ipv4.conf.all.arp_announce #查看宣告参数
[root@rs1 ~]# vim /etc/sysctl.conf
# LVS-DR Real Server ARP 参数配置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@rs1 ~]# sysctl -p #重载配置文件
DR实验
路由器需要NAT模式(IP: 172.25.1.10/24)和仅主机模式(IP:192.168.0.10/24)
vsnode需要仅主机模式(VIP:192.168.0.80/24 )(DIP:192.168.0.40/24)
RS1需要仅主机模式(RIP:192.168.0.20/24)(lo:192.168.0.80/32)
RS1需要仅主机模式(RIP:192.168.0.30/24)(lo:192.168.0.80/32)
#在路由器中
root@router \~# systemctl disable --now ipvsadm.service
Removed "/etc/systemd/system/multi-user.target.wants/ipvsadm.service".
root@router \~# ipvsadm -C
#在路由器中
root@router \~# vmset.sh eth0 172.25.254.100 vsnode
root@router \~# vmset.sh eth1 192.168.0.100 vsnode noroute、
#设定内核路由功能
root@router \~# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
root@router \~# sysctl -p
net.ipv4.ip_forward = 1
#数据转发策略
root@router \~#iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.10
root@KA1 \~# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.25.1.10
RS1和RS2中解决响应问题 root@rs1 \~# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore root@rs1 \~# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore root@rs1 \~# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce root@rs1 \~# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce root@rs2 \~# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore root@rs2 \~# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore root@rs2 \~# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce root@rs2 \~# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
root@KA1 \~# ipvsadm -A -t 192.168.0.80:80 -s wrrroot@KA1 \~# ipvsadm -a -t 192.168.0.80:80 -r 192.168.0.20:80 -g
root@KA1 \~# ipvsadm -a -t 192.168.0.80:80 -r 192.168.0.30:80 -g
root@KA1 \~# 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.0.80:80 wrr
-> 192.168.0.20:80 Route 1 0 0
-> 192.168.0.30:80 Route 1 0 0
测试效果

防火墙标记解决错误轮询问题
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题



客户访问持久化
单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。所有使用-p参数

利用lvs对数据库读动作做负载均衡集群


