一文带你快速了解——LVS负载均衡集群

news2024/9/24 21:20:41

前言:

       Internet的飞速发展给网络带宽和服务器带来巨大的挑战。从网络技术的发展来看,网络带宽的增长远高于处理器速度和内存访问速度的增长。对用硬件和软件方法实现高可伸缩、高可用网络服务的需求不断增长。针对高可伸缩、高可用网络服务的需求,给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器——LVS(Linux Virtual Server)。

一、LVS简介

1.1、什么是LVS

LVS(Linux Virtual Server),也就是Linux虚拟服务器。是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块。LVS 是一个实现负载均衡集群的开源软件项目,LVS 架构从逻辑上可分为调度层、Server 集群层和共享存储。

通过LVS 达到的负载均衡技术和Linux操作系统可以实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS官网 - http://www.linuxvirtualserver...
Keepalived - http://www.keepalived.org/

1.2、LVS的优点

LVS(Linux Virtual Server)的优点包括:

1、应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等。

2、性能高:纯 4 层负载均衡,运行在内核态,性能是软件负载均衡中最高的。

3、成本低:负载均衡有硬件和软件的,硬件相对应的设备需求会高些,成本相对高。而LVS是软件的,只需要一台服务器和就能免费部署使用,性价比极高。

4、支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用。

5、支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

1.3、LVS相关术语

  • LB (Load Balancer 负载均衡)
  • HA (High Available 高可用)
  • Failover (失败切换)
  • Cluster (集群)
  • LVS (Linux Virtual Server Linux 虚拟服务器)
  • DS (Director Server),指的是前端负载均衡器节点
  • RS (Real Server),后端真实的工作服务器
  • VIP (Virtual IP),虚拟的IP地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
  • DIP (Director IP),主要用于和内部主机通讯的 IP 地址
  • RIP (Real Server IP),后端服务器的 IP 地址
  • CIP (Client IP),访问客户端的 IP 地址

1.4、访问流程

CIP <--> VIP == DIP <--> RIP

1.5、LVS 的组成及作用

LVS 由两部分程序组成,包括 ipvs 和 ipvsadm。

1、ipvs(ip virtual server):LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。

2、ipvsadm :是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那 ipvsadm 就是类似 iptables 工具的地位。

1.6、负载均衡集群

负载均衡群集:Load Balance Cluster,以提高应用系统的响应能力,尽可能处理更多的访问请求、减少延迟为目标,从而获得高并发、高负载的整体性能。

二、四种工作模式的解析

2.1、NAT模式(Network Address Translation

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

  • 类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,作为客户机的访问入口,也是各节点回应客户机的访问出口,服务器节点使用私有 IP 地址,与负载调度器位于同一个物理网络,安全性要优于其他方式。
  • RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
  • 支持端口映射,可修改请求报文的目标PORT
  • VS必须是Linux系统,RS可以是任意OS系统 

  • 客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,IPVS存在后访问请求在通PREROUTING后被ipvs结果并作nat转发
  • 因为ipvs的作用点是在PREROUTINGINPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。

2.1、DR模式(Direct Routing

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

  • 采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各个地方,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。它是最常用的工作模式,因为它的功能性强大。
  • 直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MACDIP所在的接口的MAC,目标MAC是某挑选出的RSRIP所在接口的MAC地址
  • IP/PORT,以及目标IP/PORT均保持不变

  • 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIPMAC
  • VS调度主机接收到数据帧后把帧中的VIPMAC该为RS1MAC,此时帧中的数据为客户端IP+客户端MAC+VIP+RS1MAC
  • RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1MAC+客户端IP+客户端IPMAC

2.3、TUN模式(IP Tunnel)

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

  • 采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。
  • 转发方式:不修改请求报文的IP首部(源IPCIP,目标IPVIP),而在原IP报文之外再封装一个IP首部 IPDIP,目标IPRIP),将报文发往挑选出的目标RS
  • RS直接响应给客户端(源IPVIP,目标IPCIP

  • 1.客户端发送请求数据包,包内有源IP+vip+dport
  • 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
  • RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIPCIP) +port,响应数据包通过网络直接回传给client

2.4、fullnet模式

lvs-fullnat: 

  • 通过同时修改请求报文的源 IP 地址和目标 IP 地址进行转发
    CIP --> DIP
    VIP --> RIP
  • VIP是公网地址, RIP DIP 是私网地址,且通常不在同一 IP 网络;因此, RIP 的网关一般不会指向 DIP
  • RS收到的请求报文源地址是 DIP ,因此,只需响应给 DIP ;但 Director 还要将其发往 Client
  • 请求和响应报文都经由Director
  • 支持端口映射

2.5、区别

模式与特点NAT 模式IPIP 模式DR 模式
对服务器的要求任何操作系统必须支持 IP 隧道,目前只有 Linux 系统支持服务器节点支持虚拟网卡设备,能够禁用设备的 ARP 响应
网络要求拥有私有 IP 地址的局域网络拥有合法 IP 地址的局域,网或广域网拥有合法 IP 地址的局域,服务器节点与负载均衡器必须在同一个网段
通常支持节点数量较少,10 到 20 个,根据负载均衡器的处理能力而定较高,可以支持 100 个服务节点较高,可以支持 100 个服务节点
RS 服务器网网关
指向到调度器 DIP
指向到路由
指向到路由
调度器和服务器网络
可跨网络
可跨网络
不可跨网络
服务节点安全性较好,采用内部 IP,服务节点隐蔽较差,采用公用 IP 地址,节点安全暴露较差,采用公用 IP 地址,节点安全暴露
特点地址转换封装 IP修改 MAC 地址
配置复杂度简单复杂复杂

三、LVS负载均衡调度算法

3.1、lvs静态调度算法

  • 静态方法:仅根据算法本身进行调度,不考虑 RS 的负载情况

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

3.2、lvs动态调度算法

  • 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
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

3.3、在4.15版本内核以后新增调度算法

1、FO(Weighted Fai Over)调度算法:(常用作灰度发布)

在此 FO 算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载 ( 未设置 IP_VS_DEST_F
OVERLOAD 标志 ) 的且权重最高的真实服务器,进行调度
当服务器承接大量链接,我们可以对此服务器进行过载标记( IP_VS_DEST_F OVERLOAD ),那么 vs 调度 器就不会把链接调度到有过载标记的主机中。
2、OVF(Overflow-connection)调度算法
基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器, 在此 OVF 算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。

四、实验

4.1、NAT模式实验

 

 先配上IP,再更改/etc/NetworkManage/system-connections/eth0-nmconnection(自己网卡名)中的网关

CLient的网关:172.25.254.100(LVS的v),RS1/2的网关:192.168.0.100(LVS的dip),lvs的网关不变。

nmcli connection reload
nmcli connection up eth0(自己的网卡)

RS1:

dnf install apache -y
echo websever - 192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpd

RS2:

dnf install apache -y
echo websever - 192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd

LVS:
打开路由内核功能 

vim /etc/sysctl.conf

刷新

sysctl -p

检测:
curl 192.168.0.10
curl 192.168.0.20
lvs中安装lvs软件
dnf install ipvsadm -y

客户访问时开始调度
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
ipvsadm -Ln

 ipvsadm -E -t 172.25.254.100:80 -s wrr

ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10 -m -w 2

 

4.2、DR模式实验

CLient,LVS,RS1,RS2的虚拟机设置和上面一样。

先配上IP,再更改/etc/NetworkManage/system-connections/eth0-nmconnection(自己网卡名)中的网关,上图中有。

nmcli connection reload
nmcli connection up eth0(自己的网卡)

给LVS,RS1,RS2配上临时环回IP:192.168.0.200/32

ip a a 192.168.0.200/32 dev lo

 

  

 

router:

vim /etc/sysctl.conf
net.ipv4.ip_forward=1

 

RS1/2:

RS主机中使ARP不对外响应
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
调网关为192.168.0.100
sysctl -a | grep arp_ignore

 

LVS:

ipvsadm -A -t 192.168.0.200:80 -s wrr
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 2
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1 

测试:

Client访问:
for i in {1..10}
do
curl 192.168.0.200
done

 

4.3、防火墙标签解决轮训错误

接着上面DR模拟实验做

RS1/2:
安装mod_ssl模块,让RS支持http
yum install mod_ssl -y
让可以使用https
systemctl restart httpd

LVS主机中为端口做标记:
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
查看
iptables -t mangle -nL
ipvsadm -A -f 66 -s wrr  [-p(默认360)]
ipvsadm -a -f 66 -r 192.168.0.10 -g
ipvsadm -a -f 66 -r 192.168.0.20 -g
ipvsadm -Ln 

 

 

Client: 

curl 192.168.0.200;curl -k https://192.168.0.200

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.NET8使用VS2022打包Docker镜像

NET8使用VS2022打包Docker镜像 1. 项目中添加Docker支持文件2. 自定义镜像名称3. 发布Docker镜像3.1 安装Docker3.2 控制台切换到项目根目录,执行以下命令发布镜像 3.3 修改镜像名称4. 保存镜像到本地 1. 项目中添加Docker支持文件 2. 自定义镜像名称 项目文件PropertyGroup节…

软件功能测试步骤介绍,软件测试服务公司推荐

在当今软件开发日益复杂的环境中&#xff0c;软件功能测试显得尤为重要。功能测试是确保软件产品满足用户需求和规范要求的关键环节。它通过验证软件功能是否按预期运行&#xff0c;帮助发现潜在的问题&#xff0c;防止软件在上线后导致用户的不满及业务损失。随着市场竞争的加…

(el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程

Ⅰ、Element-plus 提供的DatePicker日期选择器组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供DatePicker组件情况&#xff1a; 其一、Element-ui 自提供的DatePicker代码情况为(示例的代码)&#xff1a; // Element-plus 提供的组件代码: <template><e…

【多线程-从零开始-捌】代码案例2—阻塞队列

什么是阻塞队列 阻塞队里是在普通的队列&#xff08;先进先出队列&#xff09;基础上&#xff0c;做出了扩充 线程安全 标准库中原有的队列 Queue 和其子类&#xff0c;默认都是线程不安全的 具有阻塞特性 如果队列为空&#xff0c;进行出队列操作&#xff0c;此时就会出现阻…

Java代码生成器EasyCode

Java代码生成器EasyCode 一、安装插件二、连接数据库后右键Generator生成代码 一、安装插件 在 IntelliJ IDEA 的插件市场中搜索 EasyCode&#xff0c;然后安装该插件 二、连接数据库后右键Generator生成代码 勇敢面对挑战&#xff0c;成功从不会远离坚持者。坚持不懈的努力…

八股之Java集合

Java 集合&#xff0c;也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Collection 接口&#xff0c;下面又有三个主要的子接口&#xf…

MongoDB学习笔记(三)

使用Python操作MongoDB: 使用管理员用户&#xff1a;

Python —— 基础

目录 变量与引用 数据类型 赋值、深浅拷贝 控制流结构 逻辑操作符 is 与 dir() 关键字&#xff08;Python 3.11 &#xff09; https://www.cnblogs.com/qianfanwaer/p/14783204.html 变量与引用 变量是原来存储数据的一个标识符&#xff0c;可被看作是内存的一个位置&…

【学习笔记】Day 7

一、进度概述 1、DL-FWI基础入门培训笔记 2、inversionnet_train 试运行——未成功 二、详情 1、InversionNet: 深度学习实现的反演 InversionNet构建了一个具有编码器-解码器结构的卷积神经网络&#xff0c;以模拟地震数据与地下速度结构的对应关系。 &#xff08;一…

Python,我来啦!!!融合多个框架语言。。

基于上次发布CSDN的自己一些想法 上次&#xff0c;从一个道友手中购买了一份轮子代码&#xff0c;主要用到的技术就是pythonmysql或sqliteflask框架&#xff0c;这里我做了二次开发。 新的改变 这里&#xff0c;我对该代码进行了一些功能拓展与语法支持&#xff0c;除了原有…

【OpenCV C++20 学习笔记】仿射变换-warpAffine, getRotationMatrix2D

仿射变换 原理概述得到仿射变换的方法 APIgetAffineTransform()函数warpAffine()函数getRotationMatrix2D()函数 示例 原理 概述 仿射变换是矩阵乘法&#xff08;线性变换&#xff09;和向量加法的结合。它包含了&#xff1a; 旋转&#xff08;线性变换&#xff09;转换&…

【递归 + 记忆化搜索优化】力扣494. 目标和

给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加 ‘-…

立体连接模式下的传播与沟通:AI智能名片小程序的创新应用与深度剖析

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;信息传播与沟通方式正经历着前所未有的变革。立体连接模式&#xff0c;作为这一变革的重要产物&#xff0c;通过整合物理空间、虚拟网络空间与社群心理空间的三维联动&#xff0c;实现了信息的深度传播与高效互动。AI智能名片…

Java新手指南:从菜鸟到编程大师的趣味之路-类和对象

这里是Themberfue 本章主要介绍的是Java最重要的面向对象&#xff08;OOP&#xff09;的基础 面向对象 Java是一门纯面向对象的语言&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用…

MySQL --- 复合查询

目录 一、多表查询 二、自连接 三、子查询 1、单行子查询 2、多行子查询 3、多列子查询 4、在from后面使用子查询 四、合并查询 1、union 2、union all 五、内连接 六、外连接 1、左外连接 2、右外连接 一、多表查询 我们需要的数据往往会来自不同的表&#xf…

redis面试(十)锁释放

自动释放 首先锁的释放分为两种&#xff0c;一种是自动释放&#xff0c;加入说加锁的线程宕机了不在了&#xff0c;我们之前说过这个。 那这个线程中的对redis这个锁不断刷新过期时间的看门狗逻辑就没有了&#xff0c;所以这个锁最多等待30s的时间就会自动过期删除&#xff0c…

文件I/O第一天作业 2024.8.8

使用系统I/O实现Linux的cat命令 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h>int main(int argc, const char *argv[]) {if(argc < 2){printf("请输…

【笔试题面试题】IO类2 知识点汇总(笔试面试题)

书接上文&#xff0c;配上前文一起实用更加&#xff0c;持续更新&#xff0c;督促自己学习 目录 1、详细描述一下什么是IO以及标准IO和文件IO的区别&#xff08;补充&#xff09; 2、什么是死锁&#xff0c;如何避免死锁&#xff08;补充&#xff09; 3、为什么引入同步互斥…

NVIDIA Triton系列09-为服务器添加模型

NVIDIA Triton系列09-为服务器添加模型 B站&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 博客&#xff1a;肆十二-CSDN博客 问答&#xff1a;(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com) 前面已经用 https://github.com/triton-inferen…

基于python的百度迁徙迁入、迁出数据分析(七)

参考&#xff1a;【Python】基于Python的百度迁徙2——迁徙规模指数&#xff08;附代码&#xff09;-CSDN博客 记录于2024年8月&#xff0c;这篇是获取百度迁徙指数&#xff0c;之前我们都在讨论不同城市的迁徙比例关系&#xff0c;这篇我们来获取百度迁徙指数这个数据&#x…