lvs学习篇

ops/2024/10/18 20:20:27/

LVS:是一种负载均衡器,工作在osi四层,基于ip和端口实现转发数据包,其传输的流量最多可达传输层。

lvs的相关名词解释:

RS:真实的后端服务器

CIP:客户端的ip

VIP: 虚拟服务器面向客户端的ip,我们称为外网ip

DIP: 虚拟服务器面向后端服务器的ip,我们称为内网ip

RIP: 真实后端服务器的ip

lvs集群的常见类型:

lvs-nat(网络地址装换): 其本质是修改请求报文的目标ip和端口从而实现的数据包转发

lvs-dr(直连路由): 其本质是通过修改请求报文的源目mac地址实现的数据包转发,该算法也是生产环境中使用最多的一种

lvs-tun(隧道): 其本质是将请求数据包重新封装在一个新的IP数据包中,并通过隧道发送给后端服务器

lvs的调度算法:

静态算法:不考虑后端服务器的负载

RR:轮询,客户端的请求被轮流调度到不同的后端服务器

WRR:在RR的基础上,给后端服务器添加权重值,权重值大的服务器优先调度,调度完之后才轮到权重值小的服务器

SH:源地址哈希,将同一ip来源的请求,始终转发到同一后端服务器

DH:目标地址哈希,尽量保证相同目标地址的请求被分配到同一后端服务器

动态算法:考虑后端服务器的负载,来动态分配请求

LC:会把连接请求分配到当前活动连接数最少的真实服务器上。

WLC:在 LC 算法的基础上,为每个真实服务器设置了权重值。服务器的权重越高,其处理新连接的能力就越强。在分配连接时,首先计算每个服务器的加权活动连接数(权重值与活动连接数的乘积),然后将新连接分配到加权活动连接数最小的服务器上。

SED: 算法在调度时会综合考虑服务器的权重和当前的连接数。其基本思想是为每个服务器计算一个预期延迟值,预期延迟值的计算基于服务器的权重和当前连接数。

具体来说,预期延迟值等于:(当前连接数 + 1) * 256 / 服务器权重,调度时,SED 算法会选择预期延迟值最小的服务器来处理新的请求。

LVS负载均衡使用的场景:

  1. 高并发网站:当网站的访问量巨大,单个服务器无法承受负载时,LVS 可以将流量分发到多个后端服务器,确保网站的快速响应和稳定性。

  2. 电商平台:在促销活动或高峰时段,电商平台会面临大量的用户请求,LVS 有助于平衡服务器负载,保证交易的顺利进行。

  3. 在线游戏:处理大量玩家的同时在线和交互请求,确保游戏服务的流畅性。

总之,只要存在大量并发请求且需要在多个服务器之间均衡分配负载以保证服务质量和可用性的场景,都可以考虑使用 LVS 负载均衡。

lvs-nat实验

nat模式数据传输的原理:

我们的用户发出请求后,请求报文里会携带源客户端ip地址以及目的ip地址即中间虚拟服务器的外网ip地址以及端口,当我们的请求到达中间虚拟服务器后,会将请求报文的目的ip地址替换成真实后端服务器的ip地址以及端口,因为虚拟服务器的内网ip地址是和后端服务器处于同一网段,所以我们的请求会继续通过虚拟服务器的内网ip地址将请求转发到后端服务器,请求到达后端服务器后,会将源ip地址替换成后端服务器的ip地址,目标ip地址替换成客户端的ip地址以及端口,最后将数据包通过虚拟服务器返回给客户端,从而实现数据的双向交互。

实验环境:

虚拟机版本:redhat9.4

客户端服务器: windows端作为测试端

lvs服务器: eth0:172.25.254.100    NAT                eth1:192.168.0.100      仅主机

web1服务器: 192.168.0.10           仅主机             gateway:192.168.0.100

web2服务器: 192.168.0.20           仅主机             gateway:192.168.0.100

web1服务器端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
dns=114.114.114.114;[root@www ~]# nmcli connection reload 
[root@www ~]# nmcli connection up eth0 
[root@www ~]# yum install nginx -y
[root@www ~]# echo web1 > /usr/share/nginx/html/index.html 
[root@www ~]# systemctl restart nginx
[root@www ~]# curl 192.168.0.10
web1

web2服务器端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
dns=114.114.114.114;nmcli connection reload 
nmcli connection up eth0 
yum install nginx -y
echo web2 > /usr/share/nginx/html/index.html 
systemctl restart nginx
curl 192.168.0.20
web2

lvs服务器端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;nmcli connection reload 
nmcli connection up eth0 [root@www ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24,172.25.254.2
method=manual
dns=114.114.114.114;nmcli connection reload 
nmcli connection up eth1 #打开路由转发功能,让172网段和192网段互通
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1sysctl -p  #重载生效#安装lvs软件
yum install ipvsadm -y#设置lvs策略
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-A:添加lvs策略
-t:指定传输的协议为tcp
-s:指定调度算法
-a:添加后端真实服务器
-r:指定后端服务器的ip
-m:指定lvs的模式为nat模式#查看添加的路由策略
[root@www ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr-> 192.168.0.10:80              Masq    1      0          0         -> 192.168.0.20:80              Masq    1      0          0     

windows客户端测试:

C: \Users\大圣哥>curl 172. 25. 254. 100 
web2C: \Users\大圣哥>curl 172. 25. 254. 100 
web1

lvs-dr实验

dr模式数据传输的原理:

当我们的客户端发出请求后,请求报文里会携带客户端的ip地址以及mac地址,同时还会携带中间虚拟服务器的外网ip,以及mac地址,当请求到达虚拟服务器后,虚拟服务器会将虚拟服务器的外网的mac地址替换成真实的后端服务器的mac地址,接着请求被转发到后端服务器后,数据包会将虚拟服务器的ip作为源ip,后端服务器的mac作为源mac,而将客户端的ip作为目的ip,客户端的mac作为目的mac,最后直接将请求返回给客户端,从而实现数据的转发。

实验环境:

客户端:172.25.254.200        nat

router:eth0 172.25.254.100  nat        eth1 192.168.0.100       仅主机

lvs: vip: 192.168.0.200                       dip: 192.168.0.50          仅主机

web1: rip 192.168.0.10                       vip:192.168.0.200         仅主机

web2: rip 192.168.0.20                       vip:192.168.0.200         仅主机

注意:192网段为nat,172网段为仅主机

客户端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
dns=114.114.114.114;

router端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;[root@www ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manual
dns=114.114.114.114;

lvs端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
dns=114.114.114.114;#打开路由转发
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1sysctl -p  #重载生效#添加vip
ip a a 192.168.0.200/32 dev lo#添加路由策略
yum install ipvsadm -y
[root@www ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1
[root@www ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1

web1端配置:

[root@www ~]# yum install nginx -y
[root@www ~]# echo web1 > /usr/share/nginx/html/index.html 
[root@www ~]# systemctl restart nginx[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
dns=114.114.114.114;#添加vip
ip a a 192.168.0.200/32 dev lo#忽略arp广播
[root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 

web2端配置:

[root@www ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
dns=114.114.114.114;#添加vip
ip a a 192.168.0.200/32 dev lo#忽略arp广播
[root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@www ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@www ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 

访问测试

[root@www ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
web1
web2
web1
web2
web1
web2
web1
web2
web1
web2


http://www.ppmy.cn/ops/94335.html

相关文章

整理 酷炫 Flutter 开源UI框架 FAB

flutter_villains 灵活且易于使用的页面转换。 项目地址:https://github.com/Norbert515/flutter_villains 项目Demo:https://download.csdn.net/download/qq_36040764/89631324

SpringBoot快速入门(手动创建)

目录 案例:需求 步骤 1 创建Maven项目 2 导入SpringBoot起步依赖 3 定义Controller 4 编写引导类 案例:需求 搭建简单的SpringBoot工程,创建hello的类定义h1的方法,返回Hello SpringBoot! 步骤 1 创建Maven项目 大家&…

[GXYCTF2019]禁止套娃-使用无参数读文件

点开靶场 发现源码、以及抓包啥都看不出来 用dirsearch扫描发现是git源码泄露,用githack获取源码 查看源码发现最终目标要执行eval($_GET[exp]) 要执行eval就要通过这些正则,第一个正则匹配不分大小写的php伪协议之类的 重点是第二个正则 preg_repl…

JsonUtility和JsonConvert.DeserializeObject

文章目录 JsonUtility 和 JsonConvert在字符串转类型时的不同总结 JsonUtility 和 JsonConvert在字符串转类型时的不同 不同: JsonUtility.FromJson要转的字符串内不能有注释的字符串 但JsonConvert.DeserializeObject要转的字符串里可以有 原因:. Jso…

登录过程记录

过程: 未登录状态打开我的消息页-》调用后端接口查询登录状态->后端接口从cookie里拿lt,判断是否登录-》未登录,携带页面链接(我的消息)跳转passport【单点登录服务】 登录页-》输入验证码提交后-》验证成功-》根据用户信息生成票据-》携带票据和我的…

SpringBoot 自动配置(Condition)

一.Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操 作。 案例:需求1 在 Spring 的 IOC 容器中有一个 User 的 Bean,现要求: 1. 导入Jedis坐标后,加载该Bean…

【Rust光年纪】Rust 官方提供的关键工具概览:代码检查、格式化和依赖管理

提升 Rust 项目质量和安全性:掌握官方工具的核心功能和使用方法 前言 Rust 作为一种系统编程语言,拥有强大的性能和内存安全特性。然而,随着项目规模增长,代码检查、格式化和依赖管理等工作变得更加重要。因此,Rust …

线程和进程的关系

计算机是如何运行的?CPU 操作系统 进程管理 CPU 多核心 充分利用-> 并发编程,并发执行就算分时复用, 包括多进程编程。 多进程编程进程太重,创建进程,销毁进程开销比较大 ,不利于频繁创建销毁进程&…