【Linux】LVS(Linux virual server)

集群和分布式简介

集群

概念

集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机。多台服务器组成的一组计算机,作为一个整体存在,向用户提供一组网络资源,这些单个的服务器就是集群的节点

特点

可扩展性:集群中的服务节点,可以动态的添加机器,从而增加集群的处理能力。

高可用性:如果集群某个节点发生故障,这台节点上面运行的服务,可以被其他服务节点接管,从而增强集群的高可用性。

常见的类型

负载均衡集群(Load Balance Cluster): 常用的有 Nginx 把请求分发给后端的不同web服务器,还有就是数据库集群,负载均衡就是,为了保证服务器的高可用,高并发

高可用集群(High Availability Cluster): 高可用集群,普通两节点双机热备,多节点HA集群

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

MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间 A=MTBF/(MTBF+MTTR)

科学计算集群(High Performance Computing Cluster): 简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力

分布式

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

分布式存储:Ceph,GlusterFs,FastDFS,MogileFs

分布式计算:hadoop,Spark

分布式常见应用

分布式应用-服务按照功能拆分,使用微服务

分布式静态资源--静态资源放在不同的存储集群上

分布式数据和存储--使用key-value缓存系统

分布式计算--对特殊业务使用分布式计算,比如Hadoop集群

LVS运行原理

LVS简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器集群,它具有良好可靠性可扩展性可操作性,从而以低廉的成本实现最优的服务性能。目前LVS已经被集成到Linux内核模块中。LVS在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的规则决定将该请求发送给后端的某台Web服务器。LVS工作模式分为NAT模式、DR模式、TUN模式以及fullnet模式

LVS结构

LVS集群工作方式

相关术语

VS:Virtual Server

RS:Real Server

CIP:Client IP

VIP: Virtual serve IP VS外网的IP

DIP: Director IP VS内网的IP

RIP: Real server IP

四种工作方式:

NAT模式

LVS NAT 模式通过负载均衡器(Director)对请求和响应的 IP 地址及端口进行转换,实现后端真实服务器(Real Server,RS)对客户端的透明服务。

请求阶段

客户端发送请求到负载均衡器的虚拟 IP(VIP),负载均衡器根据负载均衡算法(如轮询、加权轮询等)选择一台后端服务器,将请求的目标 IP(VIP)转换为后端服务器的私有 IP(RIP),并转发给该服务器

响应阶段

后端服务器处理请求后,将响应发送给负载均衡器(因默认网关指向负载均衡器),负载均衡器再将响应的源 IP(RIP)转换为 VIP,转发给客户端

优缺点

优点:

配置简单:后端服务器无需特殊配置,只需将网关指向负载均衡器即可

安全性高:后端服务器隐藏在私有网络中,不直接暴露公网,减少被攻击风险

支持多种协议:可对 TCP、UDP 等协议的请求进行负载均衡

缺点:

性能瓶颈:所有请求和响应都需经过负载均衡器转发,负载均衡器可能成为网络瓶颈,尤其在高并发场景下

扩展性有限:受负载均衡器带宽和处理能力限制,后端服务器数量不宜过多(一般最多10台)

DR模式

DR 模式通过修改数据包的 MAC 地址实现负载均衡,避免了 NAT 模式中负载均衡器对所有流量的转发,仅处理请求阶段的流量,响应阶段由后端服务器直接发送给客户端

请求阶段

客户端发送请求到负载均衡器的虚拟 IP(VIP),负载均衡器根据算法选择后端服务器(RS),将数据包的目标 MAC 地址修改为该后端服务器的 MAC 地址(源 MAC 仍为负载均衡器自身),然后转发给后端服务器(IP 层不变,仍为 VIP→RIP)

响应阶段

后端服务器处理请求后,直接将响应数据包发送给客户端(因后端服务器也配置了 VIP,源 IP 为 VIP,目标 IP 为客户端 IP),无需经过负载均衡器

优缺点

优点:

性能优异:负载均衡器仅处理请求流量,响应流量由后端服务器直接发送,大幅降低负载均衡器的压力,适合高并发场景

扩展性强:支持更多后端服务器(理论上可达数百台),受限于网段内的设备数量和带宽

无 IP 转换开销:无需修改 IP 地址,仅修改 MAC 地址,转发效率高

缺点:

网络限制:负载均衡器与后端服务器必须处于同一物理网段(二层可达),无法跨网段部署

VIP 暴露风险:后端服务器需配置 VIP,若未正确限制 ARP,可能导致 VIP 冲突

TUN模式

TUN 模式利用 IP 隧道(将原始数据包封装在新的 IP 数据包中)实现负载均衡,请求阶段由负载均衡器通过隧道转发流量,响应阶段由后端服务器直接回传给客户端,避免了负载均衡器成为流量瓶颈

FULLNAT模式

FULLNAT 模式同时转换请求和响应的源 IP / 目标 IP,允许负载均衡器与后端服务器跨网段部署,且无需后端服务器配置 VIP

LVS的调度算法

LVS调度算法类型

LVS的调度算法分为静态方法与动态方法

静态算法

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,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

动态算法

**1、LC:**least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)

适用场景:后端服务器性能基本一致(硬件配置、处理能力相同)的场景,如小规模 Web 集群。

**2、WLC:**Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight

适用场景:后端服务器性能不均(如部分服务器配置更高)的场景

3、SED: Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns**+1** +inactiveconns) x 256/weight "+1" 是为了避免活跃连接数为 0 时公式失效,但是,当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的Nat模式实验:

实验环境

|---------------------|-----------------------------------|
| 主机 | IP |
| 客户端(nat) | 172.25.254.70/24 |
| LVS服务器(双网卡,nat与仅主机) | 172.25.254.100/24 192.168.5.10/24 |
| web服务器1(仅主机) | 192.168.5.100/24 |
| web服务器2(仅主机) | 192.168.5.200/24 |

客户端:

只需配好IP即可

LVS服务器:

配置好IP和内核路由以及LVS规则

IP:

开启内核路由:

编写LVS规则:

查看LVS规则:

web服务器(两台web服务器类似):

安装httpd,开启服务、编写默认发布文件

开启服务:

编写默认发布文件:

关闭火墙(方便测试):

测试(用客户端连续访问172.25.254.100多次):

LVS的DR模式实验:

实验环境:

|-----------|-----------------------------------|
| 主机 | IP地址 |
| 客户端(nat) | 172.25.254.70/24 |
| 路由器(双网卡) | 172.25.254.100/24 192.168.5.10/24 |
| 调度器(仅主机) | 192.168.5.17 192.168.5.250(vip) |
| 服务器1(仅主机) | 192.168.5.100 192.168.5.250(vip) |
| 服务器2(仅主机) | 192.168.5.100 192.168.5.250(vip) |

客户端主机配置:

配置IP:

bash 复制代码
#编辑配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection

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

[ipv4]
method=manual
address1=172.25.254.70/24,172.25.254.100   #网关指定与服务端同网段的路由器IP

#重载网络配置
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth0

路由器配置:

配置IP:

bash 复制代码
#配置与客户端同网段的IP
vim /etc/NetworkManager/system-connections/eth0.nmconnection

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

[ipv4]
method=manual
address1=172.25.254.100/24

#配置与LVS服务器同网段的IP
vim /etc/NetworkManager/system-connections/eth1.nmconnection

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

[ipv4]
method=manual
address1=192.168.5.10/24

开启内核路由以及地址伪装

bash 复制代码
#开启内核路由
vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

#开启地址伪装
firewall-cmd --permanent --add-masquerade

#开启iptab地址转换亦可
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.5.10

#地址伪装和iptable地址转换选一种即可

LVS主机配置:

配置ip:

bash 复制代码
vim /etc/NetworkManager/system-connections/eth0.nmconnection

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

[ipv4]
method=manual
address1=192.168.5.17/24,192.168.5.10
address2=192.168.5.250/24   #vip

配置LVS规则:

bash 复制代码
ipvsadm -A -t 192.168.5.250:80 -s rr
ipvsadm -a -t 192.168.5.250:80 -r  192.168.5.100:80 -g
ipvsadm -a -t 192.168.5.250:80 -r  192.168.5.200:80 -g

查看LVS规则:

服务器(两台服务器类似)

配置ip:

bash 复制代码
#配置IP地址:
vim /etc/NetworkManager/system-connections/eth0.nmconnection

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

[ipv4]
method=manual
address1=192.168.5.100/24,192.168.5.10
dns=8.8.8.8

#配置vip:
vim /etc/NetworkManager/system-connections/lo.nmconnection

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

[ipv4]
method=manual
address1=172.0.0.1/8
address2=192.168.5.250/32

下载、启用、配置httpd

开启服务:

编写默认发布文件:

关闭火墙(方便测试):

关闭服务器1与服务器2响应arp:

测试:

防火墙标记解决轮询调度问题实验:

实验环境与轮询调度类似

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

问题呈现:

两次调度都在服务器2上

解决问题:

bash 复制代码
iptables -t mangle -A PREROUTING -d 192.168.5.250 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 777


ipvsadm -A -f 777 -s rr
ipvsadm -a -f 777 -r 192.168.5.100 -g
ipvsadm -a -f 777 -r 192.168.5.200 -g

配置LVS规则

测试:

当访问不同端口时RS轮询响应

LVS持久链接

持久连接的作用是让来自同一客户端的请求始终被转发到后端集群里的同一台真实服务器,这有助于处理那些需要保持会话状态的应用

配置持久链接

bash 复制代码
[root@LVS ~]# ipvsadm -E -f 777 -s rr -p 60
相关推荐
共享家95278 分钟前
linux_线程同步
java·linux·服务器
dexianshen26 分钟前
Linux中的数据库操作基础
数据库
紫云无堤39 分钟前
20250717 Ubuntu 挂载远程 Windows 服务器上的硬盘
服务器·windows·ubuntu
哔哥哔特商务网42 分钟前
从12kW到800V,AI服务器电源架构变革下,功率器件如何解题?
服务器·人工智能·架构
城里有一颗星星1 小时前
7.事务操作
数据库·mysql·goland
言之。1 小时前
Django中get()与filter()对比
数据库·django·sqlite
Britz_Kevin1 小时前
从零开始的云计算生活——番外3,LVS+KeepAlived+Nginx高可用实现方案
nginx·云计算·生活·lvs·#keepalived
RoundLet_Y2 小时前
【知识图谱】Neo4j桌面版运行不起来怎么办?Neo4j Desktop无法打开!
数据库·python·知识图谱·neo4j
代码老y2 小时前
从单线程到云原生:Redis 二十年演进全景与内在机理深剖
数据库·redis·云原生
轩宇^_^2 小时前
Qt CMake 学习文档
数据库·qt·学习