LVS简介
lvs工作在linux内核,OSI的4层。由于是内核转发,不需要监听socket,所以没有最大打开文件数的限制。nginx/haproxy 工作在7层,其4层代理,也是由模块实现工作在4层。都是监听socket,再由本地进行反代,向服务端发起请求。此时会有最大打开文件数的限制,65536个文件
由于LVS工作在4层,会有很多高级功能实现不了。比如ssl卸载
lvs工作模式
iptables的工作模式
image.pnglvs的工作模式
image.pngipvsadm是ipvs的管理工具
lvs的各种模式
VS:调度器
CIP:客户端IP
DIP:调度器的内网IP
VIP:调度器的外网IP
RS:后端真实服务器
ipvs NAT模式
ipvs NAT是修改目标IP和PORT,对其进行转发
image.png
- RS和VS必须在同一IP网络内,RS必须指向VS的网关,可以转发后端多DIP
- 请求和响应都经过VS,VS容易成为瓶颈
- 支持端口映射
- 后端的RS可以为任意主机
lvs DR 模式
重新封装包的MAC地址,进行转发
image.png
- RS和VS必须在同一物理网络,即RS和VS必须在同一组交换机下
- RS不用指向VS的网关,以确保包能过从RS直接发出去
- RS的VIP必须抑制通告和响应
1 .通过内核参数arp_ignore和arp_announce
2 .通过arptables
3 .前端路由器,绑定VS的MAC地址,后端RS的VIP,只对自己广播 - 不支持端口映射
lvs tun模式
在原报文中封装IP地址
image.png
- RIP,VIP,CIP均为公网地址
- 后端的RS必须支持隧道协议
- 不支持端口映射
lvs full NAT模式
改变请求报文的源IP地址和目标IP,源port和目标port
image.png
- 使其后端的RS不用指向VS的网关,其后端的RS可以为不同的网络
- 请求和响应报文都经过VS,VS易成为瓶颈
- 支持端口映射
- 非标准模式,必须重新编译内核才行
总结
ipvs NAT 和 ipvs full NAT
NAT:改变目标的IP和PORT,RS必须指向VS的网关
full NAT:改变源IP和PORT,目标IP和PORT
ipvs DR和TUN
DR:重新对请求报文的MAC地址进行封装(VS和RS在同一物理网络,同一组交换机下)
TUN:再原有的请求报文头部,再次封装一个IP包头(公网)
ipvs 算法
静态
根据算法
RR: 轮询算法
WRR:加权轮询
SH:根据源IP进行hash算法绑定,用于粘性session 绑定,相当于nginx的ip_hash。
DH:根据目标IP进行hash绑定,进行hash算法绑定,用于正向代理的负载均衡
用户通过正向代理上网,正向代理将用户请求的网站内容,缓存到本地。下一次用户访问相同站点,直接从代理缓存中获取站点内容即可。如果有两台正向代理,可以配置LVS的DH算法,让其相同的目标站点,都访问同一台正向代理服务器,加大缓存命中率
动态
根据后端服务器的负载情况
LC: 权重=(activeconnection256+inactiveconnection)
WLC: 权重=(activeconnection256+inactiveconnection)/w
SED: 权重=(actionconnection*256+1)/w
假设,后端RS,A(1),B(10),都没有连接。会使B(10)优先获得连接。而WLC,如果都没有连接,会按照次序,依次分配连接,可能会导致A(1),优先获得连接
NQ : 加强的SED
当A(1),B(10)一开始获得连接,当发现B(10)的连接数为10个,但A(1)才有1一个,会不公平。所以在一开始,分配连接时,先给B(10),A(1)都分配一个连接。随后按照权重,进行分配连接
虽然SED,和NQ比WLC更加公平,但其算法复杂,消耗的资源也多,所以WLC依然是最优算法
LBLC: 在DH,进行权重代理
正向代理,两台服务器,负载不一样时,有新目标的连接请求,会分配到负载比较小的那台机器
LBLCR: 把DH,进行权重代理,把缓存进行迁移共享
当A和B两台负载均衡,都负载了50%。但A有90%的活跃连接,B有10%的活跃连接。此时A的负载高于B的。VS的算法,会把A的缓存,迁移到B一份,B有A的缓存。再次有访问时,访问B即可。减轻A的负载
ipvsadm 使用说明
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
options
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
--weight -w weight capacity of real server
--stats output of statistics information
--rate output of rate information
--exact expand numbers (display exact values)
--connection -c output of current IPVS connections
-A 添加服务
-E 修改服务
-t tcp协议
-u udp协议
-f iptables flag标识
-s 调度算法
-p 是否持久连接 默认360s
-Z 清空计数器
-C 清空规则
-S 保存
-R 从文件中恢复规则
-a 添加后端RS节点
-g DR模式
-i TUN模式
-m NAT模式
-w 权重
--stats 显示所有连接的状态
--rate 显示速率
--connection 显示连接数
配置NAT
vs
外网IP 10.0.0.11
内网IP 172.16.1.11
# VS开启路由转发(此次试验没有开启,但马哥视频上说开启)
ipvsadm -A -t 10.0.0.11:80 -s rr
ipvsadm -a -t 10.0.0.11:80 -r 172.16.1.12 -m
ipvsadm -a -t 10.0.0.11:80 -r 172.16.1.13 -m
[root@mysql network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
TCP 10.0.0.11:80 rr
-> 172.16.1.12:80 Masq 1 0 3
-> 172.16.1.13:80 Masq 1 0 3
RS
RS的网卡指向vs内网网卡的IP,注意VS只配置内网网段。
测试
root@mysql network-scripts]# curl 10.0.0.11
172.16.1.11
[root@mysql network-scripts]# curl 10.0.0.11
172.16.1.12
[root@mysql network-scripts]# curl 10.0.0.11
172.16.1.11
[root@mysql network-scripts]# curl 10.0.0.11
172.16.1.12
配置 DR模式
VS
#开启路由转发
ifconfig ens33:0 10.0.0.0.14 netmask 255.255.255.255 boradcost 10.0.0.14
ipvsadm -A -t 10.0.0.14:80 -s rr
ipvsadm -a -t 10.0.0.0.14:80 -r 10.0.0.12 -g
ipvsadm -a -t 10.0.0.0.14:80 -r 10.0.0.13 -g
RS
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 10.0.0.14 netmask 255.255.255.255 boradcost 10.0.0.14
route add -host 10.0.0.14 dev lo:0
测试
注:curl 要全路径进行curl命令
- RS抑制arp应答
arp_ignore=1
0:只要跟eth0沟通,从eth1过来也可以
1:对eth0沟通,只能从eth0过来,从eth1过啦沟通不了
- 抑制ARP通告
arp_announce=2
0: C会刚给Aeth0和eth1的地址
1:C 尽量给A eth0的地址
2:C只会给Aeth0的地址 - 给RS添加路由
route add -host 10.0.0.14 dev lo
确保响应报文会从vip出去,因为报文从哪进来就从哪出去。(从VS到RS是重新封装MAC地址包,只解开第二层,第三层的目标IP包还是没有解开) - 配置RS的VIP的lo上
因为只有把VIP和CIP配置不在不同
LVS绑定服务
当用户请求80或443端口时,只需要VS后端负载一个集群。对用户,来说请求这两个端口,相当于请求的是一样的内容,包括算法
iptables -t mangle -A PREROUTING -d 10.0.0.14 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3
ipvsadm -A -f 3 -s sh
ipvsadm -a -f 3 -r 10.0.0.12 -g
ipvsadm -a -f 3 -r 10.0.0.13 -g
# 后端RS和配置DR模式一样
lvs 会话绑定
[root@mysql ~]# ipvsadm -E -f 3 -s rr -p
[root@mysql ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 3 rr persistent 360
-> 10.0.0.12:0 Route 1 0 0
-> 10.0.0.13:0 Route 1 0 0
# -p支持会话绑定默认360秒
如果后端服务为serice_ip:0的话,必须使用-p选项
image.png
网友评论