LVS负载均衡+集群+三种工作模式+调度算法及实战案例

一、LVS

1.1简介

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩主导开发的开源负载均衡项目,目前,LVS已经被集成到Linux内核模块中。该项目实现了在基于IP的数据基础上,请求负载均衡调度方案,LVS支持多种调度算法,如轮询、最少连接、源地址哈希等,用于决定请求的转发方式。

1.2 LVS的集群体系结构及概念

1.2.1 集群结构

1.2.2 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

1.3 LVS的集群类型

类型内容
lvs-nat
修改请求报文的目标 IP, 多目标 IP DNAT
lvs-dr(直接路由)
操纵封装新的 MAC 地址
lvs-tun(了解)
在原请求 IP 报文之外新加一个 IP 首部
lvs-fullna(了解)
修改请求报文的源和目标 IP

1.3.1 nat模式

①客户机(client)向LVS发送访问请求,请求数据包中包含CIP(来源),VIP(访问目标地址),端口号

②lvs服务器接收到访问请求并且将请求数据包中的目的地由VIP换成web的RIP和相应端口

③web响应请求,发送响应数据包,包中含有响应报文RIP、响应目标CIP、响应端口

④LVS接收到响应数据包,改变数据包中的数据来源(即LVS的VIP),响应目标端口

⑤LVS将修改后的数据包发送给客户机(client)

注意:在实验过程中,为了保证实验正常进行,要将所有的防火墙全部关闭。
1.3.2 dr模式

与nat不同,dr在接收到访问请求后不需要回传给LVS调度器,直接把响应数据发送給客户端client,所以web和LVS都要有VIP

①client发送访问请求给LVS调度器,内容为client的IP+MAC+VIP+VIP的MAC

②LVS调度器接收到数据包后,将VIP的MAC修改为web的MAC,此时数据包种有clientIP+clientMAC+VIP+web的MAC

③web得到②中的数据包并且作出响应数据包,内容有VIP+web的MAC+client IP+clientIP

MAC

1.4 LVS的调度算法

1.4.1 LVS的调度算法的类型
类型
静态方法仅仅根据算法本身进行调度,不考虑RS的负载情况
动态方法主要根据RS当前的负载状态及其调度算法调度较小的RS

1.4.2 静态算法
RR
roundrobin 轮询 RS 分别被调度
WRR
Weighted RR ,加权轮询根据 RS 的配置进行加权调度,性能差的 RS 被调度的次数少
SH
将来自于同一个 IP 地址的请求始终发往第一次挑中的RS ,从而实现会话绑定
DH
第一次轮询调度至 RS ,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS ,典型使用场景是正向代理缓存场景中的负载均衡

1.4.3 动态算法
LC
least connections (最少链接发) 适用于长连接应用Overhead (负载值) =activeconns (活动链接数) x 256+inactiveconns (非活 动链接数)
WLC
Weighted LC (权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SED
初始连接高权重优先 Overhead=(activeconns+1+inactiveconns) x 256/weight  但是,当node1 的权重为 1 node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接
NQ
Never Queue ,第一轮均匀分配,后续 SED
LBLC
动态的 DH 算法,使用场景:根据负载状态实现正向代理
LBLCR
带复制功能的 LBLC ,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的RS

1.5 LVs部署命令介绍

1.5.1 LVS相关信息
程序包: ipvsadm
Unit File: ipvsadm.service
主程序: /usr/sbin/ipvsadm
规则保存工具: /usr/sbin/ipvsadm-save
规则重载工具: /usr/sbin/ipvsadm-restore
配置文件: /etc/sysconfig/ipvsadm-config
ipvs 调度规则文件: /etc/sysconfig/ipvsadm
1.5.2  lvs集群的增删改
1.5.2.1 常用参数总结
命令解释
-A/-E/-D添加/修改/删除虚拟服务
-C/-R清除/恢复所有虚拟规则
-t/-u

使用tcp/udp服务

-a/-e/-d添加/修改/删除真实服务
-L显示内核中的所有虚拟服务
-n以数字形式显示端口号
-c显示ipvs的连接情况
-w配置真实服务的权重
-s

配置负载均衡算法 rr/wrr/lc

-timeout显示配置的tcp/udp超时时间
-rate显示输出速率信息
-f/-r查看火墙/真实服务地址
-m/-g/-i真实服务使用nat/DR/ipipi模式

1.5.2.2 示例

添加一个虚拟服务 192.168.0.200:80    使用轮询

ipvsadm -A -t 192.168.0.200:80 -s rr

修改上述算法为加权轮询

ipvsadm -E -t 192.168.0.200:80 -s wrr

删除服务

ipvsadm -D -t 192.168.0.200:80 -s wrr

添加一个真实服务 172.25.254.100:80    使用nat模式    权重为2

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

修改权重为3  模式为DR

ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10:80 -g -w 3

删除服务

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

不再一一展示。

二、 负载均衡

2.1 什么是负载均衡

负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理。

2.2 为什么要使用负载均衡

1、动态水平拓展web服务器

2、增加业务并发访问及处理能力(可以解决单服务瓶颈问题)

3、节约公网IP

4、配置简单,功能丰富,性能较强

2.3负载均衡的类型

2.3.1 四层结构(常使用TCP)

2.3.2 七层结构(常使用HTTP)

三、集群和分布式简介

3.1 集群

Cluster:是为了解决某个特定问题将计算机组合起来的单个系统

常见的三种内型:

类型
LB(负载均衡)由多个主机组成,每个主机只承担一部分访问
HA(高可用)A=MTBF/(MTBF+MTTR) 
HPC了解

3.2 分布式

一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。
分布式的每一个节点都在完成不同的业务,一个节点跨了,业务就可能会失败。
分布式常见应用作用
分布式应用按照功能拆分,使用微服务
分布式静态资源静态资源放在不同的存储集群上
分布式数据及储存使用key-value缓存系统
分布式计算

四、实战

4.1 实验环境

nat模式下的集群案例
主机ipvip扮演的角色
lvs192.168.0.100(仅主机)172.25.254.100调度器
web1192.168.0.10(仅主机)null真实服务器(RS)
web2192.168.0.20(仅主机)null真实服务器(RS)

DR模式下的集群案例
主机ipvip扮演的角色
client172.25.254.200(nat)null测试机(VS)
router

nat:172.25.254.100

仅主机:192.168.0.100

null路由器
LVS192.168.0.50(仅主机)192.168.0.200/32调度器
web1192.168.0.10(仅主机)192.168.0.200/32真实服务机(RS)
web2192.168.9.20(仅主机)192.168.0.200/32真实服务机(RS)

4.2 配置实验环境

1、在LVS中启动内核路由功能

查看是否启动,0否1是,我这里没有打开,我们写入一条命令到配置文件 /etc/sysctl.conf 中,将ipv4.ip_forward 打开

安装ipvsadm软件并启动

# 安装
dnf install ipvsadm -y# 启动
systemctl enable --now ipvsadm

2、在web1、web2下载httpd并启动

yum install httpd -y
# 下载systemctl enable --now httpd
# 启动

3、在/var/www/html/ 目录下创建一个名为 index.html 的文件,‌并将字符串 "webserver1 - 192.168.0.10" 作为该文件的内容写入。这样当用户访问该服务器时,‌将会看到这个字符串作为欢迎信息或测试信息

/var/www/html是Web服务器上存放网页文件的默认目录,‌index.html 是该目录下的一个重要文件,‌通常是服务器的默认主页。‌

# 在web1中写入:
echo web1 - 192.168.0.10 > /var/www/html/index.html# 在web2中写入:
echo web2 - 192.168.0.20 > /var/www/html/index.html

4、先测试一下,到这里表示我们前面没有出问题

我在启动的时候失败了,出现下面的报错信息:

# 8月 09 19:46:59 LVS bash[33142]: /bin/bash:行1: /etc/sysconfig/ipvsadm: 没有那个文件或目录

解决方法很简单,我也放在下面了:

[root@LVS ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@LVS ~]# systemctl restart ipvsadm   # 重新启动ipvsadm

我们再次查看ipvsadm的状态,就ok了

5、上述是在nat模式下的集群案例,策略及规则制定参考1.5.2.2,此处展示我的测试结果图(我直接在lvs机子上测试的,效果一样)

6、在nat的基础上,我们要完成DR模式下的集群案例实验,只需要增加 router 和 client 两个主机,修改web1和web2的配置文件,修改LVS的IP即可。具体步骤展示在下图:

client主机环境配置:

router主机环境配置:

LVS调度器环境配置:

web1环境配置:

web2环境配置:

4.3 VIP的响应问题

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别限制响应级别:arp_ignore
0:默认值,可使用本地任意接口上配置的任意地址进行响应
1:只有当请求的目标IP配置在本地主机接收到请求报文的接口上时,才会响应限制通告级别:arp_announce
0:默认值,本机所有接口 所有信息 向所有接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告

4.4 具体配置

要点:

1、每个web都要配VIP并且可以出外网

2、DR服务器要采用双IP桥接网路,VPP/DIP

配置内容如下:

在 LVS、web1、web2  中设置vip

LVS:
[root@LVS ~]# ip a a dev lo 192.168.0.100/32web1:
[root@web1 ~]# ip a a dev lo 192.168.0.100/32web2:
[root@web2 ~]# ip a a dev lo 192.168.0.100/32

在web1和web2中解决响应问题

[root@web1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@web1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

在LVS中配置策略

[root@LVS ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.200:80 wrr-> 192.168.0.10:80              Route   1      0          0-> 192.168.0.20:80              Route   2      0          0

在主机client中测试,根据我们所制定的策略可以发现以下轮询正确

[root@client ~]# for N in {1..10};do curl 192.168.0.200;done
web2 - 192.168.0.20
web1 - 192.168.0.10
web2 - 192.168.0.20
web2 - 192.168.0.20
web1 - 192.168.0.10
web2 - 192.168.0.20
web2 - 192.168.0.20
web1 - 192.168.0.10
web2 - 192.168.0.20
web2 - 192.168.0.20

4.5 问题的解决

问题一:轮询过程遇到的问题

在web1、2下载并安装mod_ssl并且重启httpd

yum install mod_ssl -y
systemctl restart httpd

添加443端口的策略,如图


[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.200:80 wrr-> 192.168.0.10:80              Route   1      0          0-> 192.168.0.20:80              Route   2      0          0
TCP  192.168.0.200:443 rr-> 192.18.0.10:443              Route   1      0          0-> 192.18.0.20:443              Route   1      0          0

测试

[root@client ~]#  curl http://192.168.0.200;curl -k https://192.168.0.200
web1 - 192.168.0.10
web1 - 192.168.0.10

问题二:火墙mask标记解决调度问题

在调度器(LVS)设置端口标签,将80,443当作一个整体

[root@LVS ~]# iptables -t mangle -A  PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK  --set-mark 66

查看规则是否制定成功

[root@LVS ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
MARK       6    --  0.0.0.0/0            192.168.0.200        multiport dports 80,443 MARK set 0x42Chain INPUT (policy ACCEPT)
target     prot opt source               destinationChain FORWARD (policy ACCEPT)
target     prot opt source               destinationChain OUTPUT (policy ACCEPT)
target     prot opt source               destinationChain POSTROUTING (policy ACCEPT)
target     prot opt source               destination[root@LVS ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@LVS ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g

测试结果


[root@client ~]#  curl 192.168.0.200;curl -k https://192.168.0.200
web2 - 192.168.0.20
web1 - 192.168.0.10
[root@client ~]# curl -k https://192.168.0.200
web2 - 192.168.0.20
[root@client ~]# curl -k https://192.168.0.200
web1 - 192.168.0.10
[root@client ~]# curl -k https://192.168.0.200
web2 - 192.168.0.20
[root@client ~]# curl -k https://192.168.0.200
web1 - 192.168.0.10

以上是我在LVS调度服务学习过程的一些总结及理解。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git推送错误-->远程分支比本地的分支更新,无法直接推送

每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …

工作随记:oracle中偶发遇到存储过程编辑,删除等卡死问题

文章目录 一、查询session是否占用二、通过对象名称定位对应SID三、通过对应的SID查询session信息四、kill掉session 最近有几个客户也询问过:我的存储过程怎么编译、调试有时候就卡死不动了,而且还没办法删除,本次又碰到实际情况&#xff0c…

sql及rce漏洞整理

sql及rce漏洞复现 一&#xff0c;mysql小特性解决大问题 <?php $mysqli new mysqli("localhost", "root", "root", "cat"); ​ /* check connection */ if ($mysqli->connect_errno) {printf("Connect failed: %s\n&qu…

前端面试题整合

一、HTML篇 1、简述一下你对HTML语义化的理解&#xff1f; 用正确的标签做正确的事情&#xff1b; HTML语义化让页面内容结构清晰&#xff0c;便于浏览器、搜索引擎解析&#xff1b; 搜索引擎的爬虫依赖HTML标记来确定上下文和关键字的权重&#xff0c;利于SEO&#xff1b; 便于…

JavaScript - 数组对象中实用好玩的reduce方法

JavaScript中reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行)&#xff0c;将其结果汇总为单个返回值。 语法&#xff1a; arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]) 参数配置&#xff1a; 参数名描述cal…

渗透学习之漏洞复现

漏洞 贷齐乐的漏洞复现RCE 贷齐乐的漏洞复现 <?php header("Content-type: text/html; charsetutf-8"); require db.inc.php;function dhtmlspecialchars($string) {if (is_array($string)) {foreach ($string as $key > $val) {$string[$key] dhtmlspecial…

【Oracle点滴积累】解决ORA-20001: Latest xml inventory is not loaded into table故障的方法

广告位招租&#xff01; 知识无价&#xff0c;人有情&#xff0c;无偿分享知识&#xff0c;希望本条信息对你有用&#xff01; 今天和大家分享在安装Oracle Critical Patch Update (Patch Number:33806138) 遇到ORA-20001: Latest xml inventory is not loaded into table故障…

广东盈致MES系统——注塑和冲压行业的智能化管理

广东注塑冲压行业MES制造执行系统是一种专门为注塑和冲压行业设计的生产管理系统&#xff0c;可以帮助企业实现生产过程的智能化管理和优化。盈致MES系统是一种常见的MES系统&#xff0c;具有以下特点和功能&#xff1a; 生产计划和调度&#xff1a;MES系统可以帮助企业进行生产…

SpringCloud网关

1.网关的作用 2.网关入门 2.1引入依赖 <dependencies><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!--网关--><dependency><g…

SAP通过函数TR_RELEASE_REQUEST释放指定请求

一&#xff1a;不通过SE09/10释放请求号 *&---------------------------------------------------------------------* *& Report Z_TRANSPORT_REQUEST *&---------------------------------------------------------------------* *& *&----------------…

AI与人类智慧的共舞:程序员在人工智能时代的新角色

文章目录 每日一句正能量前言AI辅助编程对程序员工作的影响提高编码效率改善代码质量促进学习与成长改变工作流程潜在风险与挑战技术伦理与责任应对策略结论 程序员应重点发展的核心能力复杂系统设计能力跨学科知识整合能力与AI协作的能力创新和解决问题的能力技术领导力和团队…

ctfshow-web入门-sql注入(web206-web210)系统练习sqlmap之tamper的使用与编写

目录 1、web206 2、web207 3、web208 4、web209 5、web210 1、web206 sql需要闭合 测了一下还是会先请求 /api/getToken.php 查询语句里新增了括号&#xff0c;我们注入也需要将其闭合掉&#xff0c;就像我们闭合单引号那样&#xff0c;对于 sqlmap 它会自动对闭合点进行…

HttpSession常用方法

1.HttpSession常用方法 是在Java Servlet中用来管理会话状态的重要接口&#xff0c;它提供了一种在多个请求或页面之间存储用户特定信息的方式。以下是一些 HttpSession 常用的方法和用法&#xff1a; 获取会话对象&#xff1a; HttpSession session request.getSession();…

三十八、大数据技术之Kafka3.x(1)

&#x1f33b;&#x1f33b; 目录 一、Kafka 概述1.1 定义1.2 消息队列1.2.1 消息队列内部实现原理1.2.2 传统消息队列的应用场景1.2.3 消息队列的两种模式 1.3 Kafka 基础架构 二、 Kafka 快速入门2.1 安装前的准备2.2 安装部署2.2.1 集群规划2.2.2 单节点或集群部署2.2.3 集群…

浙大数据结构慕课课后题(04-树5 Root of AVL Tree)

题目要求&#xff1a; AVL 树是一种自平衡的二叉搜索树。在 AVL 树中&#xff0c;任何节点的两个子子树的高度最多相差一;如果在任何时候它们相差不止一&#xff0c;则进行重新平衡以恢复此属性。图 1-4 说明了旋转规则。 图1 图2 图3 图4 现在给定一系列插入&#xff0c;您应该…

【经验总结】ShardingSphere5.2.1 + Springboot 分库分表 快速开始

Sharding Sphere 官方文档地址&#xff1a; https://shardingsphere.apache.org/document/current/cn/overview/maven仓库&#xff1a;https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc 官方的文档写的很详尽到位&#xff0c;这里会截取部分…

Spring事务管理:程序化 vs 声明式

Spring事务管理&#xff1a;程序化 vs 声明式 1、程序化事务管理2、声明式事务管理3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring框架为事务管理提供了两种主要方式&#xff1a;程序化事务管理和声明式事务管理。 1、程序化…

【数据结构】六、图:3.十字链表、邻接多重表、边集数组

3.十字链表&#xff08;有向图&#xff09; 文章目录 3.十字链表&#xff08;有向图&#xff09;3.1性能分析 4.邻接多重表&#xff08;无向图&#xff09;4.1性能分析 5.边集数组 十字链表是有向图的一种链式存储结构。 不足 对于有向图来说&#xff0c;邻接表是有缺陷的。了…

Go语言fmt包中print相关方法

Go语言的fmt包提供了多种打印相关的函数&#xff0c;主要用于在控制台或其他输出目标上格式化并输出数据。下面是一些常用的print相关方法的用途和区别&#xff1a; 1.fmt.Print() 功能: fmt.Print() 将参数的内容按默认格式输出到标准输出&#xff08;通常是控制台&#xff…

【从零开始一步步学习VSOA开发】发布订阅服务端

发布订阅服务端 概念 **发布订阅模式&#xff08;Publish-Subscribe Pattern&#xff09;**是一种消息传递模式&#xff0c;其中发布者发布消息&#xff0c;而订阅者接收和处理这些消息。它是一种松耦合的通信方式&#xff0c;允许发布者和订阅者在不知道彼此存在的情况下进行…