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

 

 
posted @ 2021-05-05 21:21  第七爻  阅读(435)  评论(0编辑  收藏  举报