LVS四种工作模式
lvs工作原理
- 调度器:director,dispatcher,balancer
- RS:Real Server(后端真实提供服务主机)
- Client IP:CIP(客户访问的IP)
- Director Virtual IP:VIP(提供外网访问的虚拟IP)
- Director IP:DIP(虚拟IP主机上的真实IP)
- Real Server IP:RIP(后端真实提供服务主机的IP)
vs根据请求报文的目标IP和目标协议及端口将其调度转发值某个RS,根据调度算法来挑选RS,lvs是内核级功能,工作在INPUT链,将发往INPUT的流量进行“处理”。
查看内核支持LVS
[root@zabbix_server ~]# grep -i -C 10 ipvs /boot/config-4.18.0-193.el8.x86_64 ..................... # IPVS transport protocol load balancing support #LVS支持的协议 # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_AH_ESP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y CONFIG_IP_VS_PROTO_SCTP=y # # IPVS scheduler #调度算法 # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_FO=m #新增 CONFIG_IP_VS_OVF=m #新增 CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m # CONFIG_IP_VS_MH is not set CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m ......................
LVS工作模式
lvs-nat: 修改请求报文的目标IP,多目标IP的DANT
本质就是多个目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某个挑出的RS的RIP和PORT实现转发
特点:
1).RIP和DIP应在同一个IP网络,并且使用私网地址,RS的网关要指向DIP
2).请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
3).支持端口映射,可修改请求报文目标的PORT
4).VS必须是Linux系统,RS可以是任意OS系统
lvs-dr: 操作封装新的MAC地址
Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是挑选出的RS的RIP所在的接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变
特点:
1).Director和各个RS都有配置vip
2).确保前端路由器将目标IP为VIP的请求报文发往Director
1.在前端网关做静态绑定VIP和Director的MAC地址
2.在RS上使用arpteables工具
arpteables -A IN -d $VIP -j DROP arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
3.在RS上修改内核参数以限制arp通高及应答级别
/proc/sys/net/ipv4/conf/all/arp_ignore /proc/sys/net/ipv4/conf/all/arp_announce
3).RS的RIP可以使用私网地址,也可以使用公网地址,RIP与DIP在同一IP网络,RIP的网关不能指向DIP,以确保响应报文不会经由Doretor
4).RS与Director要在同一物理网络
5).请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
6). 不支持端口映射
7). RS可使用大多数的OS系统
lvs-tun:在原请求IP报文之外新加一个IP首部
转发方式: 不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS,RS直接响应给客户端(源IP是VIP,目标IP是CIP)
特点:
1).DIP、VIP、RIP可以是公网地址
2).RS的网关一般不能指向DIP
3).请求报文要经过Director,但响应不经由Director
4).不支持端口映射
5).RS的OS必须支持隧道功能
lvs-fullnat: 修改请求报文的源和目标IP
特点:
1).VIP是公网地址;RIP和DIP是私网地址,二者无须在同一个网络中
2).RS接收到的请求报文的源地址为DIP,因此要响应给DIP
3).请求报文和响应报文都必须经由Director
4).支持端口映射机制
5).RS的OS可以是任意OS
LVS调度算法
静态方法 根据算法本身进行调度
1)RR:roundrobin,轮询
2)WRR: Weighted RR,加权轮询
3)SH: Source Hasjing,实现session sticky,源IP地址hash,将来自于同一个IP地址的请求是在发往第一次挑中的RS,从而实现会话绑定。
4)DH: Destination Hashing;目标地址hash,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型的使用场景时正向代理缓存场景中的负载均衡,如:宽带运营商
动态方式
主要根据没个RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1).LC(最少连接): last connections适用于长连接应用
Ocerhead=activeconns*256+inactiveconns
2).WLC(加权最少连接): 默认调度算法
Ocerhead=(activeconns*256+inactiveconns)/weight
3).SED: Shortest Expection Delay, 初始连接高权重优先
Overhead=(activeconns+1)*256/weigh
4).NQ: Never Queue,第一轮均匀分配,后续SED
5).LBLC:Locality_Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6).LBLCR: LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
内核版本4.15版本后新增调度算法
FO(Weighted Fail Over)调度算法:在此FO算法中,遍历虚拟机服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度
OVF(Overflow-connection)调度算法:基于真实服务器的活动连接数量和权重值实现,将新的的连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
- 未过载(未设置IP_VS_DEST_F_OVERLOAD)
- 真实服务器当前的活动连接数量小于其权重值
- 权重值不为零
LVS相关软件
Unit File: ipvsadm.server 主程序:/usr/sbin/ipvsadm 规则保存工具: /usr/sbin/ipvsadm-save 规则重载工具: /usr/sbin/ipvsadm-restore 配置文件: /etc/sysconfig/ipvsadm-config ipvs调度规则文件:/etc/sysconfig/ipvsadm
ipvsadm命令 ipvsadm功能:
- 集群服务管理:增删改
- 集群服务的RS管理:增删改
- 查
安装工具包
yum -y install ipvsadm rpm -ql ipvsadm /etc/sysconfig/ipvsadm-config /usr/lib/.build-id /usr/lib/.build-id/e9 /usr/lib/.build-id/e9/2e0bac9713532c12e56e8290b695eafc6ffb50 /usr/lib/systemd/system/ipvsadm.service /usr/sbin/ipvsadm /usr/sbin/ipvsadm-restore /usr/sbin/ipvsadm-save /usr/share/doc/ipvsadm /usr/share/doc/ipvsadm/MAINTAINERS /usr/share/doc/ipvsadm/README /usr/share/man/man8/ipvsadm-restore.8.gz /usr/share/man/man8/ipvsadm-save.8.gz /usr/share/man/man8/ipvsadm.8.gz
ipvsadm用法
#管理集群服务 ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pepersistence_engine] [-b sched-flags] ipvsadm -D -t|u|f service-address #删除 ipvsadm -C #清空 ipvsadm -R #重载 ipvsadm -S [-n] #保存 #管理集群中的RS ipvsadm -a|e -t|u|f service-address -r service-address [-g|i|m] [-w weight] ipvsadm -d -t |u|f service-address -r server-address ipvsadm -L|1 [options] ipvsadm -Z [-t|u|f service-address]
集群管理服务
增、修改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
删除:
ipvsadm -D -t|u|f service-address
-t|u|f:
-t:TCP协议的端口,VIP:TCP_PORT
-u:UDP协议的端口,VIP:UDP_PORT
-f: firewall MARK,标记,一个数字
集群上的RS管理 增、改
ipvsadm -a|e -t|u|f service-address -r service-address [-g|i|m] [-w weight]
删除
ipvsadm -d -t |u|f service-address -r server-address
server-address: rip[:port]如省略port,不作端口映射
[-g|i|m]LVS类型
-g:gateway,dr类型,默认
-i: ipip,tun类型
-m: masquerade,nat类型
-w weight: 权重
LVS-NAT模式实现
这里为了方便关闭防火墙
环境 | IP | 服务 |
---|---|---|
centos 8 | eth0 仅主机 192.168.248.130/24 | Client |
centos 8 |
eth0 NAT 10.0.0.5/24 eth1 仅主机 192.168.248.190/24 |
LVS |
centos 7 |
eth0 10.0.0.9/24 gw 10.0.0.5 |
RS1 httpd |
centos 7 |
eth0 10.0.0.10/24 gw 10.0.0.5 |
RS1 httpd |
配置过程
1)配置RS
[root@rs1 ~]# yum -y install httpd [root@rs1 ~]# echo "10.0.0.9" > /var/www/html/index.html [root@rs2 ~]# yum -y install httpd [root@rs2 ~]# echo "10.0.0.10" > /var/www/html/index.html
2). LVS启用IP_FORWARD功能
[root@lvs ~]# yum -y install ipvsadm [root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf [root@lvs ~]# sysctl -p net.ipv4.ip_forward = 1 [root@lvs ~]# sysctl -a | grep ip_forward net.ipv4.ip_forward = 1 net.ipv4.ip_forward_update_priority = 1 net.ipv4.ip_forward_use_pmtu = 0
3).添加集群
-t 指定VIP -s 指定算法默认WLC [root@lvs ~]# ipvsadm -A -t 192.168.248.190:80 -s rr #集群已经创建 [root@lvs ~]# 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.248.190:80 rr #添加RS -m NAT模式 [root@lvs ~]# ipvsadm -a -t 192.168.248.190:80 -r 10.0.0.9 -m [root@lvs ~]# ipvsadm -a -t 192.168.248.190:80 -r 10.0.0.10 -m #RS已经添加 [root@lvs ~]# 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.248.190:80 rr -> 10.0.0.9:80 Masq 1 0 0 -> 10.0.0.10:80 Masq 1 0 0
在client上访问测试
可以看到已经是以轮询的方式访问了
[root@client ~]# curl 192.168.248.190 10.0.0.10 [root@client ~]# curl 192.168.248.190 10.0.0.9 [root@client ~]# curl 192.168.248.190 10.0.0.10 [root@client ~]# curl 192.168.248.190 10.0.0.9 #在LVS上查看 [root@lvs ~]# 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.248.190:80 rr -> 10.0.0.9:80 Masq 1 0 2 -> 10.0.0.10:80 Masq 1 0 2 [root@lvs ~]# cat /proc/net/ip_vs_conn Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires PEName PEData TCP C0A8F8AA 92FA C0A8F8BE 0050 0A00000A 0050 TIME_WAIT 24 TCP C0A8F8AA 92FC C0A8F8BE 0050 0A000009 0050 TIME_WAIT 25 TCP C0A8F8AA 92F6 C0A8F8BE 0050 0A00000A 0050 TIME_WAIT 23 TCP C0A8F8AA 92F8 C0A8F8BE 0050 0A000009 0050 TIME_WAIT 24 #保存规则 [root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm #清空规则 [root@lvs ~]# ipvsadm -C [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn #重载规则 [root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm [root@lvs ~]# 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.248.190:80 rr -> 10.0.0.9:80 Masq 1 0 0 -> 10.0.0.10:80 Masq 1 0 0
加权轮询
[root@lvs ~]# ipvsadm -E -t 192.168.248.190:80 -s wrr [root@lvs ~]# ipvsadm -e -t 192.168.248.190:80 -r 10.0.0.9 -m -w 3 #客户端测试 [root@client ~]# curl 192.168.248.190 10.0.0.9 [root@client ~]# curl 192.168.248.190 10.0.0.9 [root@client ~]# curl 192.168.248.190 10.0.0.10 [root@client ~]# curl 192.168.248.190 10.0.0.9 [root@client ~]# curl 192.168.248.190 10.0.0.9 [root@client ~]# curl 192.168.248.190 10.0.0.9 [root@client ~]# curl 192.168.248.190 10.0.0.10
开启https,在后端服务器安装mod_ssl
[root@rs1 ~]# yum -y install mod_ssl [root@rs2 ~]# yum -y install mod_ssl [root@rs1 ~]# systemctl restart httpd [root@rs2 ~]# systemctl restart httpd
LVS添加集群
[root@lvs ~]# ipvsadm -A -t 192.168.248.190:443 -s rr [root@lvs ~]# ipvsadm -a -t 192.168.248.190:443 -r 10.0.0.9 -m [root@lvs ~]# ipvsadm -a -t 192.168.248.190:443 -r 10.0.0.10 -m
client端访问,会发现它会认为https和http是两个不同的服务,当一个访问https一个访问http时可能会调度到一个RS,它会认为https和http是两个不同的服务
[root@lvs ~]# curl -k https://192.168.248.190;curl http://192.168.248.190 10.0.0.10 10.0.0.10 [root@lvs ~]# curl -k https://192.168.248.190;curl http://192.168.248.190 10.0.0.9 10.0.0.9
在LVS上使用防火墙标签只要使用80或443便认为是同一个服务
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.248.190 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 100 [root@lvs ~]# iptables -t mangle -nvL Chain PREROUTING (policy ACCEPT 6 packets, 408 bytes) pkts bytes target prot opt in out source destination 0 0 MARK tcp -- * * 0.0.0.0/0 192.168.248.190 multiport dports 80,443 MARK set 0x64 [root@lvs ~]# ipvsadm -C [root@lvs ~]# ipvsadm -A -f 100 -s rr [root@lvs ~]# ipvsadm -a -f 100 -r 10.0.0.9 -m [root@lvs ~]# ipvsadm -a -f 100 -r 10.0.0.10 -m
client上访问
[root@client ~]# iptables -F [root@client ~]# curl -k https://192.168.248.190;curl http://192.168.248.190 10.0.0.10 10.0.0.9 [root@client ~]# curl -k https://192.168.248.190;curl http://192.168.248.190 10.0.0.10 10.0.0.9
LVS-dr同网段模型
环境 | IP | 服务 |
centos 8 |
eth0 仅主机 192.168.248.140/24 gw 192.168.248.190 |
Client |
centos 8 |
eth0 DIP NAT 10.0.0.8/24 LO VIP 10.0.0.100/32 gw 10.0.0.5 |
Lvs |
centos 8 |
eth0 NAT 10.0.0.5/24 eth1 仅主机 192.168.248.190/24 |
Route |
centos 7 |
eth0 10.0.0.9/24 gw 10.0.0.5 LO VIP 10.0.0.100/32 |
RS1 httpd |
centos 7 | eth0 10.0.0.10/24
gw 10.0.0.5 LO VIP 10.0.0.100/32 |
RS1 httpd |
router配置
[root@route ~]# echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf [root@route ~]# sysctl -p
配置RS,两台RS都需要配置
修改RS [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 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@rs1 ~]# ifconfig lo:1 10.0.0.100/32
配置LVS
[root@rs1 ~]# ifconfig lo:1 10.0.0.100/32 [root@LVS ~]# yum -y install ipvsadm #定义策略 [root@LVS ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@LVS ~]# ipvsadm -A -t 10.0.0.100:80 -s wrr [root@LVS ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.9 -g [root@LVS ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.10 -g
在client上访问
[root@client ~]# curl 10.0.0.100 10.0.0.9 [root@client ~]# curl 10.0.0.100 10.0.0.10 [root@client ~]# curl 10.0.0.100 10.0.0.9 [root@client ~]# curl 10.0.0.100 10.0.0.10 [root@client ~]# curl 10.0.0.100 10.0.0.9 [root@client ~]# curl 10.0.0.100 10.0.0.10