LVS相关知识点总结-一

一,什么是集群

1.1集群Cluster

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

二,集群分类

2.1Cluster常见的三种类型:

LB:LoadBalancing(负载均衡)

目标:将大量的并发访问请求,按照特定算法分摊给多台服务器处理,以此提高整个系统的响应能力和吞吐量

特点:依赖前端的负载调度器来分发请求;能处理高并发、高负载的场景

HA:High Availiablity(高可用)

目标:最大限度地减少服务中断时间,确保关键业务或服务的连续性和稳定性

特点:通过"主从"或"双工"模式,实现故障自动切换,消除故障

HPC:High-performance computing(超算,天河一号等)

目标:汇聚多台服务器的计算资源,完成单台服务器无法胜任的复杂计算任务

特点:将计算任务拆分并行处理

三,lvs的作用

LVS(Linux Virtual Server)的核心作用,是实现一个高性能、高可用的负载均衡集群
lvs集群体系结构

VS:Virtual Server(调度器)

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的4种模式及原理

4.1:lvs集群的类型

lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT

lvs-dr: 操纵封装新的MAC地址

lvs-tun: 在原请求IP报文之外新加一个IP首部

lvs-fullnat: 修改请求报文的源和目标IP

4.2:nat模式

原理:通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发

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

RIP和DIP应在同一个IP网络,且应使用私网址

RS的网关要指向DIP

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

VS必须是Linux系统,RS可以是任意OS系统

nat模式数据逻辑
nat模式数据逻辑

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)

2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口

3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)

4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口 ( 9000 -->80)

5.VS服务器把修改过报文的响应数据包回传给客户端 6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

4.3:DR模式

原理:LVS通过修改请求报文的目标MAC地址,将请求在局域网内直接转发给选中的RS。RS直接将响应返回给客户端,不经过LVS

特点:1.请求经过LVS,响应直接返回,性能最高

2.LVS和RS必须在同一个物理网段

3.不支持端口映射

4.需在RS上配置VIP并抑制ARP响应
DR模式数据传输过程

1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC

2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC

3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC

4.4:TUN模式:

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

4.5: fullnet模式

原理:LVS同时修改请求报文的源IP和目标IP(SNAT+DNAT),将其转发给RS。响应报文也必须回到LVS,再修改后返回

特点:1.VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP

2.RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client

3.请求和响应报文都经由Director

4.支持端口映射

五,lvs的13种算法

5.1:静态调度算法

1、RR:roundrobin 轮询

RS分别被调度,当RS配置有差别时不推荐

2、WRR:Weighted RR

加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少

3、SH:Source Hashing

实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定

4、DH:Destination Hashing

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

5.2:动态调度算法

1、LC:least connections(最少链接发)

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

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

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

3、SED:Shortest Expection Delay

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

4、NQ:Never Queue

第一轮均匀分配,后续SED

5、LBLC:Locality-Based LC

动态的DH算法,使用场景:根据负载状态实现正向代理

6、LBLCR:LBLC with Replication

带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS

六,lvs的多端口轮询问题解决方案

为什么:

LVS在默认情况下,会基于VIP:Port独立进行调度。这意味着,同一个客户端的HTTP请求(80端口)和HTTPS请求(443端口),可能会被LVS分发到两台不同的后端服务器上。如果应用程序的会话状态(如用户登录信息、购物车)保存在单台服务器本地,这就会导致"会话割裂"问题。

解决方式:利用火墙标记解决轮询错误

1.启动RS的https服务:

bash 复制代码
#RS1:
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd


#RS2:
[root@RS2 ~]# dnf install mod_ssl -y
[root@RS2 ~]# systemctl restart httpd

2.在vsnode中添加https的轮询策略

bash 复制代码
[root@vsnode boot]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g
[root@vsnode boot]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g
#默认200:80先前已经配置了没有的原理和配置和200:443相同

[root@vsnode boot]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@vsnode boot]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@vsnode boot]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g

#查询
[root@vsnode boot]# 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   1      0          0
TCP  192.168.0.200:443 rr
  -> 192.168.0.10:443             Route   1      0          0
  -> 192.168.0.20:443  

但此时(未配置火墙),会出现轮询重复的问题

解决方式:

bash 复制代码
[root@vsnode boot]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark  6666
#其中标记为6666为自定义的,不强制要求

[root@vsnode boot]# ipvsadm -A -f 6666 -s rr
[root@vsnode boot]# ipvsadm  -a -f 6666 -r 192.168.0.10 -g
[root@vsnode boot]# ipvsadm  -a -f 6666 -r 192.168.0.20 -g

此时查询将会解决

bash 复制代码
[root@client ~]# curl  192.168.0.200;curl -k https://192.168.0.200
RS2 - 192.168.0.20
RS1 - 192.168.0.10

#显示内容为echo "   " > 在RS1,2中写入index的

七,lvs的会话粘滞解决方案

会话粘滞(Session Stickiness)是解决"来自同一客户端的请求应始终发往同一台后端服务器"问题的统称。LVS提供了更常用和通用的方法:持久连接。

设定ipvs调度策略

bash 复制代码
[root@vsnode ~]# ipvsadm -A -f 6666 -s rr -p 1
#设定为-p 1,是为了更快的检测结果,不强制要求一定要是1s左右

[root@vsnode ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  6666 rr persistent 1
  -> 192.168.0.10:0               Route   1      0          0
  -> 192.168.0.20:0  
bash 复制代码
#第一次访问
[root@client ~]# curl  192.168.0.200
RS1 - 192.168.0.10

#在设定时间内再次尝试

[root@client ~]# curl  192.168.0.200
RS1 - 192.168.0.10

PS:实验环境(以DR为例)

虚拟机要求:

1台客户端:client,可以连接的NAT网卡

1台路由,负责在内部网络和外网访问:NAT+仅主机的卡

1台调度器,用于分发

多台(简单设置为2台)RS服务器

配置IP:

bash 复制代码
设定IP
#客户端
                    172.25.254.99
    
#路由器
                    172.25.254.100
                    192.168.0.100

#vsnode 调度器     
                    192.168.0.50

#RS1
                    192.168.0.10

#RS2
                    192.168.0.20



#配置ip是,可以提前配置相关脚本或使用vim直接进入进行修改
#使用前记得检查查看ip a,查看自己是否添加的先关的网卡,和卡名是否和输入对应

调度器配置:

bash 复制代码
#调度器

[root@vsnode ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection

#添加修改:

[connection]
id=eth0
type=ethernet
interface-name=eth0


[ipv4]
method=manual
address1==192.168.0.50/24,192.168.0.100


[root@vsnode ~]# cd  /etc/NetworkManager/system-connections/

[root@vsnode system-connections]#  cp -p eth0.nmconnection lo.nmconnection
#设定lo,拷贝只是为了方便配置
[root@vsnode system-connections]# vim lo.nmconnection


[connection]
id=lo
type=loopback
interface-name=lo


[ipv4]
method=manual
address1==127.0.0.1/8
address2=192.168.0.200/32


[root@RS1 system-connections]# nmcli connection reload

#重新加载并连接

[root@RS1 system-connections]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)
[root@RS1 system-connections]# nmcli connection up  lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)


#检测:
root@vsnode system-connections]# 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
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

#(结果以自己设定的为准)

客户端

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


[ipv4]
method=manual
address1=172.25.254.99/24,172.25.254.100
dns=8.8.8.8;

[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[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

路由器:

bash 复制代码
[root@router ~]# systemctl disable --now ipvsadm.service

[root@router ~]# ipvsadm -C

#停止并清空

[root@router ~]# vmset.sh eth0 172.25.254.100 vsnode
[root@router ~]# vmset.sh eth1 192.168.0.100 vsnode noroute


#设定内核路由功能
[root@router ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@router ~]# sysctl  -p
net.ipv4.ip_forward = 1


#数据转发策略
[root@router ~]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100


#此处在vsnode..
[root@vsnode ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100

RS:(RS1,RS2都需要进行配置)

bash 复制代码
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
[root@RS1 ~]# 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


#在lo上设定vip
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection

[root@RS1 system-connections]# vim lo.nmconnection


[connection]
id=lo
type=loopback
interface-name=lo

[ethernet]

[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32
method=manual


[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)


#arp禁止响应
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

(记得修改后要重启!)

如果不通,分别查看每个是否能ping通互联,能否转发,vip配置等

六,七都可再次基础上操作

或使用简化的:1分发vs,2RS进行操作

相关推荐
雯宝1 小时前
mnt_init 函数
linux
律宏阔7 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔7 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴7 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千7 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei377 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei377 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei377 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW7 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲7 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js