LVS集群中的负载均衡技术

news2025/1/11 12:56:18

目录

1、LVS技术原理

2、NAT模式原理及部署方法

1、工作原理

2、部署方法

1、网络配置

2、软件安装与启用

3、测试

2、DR模式工作原理及部署方法

1、工作原理

2、部署方法

1、网络配置

2、解决vip响应问题

3、测试

3、ipvsadm命令及参数

1.管理集群服务中的增删改

2.管理集群中RealServer的增删改

3、针对集群(负载均衡器)的命令:

4、针对真实服务器的命令:

5、LVS 技术主要有以下几种调度算法:

LVS 技术出现的背景:
随着互联网的迅速发展,网站和网络服务的访问量不断增加。早期,单个服务器很难应对大量的并发请求,容易导致性能下降、响应延迟甚至服务崩溃。
在这种情况下,需要一种有效的方法来实现服务器的负载均衡,以提高系统的整体性能和可用性。
传统的负载均衡方法存在诸多局限性,例如硬件负载均衡设备成本高昂,而且缺乏灵活性和可扩展性。
Linux 操作系统因其开源、稳定、高效等特点在服务器领域得到广泛应用。基于 Linux 开发一种高效、灵活且成本相对较低的负载均衡技术成为了一种迫切的需求。
于是,LVS 技术应运而生,它充分利用了 Linux 系统的内核功能和网络特性,为解决服务器负载均衡问题提供了一种强大而经济有效的解决方案。

1、LVS技术原理

LVS(Linux Virtual Server)技术是一种基于 Linux 操作系统的开源负载均衡技术。

LVS 工作在网络的第四层,即传输层,它通过 IP 负载均衡技术和基于内容请求分发技术来实现对大量网络服务请求的高效分发和处理。

LVS 主要有三种工作模式:

  1. NAT 模式(Network Address Translation):通过修改请求数据包的目标 IP 地址和目标端口来实现请求的分发。这种模式配置简单,但对 LVS 服务器的性能要求较高,因为所有的请求和响应都要经过 LVS 服务器。 例如,在一个小型企业网络中,如果有多台 Web 服务器提供相同的服务,就可以使用 LVS 的 NAT 模式来均衡访问流量。

  2. DR 模式(Direct Routing):直接路由模式,请求数据包在通过 LVS 服务器时,LVS 服务器只修改数据包的目的 MAC 地址,然后将数据包直接发送到真实服务器。响应数据包直接由真实服务器返回给客户端,不再经过 LVS 服务器。 比如,在大型电商网站的服务器架构中,为了提高性能和可扩展性,常常采用 DR 模式进行负载均衡。

  3. TUN 模式(IP Tunneling):IP 隧道模式,LVS 服务器和真实服务器之间通过 IP 隧道进行通信。LVS 服务器将请求数据包封装在新的 IP 数据包中,然后发送到真实服务器,真实服务器解封装后处理请求,并直接将响应返回给客户端。 此种模式适用于服务器分散在不同地域的情况,通过公共网络建立隧道来实现负载均衡。

    LVS 技术具有高可用性、高扩展性和高性能等优点,被广泛应用于大型网站、云计算平台等场景,能够有效地提升系统的整体性能和可靠性。

本文主要介绍常用的NAT模式和DR模式。

VS(Virtual Server):指的是虚拟服务器,它是由 LVS 负载均衡器所构建的一个逻辑上的服务实体。客户端实际上是向这个虚拟服务器发送请求。 RS(Real Server):即真实服务器,是实际处理客户端请求并提供服务的服务器节点。 VIP(Virtual IP):虚拟 IP 地址,是客户端用来访问服务的公共 IP 地址。 DIP(Director IP):负载均衡器(Director)的 IP 地址,用于与后端真实服务器进行通信。 RIP(Real Server IP):真实服务器的 IP 地址。 CIP(Client IP):客户端的 IP 地址。

访问流程:CIP<->VIP== DIP<->RIP

2、NAT模式原理及部署方法

1、工作原理

在 LVS NAT 模式中,存在一个作为负载均衡器的 LVS 服务器和一组后端的真实服务器(Real Server)。 当客户端发送请求到 LVS 服务器时,LVS 服务器接收到请求数据包。 它会修改数据包中的目标 IP 地址和目标端口,将其转换为后端某一台真实服务器的 IP 地址和端口。 然后,LVS 服务器将修改后的数据包转发给选定的真实服务器。 真实服务器处理请求后,将响应数据包发送回 LVS 服务器。 LVS 服务器再对响应数据包进行源 IP 地址和源端口的转换,将其转换为客户端的 IP 地址和端口。 最后,LVS 服务器将响应数据包发送回客户端。

2、部署方法

基于RHEL9系统的环境搭建

RHEL9基础环境配置:

vmset.sh脚本配置

#企业9
[root@localhost mlh]# vim /bin/vmset.sh
#配置内容
#!/bin/bash
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1

[ipv4]
address1=$2/24,172.25.254.2
method=manual
dns=114.114.114.114;
EOF

chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1

hostnamectl hostname $3

cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$2	$3
EOF

前提:一台LVS负载均衡器和两台真实服务器

1、网络配置

LVS一个两个网卡分别为NAT模式和仅主机模式

两台真实服务器仅添加一个仅主机模式网卡

网卡配置:

LVS负载均衡器VS

vmset.sh eth0 172.25.254.100 lvs.mlh.org 

vmset.sh eth1 192.168.0.100 lvs.mlh.org 

nmcli connection reload

nmcli connection up eth0

nmcli connection up eth1

[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
#配置内容
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.100/24
method=manual

nmcli connection reload
nmcli connection up eth1

由于两个网卡不在同一网络,打开内核路由功能

[root@lvs ~]# sysctl -a | grep ip_forward

[root@lvs ~]# vim /etc/sysctl.conf

[root@lvs ~]# sysctl -p	#配置生效
net.ipv4.ip_forward = 1

真实服务器RS

vmset.sh eth0 192.168.0.10 webserver1.mlh.org 

vmset.sh eth0 192.168.0.20 webserver2.mlh.org 

nmcli connection reload
nmcli connection up eth0

网关设置:

[root@webserver1 ~]# vim /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
nmcli connection reload
nmcli connection up eth0

[root@webserver2 ~]# vim /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
nmcli connection reload
nmcli connection up eth0
2、软件安装与启用

程序包:ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save

规则重载工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config

ipvs调度规则文件:/etc/sysconfig/ipvsadm

[root@lvs ~]# dnf install ipvsadm -y


[root@webserver1 ~]# dnf install httpd
[root@webserver1 ~]# systemctl enable --now httpd

[root@webserver2 ~]# dnf install httpd
[root@webserver2 ~]# systemctl enable --now httpd

第一次安装未存储过/etc/sysconfig/ipvsadm文件,使用systemctl restart ipvsadm.service会报错,systemctl restart ipvsadm.service启动这个服务的作用就是加载ipvsadm文件内容,如果没有/etc/sysconfig/ipvsadm文件或者其中没有有效的配置,服务可能无法正确初始化或找不到所需的配置信息,从而导致报错。

3、测试
[root@webserver1 ~]# echo webserver-192.168.0.10 > /var/www/html/index.html

[root@webserver2 ~]# echo webserver2-192.168.0.20 > /var/www/html/index.html

[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr

[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

测试结果:

[root@lvs home]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10

保存策略:需要做本地解析

[root@lvs home]# ipvsadm-save > /etc/sysconfig/ipvsadm

2、DR模式工作原理及部署方法

1、工作原理

在 LVS DR 模式中,同样存在负载均衡器(LVS 服务器)和后端的真实服务器(Real Server)。 当客户端发送请求到负载均衡器时,负载均衡器根据调度算法选择一台合适的真实服务器。 与 NAT 模式不同的是,负载均衡器不会修改请求数据包的目标 IP 地址,而是仅仅修改目标 MAC 地址为所选真实服务器的 MAC 地址。 然后,数据包直接通过交换机被转发到真实服务器。 真实服务器接收到请求后,直接处理请求,并将响应数据包直接返回给客户端,而不再经过负载均衡器。

2、部署方法

基于RHEL9系统的环境搭建

在NAT模式环境基础上增删配置,新增客户和路由两台主机

1、网络配置

LVS配置

删除之前网卡,设置新网卡为仅主机模式

vmset.sh eth0 192.168.0.50 lvs.mlh.org

[root@lvs ~]# vim /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
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@lvs ~]# nmcli connection reload 
[root@lvs ~]# nmcli connection up eth0 

路由主机配置

vmset.sh eth1 192.168.0.100 router.mlh.org

vmset.sh eth0 172.25.254.100 router.mlh.org

[root@router ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
#配置内容
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.100/24
method=manual

[root@router ~]# nmcli connection reload 
[root@router ~]# nmcli connection up eth1
[root@router ~]# nmcli connection up eth0

由于两个网卡不在同一网络,打开内核路由功能

[root@router ~]# vim /etc/sysctl.conf 
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1

client客户端配置

vmset.sh eth0 172.25.254.200 client.mlh.org
[root@client ~]# vim /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

[root@client ~]# nmcli connection reload 
[root@client ~]# nmcli connection up eth0

RS设备vip配置

[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo

[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo

网络测试:

2、解决vip响应问题

在 LVS 的 DR 模式中,VIP 的响应存在一些需要特别注意的问题。首先,在 DR 模式下,真实服务器(RS)需要直接响应客户端的请求。为了实现这一点,RS 上需要配置 VIP 地址。但由于网络规则的限制,同一个网络段内不能存在相同的 IP 地址,这就可能导致网络冲突。 为了避免冲突,RS 上配置的 VIP 地址不能对外广播,通常是通过修改内核参数或者使用一些特殊的网络配置技巧来实现。 另外,当 RS 响应客户端请求时,源 IP 地址应该是 VIP 地址。然而,如果 RS 没有正确配置,可能会使用其真实的 IP 地址作为源 IP 进行响应,这会导致客户端无法正确接收响应,因为客户端发送请求的目标是 VIP 。

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1)在前端网关做静态绑定

(2)在各RS使用arptables

(3)在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应限制通告级别:arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

1:尽量避免将接口信息向非直接连接网络进行通告

2:必须避免将接口信息向非本网络进行通告

在Real Server上做配置使rs主机vip不对外响应:

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

[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#重启后不生效
3、测试

在lvs主机上做策略如下:

[root@client ~]# for i in {1..20}; do curl 192.168.0.200; done
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10

3、ipvsadm命令及参数

1.管理集群服务中的增删改

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

-A #添加

-E #修改

-t #tcp服务

-u #udp服务

-s #指定调度算法,默认为WLC

-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver-f #firewall mask 火墙标记,是一个数字

2.管理集群中RealServer的增删改

-a      #添加realserver-e      #更改realserver-t      #tcp协议

-u      #udp协议

-f      #火墙 标签

-r      #realserver地址-g      #直连路由模式

-i      #ipip隧道模式

-m     #nat模式

-w     #设定权重

-Z     #清空计数器

-C     #清空lvs策略

-L     #查看lvs策略

-n     #不做解析

--rate :输出速率信息

3、针对集群(负载均衡器)的命令:

ipvsadm -A -t <VIP>:<Port>:添加一个新的基于 TCP 协议的虚拟服务。 ipvsadm -E -t <VIP>:<Port>:修改已存在的基于 TCP 协议的虚拟服务。 ipvsadm -D -t <VIP>:<Port>:删除一个基于 TCP 协议的虚拟服务。

4、针对真实服务器的命令:

ipvsadm -a -t <VIP>:<Port> -r <RIP>:<Port> -m:在指定的虚拟服务中添加一个真实服务器,使用 NAT 模式。 ipvsadm -e -t <VIP>:<Port> -r <RIP>:<Port>:修改已添加的真实服务器的配置。 ipvsadm -d -t <VIP>:<Port> -r <RIP>:<Port>:从指定的虚拟服务中删除一个真实服务器。

5、LVS 技术主要有以下几种调度算法:

  • 轮询(Round Robin,RR):将请求依次分配给各个真实服务器,依次循环。例如:有服务器 R1、R2、R3,第一个请求分配给 R1,第二个请求分配给 R2,第三个请求分配给 R3,然后再从 R1 开始循环。

  • 加权轮询(Weighted Round Robin,WRR):根据真实服务器的权值比例分配请求。权值越高,分配到的请求越多。比如:R1 的权值为 2,R2 的权值为 3,R3 的权值为 5。那么在 10 个请求中,大约 2 个分配给 R1,3 个分配给 R2,5 个分配给 R3。

  • 最少连接(Least Connections,LC):将新请求分配给当前连接数最少的真实服务器。假设 R1 当前有 5 个连接,R2 有 3 个连接,R3 有 2 个连接,新请求会分配给 R3。

  • 加权最少连接(Weighted Least Connections,WLC):在最少连接的基础上,考虑真实服务器的权值。例如:R1 权值为 2,当前连接数为 5;R2 权值为 3,当前连接数为 3;R3 权值为 5,当前连接数为 2。计算加权连接数,R1 为 5/2 = 2.5,R2 为 3/3 = 1,R3 为 2/5 = 0.4,新请求分配给 R3。

  • 基于局部性的最少连接(Locality-Based Least Connections,LBLC):主要考虑请求的目标 IP 地址的相似性和服务器的连接数。

  • 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR):结合了复制技术和基于局部性的最少连接算法。

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

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

相关文章

数据同步工具之Flink CDC

Flink CDC&#xff08;Change Data Capture&#xff09;是基于Apache Flink的一个扩展&#xff0c;用于捕获和处理数据库中的数据变化。它能够实时捕获关系数据库中的数据变更&#xff08;如插入、更新、删除操作&#xff09;&#xff0c;并将这些变更流式传输到Flink进行处理。…

【OceanBase系列】—— OceanBase应急三板斧

作者&#xff1a; 花名&#xff1a;洪波&#xff0c; OceanBase 数据库解决方案架构师 目前随着OceanBase数据库越来越流行&#xff0c;社区已经有很多用户在生产环境使用了OceanBase&#xff0c;也有不少用户的核心业务用到了OceanBase数据库&#xff0c;在使用OceanBase数据库…

演示:基于WPF的DrawingVisual开发的矢量地图

一、目的&#xff1a;基于WPF的DrawingVisual开发的矢量地图 二、预览 默认样式 深黑样式 深蓝色样式 深蓝色透明样式 三、环境 VS2022&#xff0c;Net7&#xff0c;GDAL,审图号为GS(2019)1822号矢量数据,DrawingVisual 四、主要功能 支持多种显示样式&#xff08;默认样式&…

代码随想录27期|Python|Day39|​62. 不同路径​|​63. 不同路径 II​

62. 不同路径 简单题。由于规定了只能走右边和下边&#xff0c;所以右下角的值等于左对角线的两数之和。 1、确定dp和下标&#xff1a;二维数组&#xff0c;i&#xff0c;j分别为行和列&#xff0c;dp值为所需步数&#xff1b; 2、 初始化&#xff1a;只有上边和左边全部初始…

Java二十三种设计模式-享元模式(12/23)

享元模式&#xff1a;高效管理大量对象的设计模式 引言 在软件开发中&#xff0c;有时需要处理大量相似或重复的对象&#xff0c;这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案&#xff0c;通过共享对象的共同部分来减少内存占用。 基础知识&#xff0c…

Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE

近日&#xff0c;研究人员发现 Apache OFBiz 中存在一个新的关键漏洞&#xff0c;该漏洞是 Apache OFBiz 中的一个错误授权问题&#xff0c;被追踪为CVE-2024-38856。该漏洞影响 18.12.14 之前的版本&#xff0c;18.12.15 版本解决了该漏洞。 SonicWall 的安全研究员 Hasib Vh…

字节跳动发Seed-TTS语音合成模型,可模仿任意人的声音,效果逼真

前期我们介绍过很多语音合成的模型&#xff0c;比如ChatTTS&#xff0c;微软语音合成大模型等&#xff0c;随着大模型的不断进步&#xff0c;其合成的声音基本跟真人没有多大的区别。本期介绍的是字节跳动自家发布的语音合成模型Seed-TTS。 Seed-TTS 推理包含四个功能模块&…

JavaScript中判断变量的类型

数据类型 在 JavaScript 中有 8 种基本的数据类型&#xff08;7 种原始类型和 1 种引用类型&#xff09;&#xff0c;它们分别是&#xff1a; 原始类型/基本类型&#xff1a; Number&#xff0c;BigInt&#xff0c;String&#xff0c;Boolean&#xff0c;null&#xff0c;unde…

C++开发基础之深入理解C++中的两种单例模式实现——线程安全与效率的权衡

引言&#xff1a; 单例模式是设计模式中的一种&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。在C中&#xff0c;实现单例模式的方式多种多样&#xff0c;但随着多线程应用的普及&#xff0c;如何确保单例模式在多线程环境下的线程安全性成为了一个重…

深度学习--图像分割UNet介绍及代码分析

UNet介绍 参考UNet网络介绍整体架构UNet过程输入编码器&#xff08;下采样&#xff09;中间特征表示解码器&#xff08;上采样&#xff09;输出 代码详解unetUP和Unet关系上采样模块——unetUp用于图像分割的卷积神经网络&#xff08;CNN&#xff09;架构模块——Unet类的定义初…

使用 Manim 创建一个二维坐标平面【NumberPlane】

NumberPlane 是 Manim 中用于创建一个二维坐标平面的类。它可以帮助用户在场景中可视化坐标轴、网格线以及其他数学概念。具体来说&#xff0c;它的功能包括&#xff1a; 坐标轴&#xff1a;NumberPlane 提供了 x 轴和 y 轴&#xff0c;通常是中心对称的&#xff0c;允许用户清…

深入探究Python反序列化漏洞:原理剖析与实战复现

在现代应用程序开发中&#xff0c;Python反序列化漏洞已成为一个备受关注的安全问题。反序列化是Python中用于将字节流转换回对象的过程&#xff0c;但如果没有妥善处理&#xff0c;攻击者可以通过精心构造的恶意数据&#xff0c;利用反序列化漏洞执行任意代码&#xff0c;进而…

前端day4-表单标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>day4-表单</title> </head> <body&g…

# 基于MongoDB实现商品管理系统(2)

基于MongoDB实现商品管理系统&#xff08;2&#xff09; 基于 mongodb 实现商品管理系统之准备工作 1、案例需求 这里使用的不是前端页面&#xff0c;而是控制台来完成的。 具体的需求如下所示&#xff1a; 运行 查询所有 通过id查询详情 添加 - 通过id删除 2、案例分析 程…

进程创建,进程消亡

虚拟地址&#xff1a;通过虚拟技术&#xff0c;将外部存储设备的一部分空间&#xff0c;划分给系统&#xff0c;作为在内存不足时临时用作数据缓存。当内存耗尽时&#xff0c;电脑就会自动调用硬盘来充当内存&#xff0c;以缓解内存的紧张。 练习: 编写一个代码实现,一个父…

OGG转MP3音频格式转换:6种免费音频转换器推荐

在如今的数字音乐时代&#xff0c;不同音频格式的兼容性问题常常让我们感到困扰。其中&#xff0c;OGG和MP3是两种常见的音频格式&#xff0c;但由于设备和平台的支持问题&#xff0c;我们经常需要将OGG转换为MP3格式。 本文将为您详细介绍OGG和MP3的区别&#xff0c;为什么需要…

Spring Boot集成protobuf快速入门Demo

1.什么是protobuf&#xff1f; Protobuf&#xff08;Protocol Buffers&#xff09;是由 Google 开发的一种轻量级、高效的数据交换格式&#xff0c;它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式&#xff0c;Protobuf 具有更小的数据体积、更快…

数据结构:队列(含源码)

目录 一、队列的概念和结构 二、队列的实现 头文件 初始化 入队列和出队列 获取队头队尾元素 队列有效数据数及队列判空 队列的销毁 完整源码 dl.h dl.c 一、队列的概念和结构 队列是一种只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性…

重生之我 学习【数据结构之顺序表(SeqList)】

⭐⭐⭐ 新老博友们&#xff0c;感谢各位的阅读观看 期末考试&假期调整暂时的停更了两个多月 没有写博客为大家分享优质内容 还容各位博友多多的理解 美丽的八月重生之我归来 继续为大家分享内容 你我共同加油 一起努力 ⭐⭐⭐ 数据结构将以顺序表、链表、栈区、队列、二叉树…

多米诺和托米诺平铺

有两种形状的瓷砖&#xff1a;一种是2 x 1的多米诺形&#xff0c;另一种是形如L的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 10^9 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同&#xff…