LVS详解及其NAT模式与DR模式部署(全网最详细!!!)

news2024/12/28 2:08:09

文章目录

      • LVS集群概念
        • 集群和分布式
      • LVS运行原理
        • LVS简介
        • LVS专业术语
        • 工作原理
        • LVS调度算法
        • ipvsadm常用命令
      • LVS工作模式及其原理
        • NAT模式
        • DR模式
        • TUN模式
        • fullnet模式
      • 部署NAT模式集群案例
        • DR模式(企业中最常用)
        • LVS持久链接(session回话问题解决)

LVS集群概念

Cluster集群: 是为了解决某个特定问题将多台计算机组合起来形成的单个系统。

Cluster集群三种类型:

  • LB: LoadBalancing,负载均衡,由多个主机组成,每个主机只承担一部分访问。
  • HA: High Availiablity,高可用,避免 SPOF(single Point Of failure 单点故障)。
  • HPC: High-performance computing,高性能计算。
集群和分布式
  • 集群: 同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。

  • 分布式: 一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。

区别:分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率

LVS运行原理

LVS简介

LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目。负载调度器,内核集成。

LVS专业术语
  • DR: Director Balancer 负载均衡器、分发器

  • VS: Virtual Server 负载均衡集群对外提供的IP+Port

  • 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

工作原理

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。也就是说,用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。对于用户来说,看不到WEB后端具体的应用。

LVS调度算法

lvs调度算法类型

ipvs scheduler: 根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法。

静态方法: 仅根据算法本身进行调度,不考虑RS的负载情况。

动态方法: 主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度。

lvs静态调度算法

  • RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐。

  • WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少。

  • SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定。(session可以理解为服务器和客户端建立的一个沟通,session保存在服务器上,cookie保存在客户端上)

  • DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商。

lvs动态调度算法

主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度.

  • LC:least connections(最少链接)

    适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)

  • WLC:Weighted LC(权重最少链接)

    默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight

  • SED:Shortest Expection Delay

    初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight。但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接。

  • NQ:Never Queue,第一轮均匀分配,后续SED。

  • LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理。

  • LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS。

ipvsadm常用命令
1.管理集群服务中的增删改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记,是一个数字


2.管理集群中RealServer的增删改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
-a #添加realserver
-e #更改realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ipip隧道模式
-m #nat模式
-w #设定权重
-Z #清空计数器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :输出速率信息

LVS工作模式及其原理

NAT模式

网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,他修改的是IP地址) --利用三层功能。

  • 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发

  • RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

  • 支持端口映射,可修改请求报文的目标PORT

  • VS必须是Linux系统,RS可以是任意OS系统
    在这里插入图片描述

  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  3. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP。
  4. POSTROUTING链通过选路,将数据包发送给Real Server 、Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP。
  5. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。

原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的源IP地址改为自己的IP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。

DR模式

直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址)–利用二层功能mac地址。

  1. Director和各RS都配置有VIP

  2. 确保前端路由器将目标IP为VIP的请求报文发往Director

  3. 在前端网关做静态绑定VIP和Director的MAC地址

    • 在RS上使用arptables工具
    arptables -A IN -d $VIP -j DROP
    arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
    
    • 在RS上修改内核参数以限制arp通告及应答级别
    /proc/sys/net/ipv4/conf/all/arp_ignore
    /proc/sys/net/ipv4/conf/all/arp_announce
    
  4. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;

  5. RIP的网关不能指向DIP,以确保响应报文不会经由Director

  6. RS和Director要在同一个物理网络

  7. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

  8. 不支持端口映射(端口不能修败)

  9. RS可使用大多数OS系统
    在这里插入图片描述

  • 首先用户用CIP请求VIP。
  • 根据上图可以看到,不管是Director Server还是Real Server上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer。
  • 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
  • PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  • IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址。
  • 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
  • RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP。
  • 响应报文最终送达至客户端。

原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。

TUN模式

IP隧道(Tunnel)模式

转发方式:不修改请求报文的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须支持隧道功能

在这里插入图片描述

  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。

  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。

  3. IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP。

  4. POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP。

  5. RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP

  6. 响应报文最终送达至客户端

原理:互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项

fullnet模式

在这里插入图片描述
原理:客户端对VIP发起请求,Director接过请求发现是请求后端服务。Direcrot对请求报文做full-nat,把源ip改为Dip,把目标ip转换为任意后端RS的rip,然后发往后端,rs接到请求后,进行响应,相应源ip为Rip目标ip还是DIP,又内部路由路由到Director,Director接到响应报文,进行full-nat。将源地址为VIP,目标地址改为CIP。

部署NAT模式集群案例

在这里插入图片描述
在这里插入图片描述
环境准备

从RHEL9.4母机中克隆出三台主机

主机1:LVS

添加一张网卡eth1,网络设定为仅主机模式,原有的eth0网络为nat模式。

eht0:运行脚本设定网络eth0、ip为172.25.254.100、网关172.25.254.2 主机名lvs.wwwl.org

eht1:运行脚本设定网络eth1、ip为192.268.0.100、主机名lvs.wwwl.org。网卡配置文件删掉网关

[root@lvs boot]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.100/24
method=manual

nmcli connection reload
nmcli connection up eth1

在LVS主机中打开内核路由功能

[root@lvs boot]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_forward=1

[root@lvs boot]# sysctl -p
net.ipv4.ip_forward=1


主机2:webserver1

网络设定为eth0仅主机模式。运行脚本设定eth0、ip为192.168.0.10 主机名webserver1.wwwl.org 。修改网关为192.168.0.100

配置文件

[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
dns=114.114.114.114;

nmcli connection reload 
nmcli connection up eth0


# 下载httpd
[root@webserver1 ~]# dnf install httpd -y

[root@webserver1 ~]# echo webserver1:192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# 
[root@webserver1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

主机3:webserver2

网络设定为eth0仅主机模式。运行脚本设定eth0、ip为192.168.0.20 主机名webserver2.wwwl.org 。修改网关为192.168.0.100

配置文件

[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
dns=114.114.114.114;

nmcli connection reload 
nmcli connection up eth0


# 下载httpd
[root@webserver2 ~]# dnf install httpd -y

[root@webserver2 ~]# echo webserver2:192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

在LVS主机中测试

[root@lvs boot]# curl 192.168.0.10
webserver1:192.168.0.10
[root@lvs boot]# curl 192.168.0.20
webserver2:192.168.0.20
# LVS中安装LVS软件
[root@lvs ~]# dnf install ipvsadm -y

### 在lvs中添加调度策略
# 使用 ipvsadm 工具创建一个新的基于 TCP 协议的虚拟服务。rr轮询调度算法
ipvsadm -A -t 172.25.254.100:80 -s rr

# -a 选项表示向已有的服务添加一个真实服务器(Real Server)。
# -t 172.25.254.100:80 指明了要添加真实服务器的虚拟服务的地址和端口。
# -r 192.168.0.10:80 表示要添加的真实服务器的地址和端口。
# -m 表示使用 NAT(Network Address Translation,网络地址转换)模式。
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m

ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

# 查看策略
[root@lvs boot]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          0         
  -> 192.168.0.20:80              Masq    1      0          0
  
  
  
 # LVS主机中将当前的 ipvsadm 配置保存到指定的文件 /etc/sysconfig/ipvsadm 中。
ipvsadm-save > /etc/sysconfig/ipvsadm

# 清空规则
ipvsadm -C
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

在另外一台172.25.254.0网段的主机中测试

[root@test ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
DR模式(企业中最常用)

在这里插入图片描述
在这里插入图片描述
环境准备

需要5台虚拟机,全部都从最开始RHEL9.4的母盘中克隆出来,运行脚本修改IP主机名和网关

只需在上述NAT模式中进行添加主机即可

更改LVS主机的网络环境

# 删掉eth0、eth1网卡,重新配置网络环境
[root@lvs ~]# nmcli connection delete eth1
Connection 'eth1' (5eb4da26-5d1d-30a5-8747-80181ed055fa) successfully deleted.
[root@lvs ~]# nmcli connection delete eth0
Connection 'eth0' (7ba00b1d-8cdd-30da-91ad-bb83ed4f7474) successfully deleted.

# 重新配置eth1仅主机的网卡
# 配置IP为192.168.0.50 网关为192.168.0.100
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
dns=114.114.114.114;
[root@lvs ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1


路由器

从母盘中克隆出一台虚拟机充当路由器,克隆完后添加一张网卡设定为仅主机模式

eth0网卡设定NAT模式 IP为172.25.254.100

eth1网卡设定仅主机模式 IP为192.168.0.100 网关和dns都不需要,进入配置文件删掉

[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.100/24
method=manual

[root@router ~]# 

打开路由内核功能

[root@router ~]# vim /etc/sysctl.conf 
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1[root@router ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_forward=1

[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

客户端

从母盘中克隆出一台虚拟机充当客户端

设定IP为172.25.254.20 修改网关为172.25.254.100

[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual

[root@client ~]# nmcli connection reload 
[root@client ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.100  0.0.0.0         UG    100    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

在两台Real Server上禁用ARP响应

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1)在前端网关做静态绑定

(2)在各RS使用arptables

(3)在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

  • 0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

  • 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别:arp_announce

  • 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

  • 1:尽量避免将接口信息向非直接连接网络进行通告

  • 2:必须避免将接口信息向非本网络进行通告

# RS主机中使VIP不对外响应,仅对lo生效。注意这只是设定的临时的,系统重启后不生效需要重新配置。在企业中需要把这些设定写入/etc/sysctl.conf配置文件中,然后运用sysctl -p设定
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

在LVS、RS1和RS2上设定VIP

# 两台Real Server的网关必须指定为路由器的内网接口,此处在NAT模式已经设定好为192.168.0.100
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

[root@webserver2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0


# 直接利用环回接口设定VIP
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo

[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo

[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo

LVS策略设定

# 将之前的策略清空
[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 -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[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.0.200:80 wrr
  -> 192.168.0.10:80              Route   1      0          0         
  -> 192.168.0.20:80              Route   2      0          0         

# 客户端访问
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20

防火墙mark标记解决调度问题

以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题

当第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上

问题呈现

# 在RS1和RS2中安装mod_ssl模块,让RS支持https,重启apache
[root@webserver1 ~]# yum install mod_ssl -y
# 安装完后一定要重启httpd,不重启不生效。重启完过后就可以通过https访问Real Server
[root@webserver1 ~]# systemctl restart httpd

[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver2 ~]# systemctl restart httpd

# 在LVS上测试一下 -k表示访问时忽略证书
[root@lvs ~]# curl -k https://192.168.0.20
webserver2:192.168.0.20

# 在LVS上添加对于443端口的策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[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.0.200:80 rr
  -> 192.168.0.10:80              Route   1      0          0         
  -> 192.168.0.20:80              Route   2      0          0         
TCP  192.168.0.200:443 rr
  -> 192.168.0.10:443             Route   1      0          0         
  -> 192.168.0.20:443             Route   1      0          0

此时有两个集群,两个集群调度的主机都为同一个,所以就会出现轮询错乱的问题。当客户端访问的时候两个请求都到达了同一台主机上,我们期望的是第一个请求到达webserver1上,第二个请求到达webserver2上,所以此时的效果是不合理的。所以我们就用mark标记来解决调度问题。

[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver2:192.168.0.20
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver1:192.168.0.10
webserver2:192.168.0.20

防火墙mark标记

FWM:FireWall Mark

MARK target 可用于给特定的报文打标记 --set-mark value

其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务:可将多个不同的应用使用同一个集群服务进行调度

实现方法:

在Director主机打标记:

iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports
$portl,$port2,..-i MARK --set-mark NUMBER

在Director主机基于标记定义集群服务:

ipvsadm -A -f NUMBER [options]
# 清空策略
[root@lvs ~]# ipvsadm -C

# LVS主机中为端口做标记
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 66
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       6    --  0.0.0.0/0            192.168.0.200        multiport dports 80,443 MARK set 0x42

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

[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 -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  66 rr
  -> 192.168.0.10:0               Route   1      0          0         
  -> 192.168.0.20:0               Route   1      0          0         

# 客户端测试
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver1:192.168.0.10

此时就能防止访问多个端口的时候访问到同一台主机,使这台主机压力过大的问题。把两个端口用标记捆绑到一起被视为同一个,然后访问标记开始轮询。

LVS持久链接(session回话问题解决)

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。

解决方案

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上;

如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上;

如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上。

ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒

# 在lvs调度器中设定

[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]

[root@lvs ~]# ipvsadm -LnC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SimpleITK C++版在windows 下编译

一般都是用python 版的SimpleITK,因为项目需要集成到C Qt上,然后ITK用起来又不如SimpleITK方便,所有就编译了C版的Sitk,下面记录下过程。 版本对应 SimpleITK 编译需要ITK ,而且不同版本需要对应不同的ITK,sitk 2.2.1 对应ITK 5…

基于Hadoop的海量电商用户行为分析及机器学习购买预测研究【购物行为分析、100万条数据案例项目】

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主引言研究背景国内外研究现状研究目的研究意义 关键技术理论介绍Hadoop集群搭建及数据准备Hadoop全套组件搭建数据集介绍数据预处理 基于大数据的电商用户行为指标分析HIve准备数据表flume配…

在哪些行业中,3D 技术发挥了重要作用?

3D技术目前常见于行业或领域中的应用,主要包括3D数字孪生、3D打印等。3D数字孪生技术作为一种前沿技术,在多个行业中发挥着重要作用,它通过创建物理实体的数字化副本,实现对实体的实时监控、预测和优化。以下是一些3D数字孪生技术…

【总结】TCP/IP四层模型的理解

在开始之前放上一张本文章的核心图片,要一直记住图中的内容!!! 一、概念理解 首先我们知道分析网络的时候有两种模型,一种是OSI七层模型,另一种就是TCP/IP四层模型。一般来说,我们常用的就是TC…

医疗工厂网络同步时钟,子母钟系统结构,可使用十年以上

在医疗和工业领域,准确的时间信息对于确保各项工作的高效运行至关重要。网络同步时钟系统因其高精度、易维护等特点,成为现代医疗工厂不可或缺的时间管理工具。本文将详细介绍网络同步时钟系统的优点及其技术细节。 一、网络同步时钟优点 网络同步时钟系…

工业设计用什么CAD软件?SolidWorks 成为您创意实现的得力助手

随着科技的发展,工业设计已经进入了数字化时代。对于设计师来说,选择一款高效、功能全面的设计软件至关重要。在市场上众多的CAD(计算机辅助设计)软件中,SolidWorks因其出色的性能和广泛的适用性而备受青睐。本文将介绍…

各地区搭子群扩列群h5公众号小程序app开源版开发

各地区搭子群扩列群多开h5公众号小程序app开源版开发 多端应用,源码开源支持自主二开;域名授权。 搭子群和扩列群通常是用来帮助人们找到志同道合的朋友或活动伙伴的社交平台。这些平台可以采用H5页面、微信公众号、小程序或独立的应用程序等形式。下面…

winform 设置TabControl中tab标签的宽度

问题: tabpage标签太挤了,标签间的间隔也不明显。解决方法: 将TabControl的SizeMode属性设为Fixed设置ItemSize的大小(width) 调整后效果:

暗区突围端游下载不了/下载失败/下载太慢的有效解决办法分享

暗区突围端游的第一次测试已经过去了一段时间了,毕竟是第一次测试,当时还是有很多问题的,比如说很多玩家根本拿不到测试资格,还有些是因为游戏优化太差,卡的就玩不了。现在这些问题通通不用担心了,端游在13…

和鲸科技助力 Datathon 会前培训成功举行,“理-工-医-信”跨学科合作,以数据驱动医疗实践

2024 年 8 月 3 日,由解放军总医院和中国生物医学工程学会临床医学工程分会共同举办的第五届“解放军总医院—麻省理工学院医疗大数据学术交流及 Datathon 活动”会前培训班于线上圆满收官,和鲸科技为会前培训班提供全程技术平台支持,该培训班…

掌握 4个SD 卡数据恢复技巧,避免数据丢失!

SD 卡作为一种常见的存储设备,里面通常存放着完美的照片、视频、文档等重要数据。但是,在生活中SD 卡数据丢失的情况时有发生,非常令人崩溃。那今天咱们就来讨论一下4个有效恢复SD卡数据的方法! 1、福昕estore 直通车&#xff1a…

软硬链接和动静态库

为什么一定要提供路径呢? 因为要根据路径找到文件 一切与路径相关的问题都是方便用户去访问文件 软硬链接 给我康康 软链接是这样的: ln -s file_target1.txt file_soft.link 软链接有独特的innode 这是硬链接: ln file_target2.txt …

免费【2024】springboot 高校毕业生离校管理系统的设计与实现

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

BIMRender渲染器插件上线 |一款免费的模型实时渲染插件

说到模型渲染和渲染软件 我猜你肯定遇到过下面这些问题: ● 投入产出比低:项目汇报需要高质量的渲染效果图,又不希望在低使用频率的渲染软件投入时间和高昂的成本,专门安装它们似乎并不划算; ● 操作复杂:…

湖北建筑特种作业人员“秘籍”:取证、延期、注销全攻略

湖北建筑特种作业人员“秘籍”:取证、延期、注销全攻略 湖北建筑施工特种作业人员 特种作业人员考核取证、继续延期、变更注销等全部事项都已下放到各市州主管部门。也就是说在湖北省报考建筑电工、焊工、架子工、信号工、起重机械司机、施工升降机等可以就近选择。…

2024高中生必备物品有哪些?学生党速看这五件好物

新的一年开学季又来临了,许多同学还在犹豫要为开学准备哪些物品呢?今天小编整理了五件高中生必备物品,学生党请收下这份清单,从学习用品到生活用品、从智能产品到健康防护,这些小物都在学习生活中发挥着重要作用&#…

Java程序设计:Java 网络聊天室服务器端

网络编程相关内容见上一篇:Java程序设计:Java网络编程实验 目录 1 实验名称 2 实验目的 3 实验源代码 4 实验运行结果图 5 总结 1 实验名称 Java 网络聊天室服务器端 2 实验目的 继续熟练掌握在eclipse中调试代码 掌握Java面向对象思想掌握多线程在该项目中的…

数据加密-AES数据加密及C#实现

引言 AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准与技术研究院(NIST)于2001年发布。AES以其高效、安全的特点,在数据加密领域占据了重要地位。 using System; us…

XGP怎么免费玩暗黑4 暗黑4XGP免费白嫖教程

暗黑四新赛季已经开启了,全新赛季一定能给你带来完全不一样的感受,在新赛季中,恶魔入侵,炼狱大军来袭,玩家在完成世界阶级三任务线之后,就可以参与炼狱大军的战斗,怪物会一波一波的形式攻击&…

html+css+js网页制作 船票网1个订单页面带js 有增加和删除功能

htmlcssjs网页制作 船票网1个订单页面带js 有增加和删除功能 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。…