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

LVS(Linux Virtual Server)负载均衡详解

 一、LVS简介与集群概念


1.  LVS(Linux Virtual Server)

即Linux虚拟服务器,是一个高性能、高可用的服务器集群解决方案,现已集成至Linux内核中。它通过IP虚拟化技术通过将网络流量分散到多个服务器上,从而提高网络服务的可用性和扩展性,实现数据请求的负载均衡调度,广泛应用于需要大量并发处理能力的场景。

2. 集群

1. 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。

集群组成后,可以利用多个计算机和组合进行海量请求处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用HA),使得任何一个机器坏了整个系统还是能正常运行。

2、负载均衡集群技术
负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。

负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。

 二、LVS的三种工作模式

1.  NAT模式(Network Address Translation,网络地址转换)

原理:
NAT模式使用Linux的网络地址转换功能,将进入的IP数据包的源地址转换为虚拟服务器的地址,然后根据预设的调度算法将请求分发到后端的真实服务器。真实服务器处理完请求后,直接将响应数据包发送回客户端,无需再次经过LVS。

特点:
所有流量都经过LVS,因此LVS成为潜在的瓶颈。
适用于内部网络结构,安全性较高。

配置要点:
LVS需要至少两块网卡,一块用于内部网络通信,另一块用于外部网络通信。
需要配置iptables规则来进行地址转换。

示例命令

ipvsadm -A -t <VIP>:80 -s rr
ipvsadm -a -t <VIP>:80 -r <RealServerIP>:80 -m

2.  DR模式(Direct Routing,直接路由)

原理:
在DR模式下,LVS和所有真实服务器共享同一个虚拟IP(VIP)。LVS仅处理入站请求,并将它们分发到后端的真实服务器。真实服务器处理请求后,直接将响应发送回客户端,绕过LVS。

特点:
减少了LVS的负载,因为它不处理出站流量。
要求LVS和所有真实服务器在同一个物理网络内。

配置要点:
需要配置网络,使得VIP在LVS和所有真实服务器上都能被识别。
需要调整Linux内核参数,以允许真实服务器响应VIP地址的ARP请求。

示例命令:

ipvsadm -A -t <VIP>:80 -s rr -g
ipvsadm -a -t <VIP>:80 -r <RealServerIP>:80 -g

3.  TUN模式(IP Tunneling,IP隧道)

原理:
TUN模式通过创建IP隧道来转发请求。LVS接收到请求后,将其封装在一个新的IP数据包中,然后发送到对应的真实服务器。 真实服务器解封装后处理请求,并将响应直接发送回客户端。

特点:
真实服务器可以分布在不同的地理位置。
所有请求和响应都经过LVS,因此LVS是流量的中心节点。

配置要点:
 需要在LVS上配置IP隧道接口。
真实服务器需要支持IP隧道协议。

示例命令:

ipvsadm -A -t <VIP>:80 -s rr -i
ipvsadm -a -t <VIP>:80 -r <RealServerIP>:80 -i

 三、LVS的调度算法

LVS提供了包括轮询(RR)、加权轮询(WRR)、最小连接(LC)、加权最小连接(WLC)等多种调度算法,以适应不同的业务需求。

1.  轮询

(Round Robin, RR)
原理:顺序地将请求分配到每个服务器,类似于排队轮流服务。
适用场景:所有服务器性能相近,需要简单均匀的负载分配。

2.  最少连接

(Least Connections, LC)
原理:将请求分配给当前活跃连接数最少的服务器。
适用场景:服务器性能不一致时,优先分配给较空闲的服务器,以提高效率。

3.  加权最少连接

(Weighted Least Connections, WLC)
原理:考虑服务器的性能差异,给每个服务器分配权重,然后根据权重和当前连接数来分配请求。
适用场景:服务器性能有差异,需要根据性能合理分配负载。

4.  加权轮询

(Weighted Round Robin, WRR)
原理:在轮询的基础上,根据服务器的性能分配不同的权重,权重高的服务器接受更多的请求。
适用场景:需要根据服务器性能进行非均匀的负载分配。

5.  基于局部性最少连接

(Locality-Based Least Connections, LBLC)
原理:尽量将同一目标IP地址的请求分配到同一服务器,提高缓存命中率。
适用场景:适用于缓存集群,目标是提高缓存效率。

6.  带复制的基于局部性最少连接

(Locality-Based Least Connections with Replication, LBLCR)
原理:在LBLC的基础上,维护目标IP地址到一组服务器的映射,以支持复制和负载均衡。
适用场景:适用于需要数据复制的缓存集群。
这些算法中,轮询、最少连接和它们的加权版本是最常用的,因为它们简单、高效,并且适用于大多数场景。特别是当服务器规模较大或服务器性能相近时,这些算法可以提供良好的负载均衡效果。而基于局部性的调度算法则适用于特定的应用场景,如缓存集群。

7.  源地址散列

(Source Hashing, SH)
原理:根据请求的源IP地址进行散列,确保来自同一IP的请求总是被分配到同一个服务器。
适用场景:需要保持客户端IP到服务器的会话持久性时。

8.  目标地址散列

(Destination Hashing, DH)
原理:根据请求的目标IP地址进行散列,以决定请求的目的地。
适用场景:适用于请求按目标地址进行分组的情况。

9.  最短期望延迟

(Shortest Expected Delay, SED)
原理:计算每台服务器的权重和当前连接数的比值,将请求分配给比值最小的服务器。
适用场景:需要考虑服务器当前负载和权重,优化响应时间。

10. 最少队列调度

(Least Queue Length, LQ)
原理:选择当前队列长度最短的服务器,以减少请求等待时间。
适用场景:适用于服务器处理能力相近,但请求量波动较大时。

四、LVS实战部署

实战部署包括环境准备、LVS/DR模式和LVS-NAT模式的配置,以下是具体的实现过程和代码示例。

4.1 命令介绍

#安装LVS软件和管理工具ipvsadm。yum install -y ipvsadm
-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-t #表示为tcp服务
-u #表示为udp服务
-s --scheduler #使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlc
例:ipvsadm -A -t 192.168.1.2:80 -s wrr-a --add-server  #在服务器表中添加一条新的真实主机记录
-t --tcp-service #说明虚拟服务器提供tcp服务
-u --udp-service #说明虚拟服务器提供udp服务
-r --real-server #真实服务器地址
-m --masquerading #指定LVS工作模式为NAT模式
-w --weight #真实服务器的权值
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-i --ip #指定LVS的工作模式为隧道模式
-p #会话保持时间,定义流量呗转到同一个realserver的会话存留时间
例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1-E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。
-C -clear #清除内核虚拟服务器表中的所有记录。
-R -restore #恢复虚拟服务器规则
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-e -edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list #显示内核虚拟服务器表--numeric, -n:#以数字形式输出地址和端口号
--exact: #扩展信息,精确值 
--connection,-c: #当前IPVS连接输出
--stats: #统计信息
--rate : #输出速率信息参数也可以从/proc/net/ip_vs*映射文件中查看
-Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)

4.2 LVS NAT模式部署

1. 加载IPVS模块并设置为开机自启。

modprobe ip_vs
echo "ip_vs" >> /etc/modules-load.d/ipvs.conf

2. 配置虚拟IP(VIP)并设置网络地址转换。

ip addr add <VIP> dev <interface>
echo 1 > /proc/sys/net/ipv4/ip_forward

3. 使用ipvsadm添加虚拟服务和真实服务器。

ipvsadm -A -t <VIP>:80 -s rr
ipvsadm -a -t <VIP>:80 -r <RealServerIP>:80 -m -w 1

4.2 LVS DR模式部署

1. 配置共享VIP地址在LVS Director和所有Real Servers上。
2. 设置直接路由模式,允许Real Servers响应VIP地址的ARP请求。
3. 使用ipvsadm添加虚拟服务和真实服务器,与NAT模式类似,但使用`-g`标志表示直接路由。

ipvsadm -A -t <VIP>:80 -s rr
ipvsadm -a -t <VIP>:80 -r <RealServerIP>:80 -g -w 1

总结

LVS作为一种成熟高效的负载均衡解决方案,已经在许多高负载环境中得到应用。通过合理选择工作模式和调度算法,它能够有效提升服务的稳定性和响应速度。随着技术的发展,LVS也在不断地更新和完善,以满足日益增长的网络负载需求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PC端与移动端皆可用的在线3D模型评审预览工具,随时随地掌握细节
  • haproxy是什么?以及haproxy基础实验
  • Shiro-721 分析
  • 利用数据库编码特性绕过
  • vue 打包时候的分包
  • 告别手写CRUD通过Springboot+mybatis-plug 实现任意表Crud从Controller开始不需要手写一行代码
  • sql注入实战——thinkPHP
  • Unity入门3——脚本入门
  • 基于SpringBoot+Vue社团管理系统的设计与实现
  • cisp-pte考试复盘
  • C# 根据MySQL数据库中数据,批量删除OSS上的垃圾文件
  • Linux(离线)内网部署 thingsboard-gateway 网关实战modbus通讯
  • 【docker快捷部署系列二】用docker-compose快速配置多个容器,docker部署Springboot+Vue项目和mysql数据库
  • Python | Leetcode Python题解之第329题矩阵中的最长递增路径
  • 手写Redis缓存系统,第三章:持久化-增加可靠性
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 5、React组件事件详解
  • CSS相对定位
  • gcc介绍及安装
  • gitlab-ci配置详解(一)
  • maya建模与骨骼动画快速实现人工鱼
  • spring-boot List转Page
  • Swoft 源码剖析 - 代码自动更新机制
  • underscore源码剖析之整体架构
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 关于extract.autodesk.io的一些说明
  • 机器学习 vs. 深度学习
  • 聊聊flink的TableFactory
  • 我看到的前端
  • 协程
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • raise 与 raise ... from 的区别
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​queue --- 一个同步的队列类​
  • (7) cmake 编译C++程序(二)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Qt) 默认QtWidget应用包含什么?
  • (二)linux使用docker容器运行mysql
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十三)Flink SQL
  • (未解决)macOS matplotlib 中文是方框
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)jQuery 基础
  • (转)重识new
  • .NET Framework 3.5安装教程
  • .NET 反射 Reflect
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET/C# 使用反射注册事件
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET业务框架的构建
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @angular/cli项目构建--http(2)
  • [2016.7 day.5] T2
  • [C#][DevPress]事件委托的使用