当前位置: 首页 > news >正文

LVS:高性能负载均衡利器

LVS简介

 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。

LVS基于内核网络层工作,有着超强的并发处理能力,单台LVS可以承受上万的并发连接。LVS是基于4层的负载均衡软件,因此LVS在所有负载均衡软件中性能最强,稳定性最高,消耗CPU和内存少。LVS是工作在4层,所以它可以对应用层的所有协议作负载均衡,包括http、DNS、ftp等。

LVS 官网: http://www.linuxvirtualserver.org/

LVS 相关术语

VS: Virtual Server,负责调度

RS:RealServer,负责真正提供服务

集群和分布式简介

系统性能扩展方式:

1.向上扩展,增强(花钱购买提升处理能力)

2.向外扩展,增加设备,调度分配问题,Cluster

集群的概念:为解决某个特定问题将计算机组合起来形成单个系统

Cluster常见的三种类型:

LB:LoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问

(分摊给多个主机共同完成,减小压力)

【目的:解决单机处理不了所有请求的问题】

HA:High Availiablity(高可用)SPOF(single Point Of failure)

MTBF:Mean Time Between Failure 平均无故障时间,正常时间

MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间

A=MTBF/(MTBF+MTTR) (0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%

(计算结果越小故障时间越长)

(安排A,B两台LVS,B一般负责监督A工作,当A罢工时,B及时顶上)

【目的:阻止体系出现故障】

SLA(服务等级协议)是服务提供商与用户之间达成的正式契约,旨在明确服务性能与可用性标准,同时约定相关成本。协议执行质量通常由投入成本决定。行业惯例采用"三个9"(99.9%)或"四个9"(99.99%)等量化指标来衡量服务等级,未达标时将触发相应违约责任条款。运维工作的核心目标就是确保这些服务等级指标的达成。

停机时间可分为计划内维护与计划外故障两类,运维团队主要聚焦于预防和减少计划外停机事件。

HPC(高性能计算)作为国家战略资源,是指通过并行计算等技术实现超强运算能力的计算模式。

集群和分布式

集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据

和代码都是一样的。

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式

中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起

来,才是完整的业务。

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

来提升效率

对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器

完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决

定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,

都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败。

LVS概念

VSVirtual Server(调度器),内部两台机子通过vrrp实现高可用【HA】
RSReal Server(资源主机)
CIPClient IP(用户的IP)
VIP: Virtual serve IP VS外网的IP(客户访问的IP,也就是对外开放的IP)
DIP: Director IP VS内网的IP(调度器和资源主机联系的IP,也就是内网IP)
RIP: Real server IP(资源主机的IP)
访问流程:CIP <--> VIP == DIP <--> RIP
(用户通过自己的IP访问调度器的VIP,然后调度器使用与资源主机联系的特定IP【内网IP】访问资源主机的IP)
【NAT模式则是从资源主机(RIP)返回到用户IP(CIP)】

lvs集群的类型

vs-nat: 修改请求报文的目标IP,多目标IPDNAT

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

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

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

nat模式

Ivs-nat:

本质是多目标IPDNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RSRIP

PORT实现转发

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

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

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

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

nat模式数据逻辑

1.发出请求【客户端向调度器发送请求包,请求包里包含客户端的IP、目标IP(调度器对外联系的VIP)以及自己的端口号】

2.调度并修改请求报文【调度器接收到客户端发送的请求包后,将目标IP改为某台资源主机的IP,端口号改为对应资源主机的端口号,打包起来通过交换机发送给对应资源主机】

3.响应报文【资源主机在回应调度器时,将包中的发送方IP改成自己的IP,将目的IP改成客户端IP,然后打包通过交换机发送给调度器】

4.修改响应报文【调度器接受到来自资源主机的包后,将发送方改为自己对外链接的IP(VIP),目标IP不变,依旧是客户机;但是,将原来资源主机的端口号改为原来与客户机通信的端口号;打包发送给客户端】

5.接收响应【客户端收到调度器发送的通过报文响应的数据包】

nat模式的弊端:由于进出口都依靠于中间的调度器,大量的进出口会到达调度器的极限,影响客户的使用,建议资源主机尽量不要超过10台。【DR(直连路由模式)可解决该模式的弊端,在资源主机收到包后,将修改后的数据包直接跨过调度器之间发送到客户端,可大大减少了调度器的工作量】【DR只需要走两层结构,物理层,数据链路层,用的是mac地址,减少了时间的损耗】

nat模式的实现:

环境搭建:

镜像:rhel9

nat模式:172.25.254....

仅主机模式:192.168.0....

全网通:

在VS中设置内核路由功能,使同一个网卡都可以互相通信
查看参数:
sysctl -a | grep ip_forward

vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
查看配置:
sysctl -p

编写防火墙规则:

安装ipvsadm:
yum install ipvsadm -y
iptables -t nat -A POSTROUTING -o ens224 -j SNAT --to-source 172.25.254.100

查看:

iptables -t nat -nL

修改RS1,RS2的网关为VS的网关:

 vim /etc/NetworkManager/system-connections/nmcli connection reload 
nmcli connection up ens160 

测试:

[root@client ~]# ping 192.168.0.102

在VS中添加调度策略:

ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m

查看:

ipvsadm -Ln

【如果出现下图现象:

请使用该命令全部修改为Masq:

ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.101:80 -m

关闭防火墙,打开阿帕奇(httpd):

systemctl stop firewalld
systemctl start httpd

在RS1,RS2网页中写入内容:

echo "RS1 server - 192.168.0.101" > /var/www/html/index.html
echo "RS2 server - 192.168.0.102" > /var/www/html/index.html

客户机访问RS1,RS2:

[root@client ~]# curl 192.168.0.101
RS1 server - 192.168.0.101
[root@client ~]# curl 192.168.0.102
RS2 server - 192.168.0.102

查看:

cat /proc/net/ip_vs

cat /proc/net/ip_vs_conn

保存VS的规则:

ipvsadm -Sn
ipvsadm-save > /etc/sysconfig/ipvsadm

删除所有规则:

ipvsadm -C

查看是否删除:

ipvsadm -Ln

重新加载规则:

 ipvsadm-restore > /etc/sysconfig/ipvsadm

查看规则是否恢复:

ipvsadm -Ln

以上操作均为0时,如果想开机启动,请执行以下命令:

systemctl enable --now ipvsadm.service

客户机测试:

for N in {1..6};do curl 172.25.254.100;done

VS修改为权重调用算法:

ipvsadm -E -t 172.25.254.100:80 -s wrr
ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.101:80 -m -w 2
ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.102:80 -m -w 1

客户机测试:

for N in {1..6};do curl 172.25.254.100;done

部署DR模式集群案例:

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

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

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

环境搭建:

镜像:rhel9

nat模式:172.25.254....

仅主机模式:192.168.0....

配置环境:

关闭防火墙,开启阿帕奇服务(httpd):

systemctl stop firewalld
systemctl start httpd

修改lvs,RS1,RS2的网关:

vim /etc/NetworkManager/system-connections/ens160.nmconnection 

重启网络服务:

nmcli connection up ens160 
nmcli connection up ens160

将客户机的网关改为172.25.254.100

查看:

【目的是客户机将所有请求给路由器】

删除router的所有网关:

vim /etc/NetworkManager/system-connections/

lvs,RS1,RS2中设定vip:

ip addr add dev lo 192.168.0.100/32

RS1RS2中解决响应问题:

[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[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 2 > /proc/sys/net/ipv4/conf/all/arp_announce[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

lvs中配置策略:

安装:
yum install ipvsadm.x86_64 
ipvsadm -A -t 192.168.0.100:80 -s wrr
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g

查看:

ipvsadm -Ln

客户机测试:

for N in {1..6};do curl 192.168.0.100;done

TUN模式数据传输过程

TUN(IP Tunnel)模式是 LVS(Linux Virtual Server)的三种负载均衡模式之一(另外两种是 NAT 和 DR)。它通过 IP 隧道(IPIP 封装) 实现请求转发,适用于跨网络(如不同机房)的负载均衡场景。

TUN 模式的定义

  • TUN(IP Tunnel)

    • 采用 IP-over-IP 封装(类似 VPN),将客户端请求封装后转发给 Real Server(后端服务器)。

    • Real Server 直接响应客户端(不经过 LVS 调度器),适用于高并发、跨网络的负载均衡。

    • 要求 Real Server 支持 TUN 设备,并配置 VIP(Virtual IP)。

1.客户端发送请求数据包,包内有源IP+vip+dport

2.到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含

TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1

3.RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIPCIP) +port,响应数据包通过网络直接回传给client

1.DR模式的加强版,与DR模式相似

2.方式复杂,排错较为麻烦,容易仅仅因为router一个设备问题,导致系统崩溃

3.只有在需要跨VLAN时才会使用

TUN模式特点

1.DIP, VIP, RIP都应该是公网地址

2.RS的网关一般不能指向DIP

3.请求报文要经由Director,但响应不能经由Director

4.不支持端口映射

5.RSOS须支持隧道功能

总结

  • TUN 模式 适用于 跨网络、高并发 的负载均衡场景。

  • 数据流向
    客户端 → LVS(封装) → Real Server(解封装并直接响应) → 客户端

  • 优点:调度器压力小,支持跨机房。

  • 缺点:Real Server 需支持 TUN,配置较复杂。

如果需要跨公网部署负载均衡,TUN 模式是最佳选择之一!

TUN 模式 vs DR 模式 vs NAT 模式:

fullnet模式

什么是 FULLNAT 模式?

FULLNAT(Full Network Address Translation)是 LVS(Linux Virtual Server)的一种负载均衡模式,由 阿里云团队 在标准 NAT 模式基础上扩展而来,用于解决传统 NAT 模式的局限性。

核心特点

  • 双向地址转换

    • 请求时:修改 源 IP(CIP → LVS 内网 IP) 和 目标 IP(VIP → RIP)

    • 响应时:修改 源 IP(RIP → VIP) 和 目标 IP(LVS 内网 IP → CIP)

  • 透明代理:后端服务器(Real Server)无需感知客户端真实 IP,所有流量看似来自 LVS。

fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发

CIP --> DIP

VIP --> RIP

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

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

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

4.支持端口映射

 FULLNAT 模式的核心特点

FULLNAT vs 传统 NAT:

适用场景

  • 云计算平台(如阿里云 SLB):多租户隔离,后端服务器无需暴露公网 IP。

  • 跨机房负载均衡:Real Server 可分布在不同的网络环境中。

  • 安全隔离需求:隐藏客户端真实 IP,防止直接攻击后端服务。

总结

  • FULLNAT 是 NAT 的增强版,通过双向地址转换解决传统 NAT 的网络限制。

  • 优点:部署灵活,支持复杂网络拓扑,后端无需特殊配置。

  • 缺点:性能略低于 DR/TUN,需额外模块支持。

如果需要 跨网络、高安全性 的负载均衡方案,FULLNAT 是最佳选择之一!

http://www.dtcms.com/a/282145.html

相关文章:

  • DAC0832的扩展方式有哪些?
  • [硬件电路-28]:从简单到复杂:宇宙、芯片与虚拟世界的共通逻辑
  • Uniswap V2/V3/V4简短说明
  • 定制安全组-openstack定制安全组禁止特定云主机访问其他云主机
  • ST算法和ST表
  • 在Next.js里玩转pdf预览
  • django在线音乐数据采集-22647
  • Django+Celery 进阶:Celery可视化监控与排错
  • JobSet:Kubernetes 分布式任务编排的统一解决方案
  • flink sql读hive catalog数据,将string类型的时间戳数据排序后写入kafka,如何保障写入kafka的数据是有序的
  • 从零开始的云计算生活——番外4,使用 Keepalived 实现 MySQL 高可用
  • Django 接口自动化测试平台实现(一)
  • 蓝光三维扫描技术:汽车轮毂轴承模具检测的高效解决方案
  • 【tower】Rust tower库原理详解以及axum限流实战
  • 在新闻资讯 APP 底部切换不同类型界面,部分界面可以通过 ViewPager 实现滑动切换
  • 枫清科技参编的《人工智能知识工程指南(1.0)》发布
  • 压力测试Apache Bench(ab)
  • 从缓存 CAS 看Kimi K2使用的MuonClip优化器
  • 电力政策解读:山东电网新型储能集中调用的能源管理系统实现点
  • LinkedList集合源码解析
  • 超级天才如何批量制造?天才成长引擎模型:超级天才 = (学习速度泛化力 × 创造力 × 专注力) × 驱动力
  • python基础②-数据结构
  • AlpineLinux的用户管理
  • conda activate 时报错: CondaError: Run ‘conda init‘ before ‘conda activate‘
  • XC7A75T‑2FGG484I Xilinx Artix‑7 FPGA AMD
  • go项目实战
  • 深入解析Linux进程地址空间与虚拟内存管理
  • 虚拟内存管理--请求分页管理方式
  • 15.dispatcherRunner启动
  • 图机器学习(10)——监督学习中的图神经网络