文章目录
- 前言
-
- [什么是LVS?(Linux Virtual Server)](#什么是LVS?(Linux Virtual Server))
- LVS的组成
-
- [1. 负载均衡器(Load Balancer)](#1. 负载均衡器(Load Balancer))
- [2. 后端服务器池(Real Servers)](#2. 后端服务器池(Real Servers))
- [3. IPVS(IP Virtual Server)](#3. IPVS(IP Virtual Server))
- [4. 调度算法(Scheduling Algorithms)](#4. 调度算法(Scheduling Algorithms))
- [5. 转发模式(Forwarding Methods)](#5. 转发模式(Forwarding Methods))
- [6. Health Check(健康检查)](#6. Health Check(健康检查))
- [7. Keepalived](#7. Keepalived)
- [8. 控制接口(Control Interface)](#8. 控制接口(Control Interface))
- 使用示例(NAT模式)
前言
什么是LVS?(Linux Virtual Server)
LVS 是 Linux Virtual Server 的缩写,它是一种用于构建高度可扩展、高性能和高可用性服务器集群的负载均衡解决方案。LVS 通常用于互联网服务中来实现服务器的负载均衡和高可用性,目的是通过将请求分发到多个服务器,来提高系统的处理能力和可靠性。
LVS的组成
LVS(Linux Virtual Server)主要由以下几个核心组成部分构成,它们共同合作来实现负载均衡和高可用性功能
1. 负载均衡器(Load Balancer)
这是 LVS 系统的核心部分,负责接收客户端的请求并将这些请求分发到后端的服务器池中。它主要通过调度算法和不同的转发模式(如 NAT、DR、TUN)来决定请求的分配方式。
2. 后端服务器池(Real Servers)
后端服务器池是实际提供服务的服务器集合。客户端的请求会被负载均衡器转发到这些服务器上。每台服务器通常运行相同的应用或服务,以确保负载均衡分配的均匀性。后端服务器在实际工作中被称为 Real Servers。
3. IPVS(IP Virtual Server)
IPVS 是 LVS 的核心组件,负责基于 IP 层进行负载均衡。它是 Linux 内核中的一个模块,允许系统将客户端的网络流量按照设定的规则转发到后端服务器上。IPVS 支持多种调度算法来分配网络流量,并支持不同的传输协议(如 TCP、UDP 等)。
4. 调度算法(Scheduling Algorithms)
调度算法决定了 LVS 如何将进入的网络请求分发到后端服务器。LVS 支持多种调度算法,
以下是一些常见的算法示例
轮询(Round Robin): 逐个循环分配请求。
加权轮询(Weighted Round Robin): 根据服务器的性能设置权重,权重越高的服务器将收到更多的请求。
最少连接(Least Connections): 将请求发送给当前连接数最少的服务器。
源地址哈希(Source Hash Scheduling): 基于客户端的 IP 地址哈希,将来自同一 IP 的请求始终发送到同一台服务器。
5. 转发模式(Forwarding Methods)
LVS 提供了三种主要的转发模式,用于将客户端请求转发到后端服务器上:
包括以下模式
NAT 模式(Network Address Translation): 通过修改数据包的源地址和目的地址,将请求转发到后端服务器,且返回的响应数据也需要通过负载均衡器来修改并发送给客户端。
简单来说 就是LVS 的 NAT 模式(网络地址转换)就像一个中间人:客户端请求先发送到负载均衡器,负载均衡器再修改数据包的目标地址并转发给后端服务器。后端服务器处理请求后,把响应发回负载均衡器,负载均衡器再修改数据包的源地址,最终将响应发送给客户端。这样,客户端和服务器都只看到负载均衡器的地址,而不知道彼此的真实地址。这个模式适合小规模网络,因为所有流量都要经过负载均衡器,可能成为瓶颈。
DR 模式(Direct Routing): 负载均衡器只负责将请求发给后端服务器,后端服务器直接将响应发送给客户端,不经过负载均衡器,这减少了负载均衡器的压力。
简单来说就是 LVS 的 DR 模式(直接路由)就像是直接派送:客户端的请求首先到达负载均衡器,负载均衡器仅负责将请求转发给后端服务器,而不修改数据包。后端服务器直接将响应发送给客户端,而不是经过负载均衡器。这样,负载均衡器只处理入站请求,出站响应不经过它,减轻了它的负载,适合处理大量流量。不过,需要所有服务器和负载均衡器位于同一网络环境中(共享相同的网关)
TUN 模式(IP Tunneling): 使用 IP 隧道技术,允许后端服务器位于不同的网络中,通过隧道将请求转发给后端服务器,后端服务器直接将响应发送给客户端。
简单来说就是 LVS 的 TUN 模式(隧道模式)像是中转快递:客户端的请求先到达负载均衡器,负载均衡器通过 IP 隧道将请求转发给后端服务器,但与 DR 模式不同的是,后端服务器处理完后直接通过公网将响应发送给客户端。这种模式可以让后端服务器位于不同网络,甚至跨数据中心处理请求,适合大规模、跨区域的高流量场景,不过需要服务器支持 IP 隧道协议(IPIP)。
6. Health Check(健康检查)
LVS 通常会结合健康检查机制来监控后端服务器的状态,确保服务器在健康状态下处理请求。如果某个服务器发生故障,LVS 会自动将该服务器排除在调度之外,防止将请求转发到故障服务器。常用的健康检查工具包括 Keepalived 和 Heartbeat。
7. Keepalived
Keepalived 是一个高可用性和负载均衡解决方案,通常与 LVS 配合使用。它负责管理 LVS 的健康检查和故障切换,当主负载均衡器出现故障时,可以自动将流量切换到备用的负载均衡器,从而确保服务的高可用性。这个以后会再出一篇详细描述
8. 控制接口(Control Interface)
LVS 提供了一些控制工具来管理和配置负载均衡器和服务器池。最常用的工具是 ipvsadm,它允许管理员添加、删除和修改 LVS 的调度规则,并监控 LVS 的运行状态。
使用示例(NAT模式)
基本环境
主机
ip | 主机名 | 服务 |
---|---|---|
200.0.0.0.1 | client | 客户端 |
200.0.0.1,192.168.10.12 | lvs | lvs |
192.168.10.13 | web1 | httpd |
192.168.10.14 | web2 | httd |
rocky网卡路径
cd /etc/NetworkManager/system-connections
需要注意的是
web1 web2网卡的网关都要指向lvs,即192.168.10.12
lvs主机需要开启路由转发
rocky9.2的双网卡配置请看
链接: https://blog.csdn.net/lwxvgdv/article/details/142334821
实现过程
1.安装ipvsadm
ipvsadm是在负载调度器上使用的LVS 群集管理工具,通过调用ip_vs模块来添加、删除服务器 节点,以及查看群集的运行状态。手动安装 ipvsadm 软件包。
lvs主机上
yum -y install ipvsadm
ipvsadm -v
2.开启路由转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
3.创建虚拟服务器
ipvsadm -A -t 200.0.0.2:80 -s rr
解释
-A:添加一个新的虚拟服务。
-t 200.0.0.2:80:指定虚拟 IP 地址和端口,这里是 200.0.0.2 的 80 端口。
-s rr:设置调度算法为轮询(round-robin)
添加服务器节点(web1 web2)
ipvsadm -a -t 200.0.0.2:80 -r 192.168.10.13:80 -m -w 1
ipvsadm -a -t 200.0.0.2:80 -r 192.168.10.14:80 -m -w 1
解释
第一条命令
-a:添加真实服务器。
-t 200.0.0.2:80:指定虚拟服务。
-r 192.168.10.13:80:指定真实服务器 IP 和端口。
-m:使用 NAT 模式(直接映射)。
-w 1:设置权重为 1,表示负载均衡时的分配比例。
第二条命令 功能相同,只是指定的真实服务器为 192.168.10.14。
4.web1.web2添加访问页面
web1
yum -y install httpd
echo web1 > /var/www/html/index.html
systemctl restart httpd
web2
yum -y install httpd
echo web2 > /var/www/html/index.html
systemctl restart httpd
5.访问
client主机访问
访问不到的原因
1.lvs主机没有开启路由转发功能
命令
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
2.web主机的网关没有指向lvs主机
lvs主机的ip为192.168.10.12
web1的网卡配置
\
[connection]
id=ens33
uuid=2060138f-8d43-365c-a863-cb0bcbc3e730
type=ethernet
autoconnect-priority=-999
interface-name=ens33
[ethernet]
[ipv4]
method=manual
address1=192.168.10.13/24,192.168.10.12
dns=192.168.10.2;8.8.8.8
[ipv6]
addr-gen-mode=eui64
method=auto
[proxy]