LVS重新梳理

目录

lvs软件相关信息

工作原理

lvs集群的类型

常用命令

nat实验

NAT模式

DR模式

DR实验

防火墙标记解决错误轮询问题

客户访问持久化

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


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 wrr

root@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对数据库读动作做负载均衡集群

相关推荐
苍狗T20 小时前
LVS相关知识总结
linux·运维·服务器·lvs
changjiahong1 天前
lvs总结
服务器·数据库·lvs
kobeyyl1 天前
LVS项目全套知识点总结
lvs
Stewie121382 天前
LVS 项目知识点总结
lvs
Y_cheng_2 天前
LVS知识梳理
运维·服务器·lvs
高卧怡怡2 天前
LVS认识及基础详解
lvs
椿.湫2 天前
lvs技术
服务器·网络·lvs
懒神降世2 天前
LVS负载均衡集群项目总结(二)
运维·负载均衡·lvs
高磊20053 天前
LVS(Linux virual server)
linux·服务器·lvs