LVS

2020-05-03  本文已影响0人  麟之趾a

LVS简介

lvs工作在linux内核,OSI的4层。由于是内核转发,不需要监听socket,所以没有最大打开文件数的限制。nginx/haproxy 工作在7层,其4层代理,也是由模块实现工作在4层。都是监听socket,再由本地进行反代,向服务端发起请求。此时会有最大打开文件数的限制,65536个文件
由于LVS工作在4层,会有很多高级功能实现不了。比如ssl卸载

lvs工作模式

iptables的工作模式

image.png

lvs的工作模式

image.png

ipvsadm是ipvs的管理工具

lvs的各种模式

VS:调度器
CIP:客户端IP
DIP:调度器的内网IP
VIP:调度器的外网IP
RS:后端真实服务器

ipvs NAT模式

ipvs NAT是修改目标IP和PORT,对其进行转发


image.png

lvs DR 模式

重新封装包的MAC地址,进行转发


image.png

lvs tun模式

在原报文中封装IP地址


image.png

lvs full NAT模式

改变请求报文的源IP地址和目标IP,源port和目标port


image.png

总结

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算法绑定,用于正向代理的负载均衡

image.png

用户通过正向代理上网,正向代理将用户请求的网站内容,缓存到本地。下一次用户访问相同站点,直接从代理缓存中获取站点内容即可。如果有两台正向代理,可以配置LVS的DH算法,让其相同的目标站点,都访问同一台正向代理服务器,加大缓存命中率

动态

根据后端服务器的负载情况
LC: 权重=(activeconnection256+inactiveconnection)
WLC: 权重=(activeconnection
256+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命令

image.png image.png

arp_ignore=1
0:只要跟eth0沟通,从eth1过来也可以
1:对eth0沟通,只能从eth0过来,从eth1过啦沟通不了

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
上一篇下一篇

猜你喜欢

热点阅读