当前位置: 首页 > news >正文

ceph基本概念,架构,部署(一)

一、分布式存储概述

1.存储分类

存储分为封闭系统的存储开放系统的存储,而对于开放系统的存储又被分为内置存储外挂存储

外挂存储又被细分为直连式存储(DAS)和网络存储(FAS),而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。

  • DAS(Direct-attached Storage): 直连存储,即直接连接到主板的总线上去的,我们可以对这些设备进行格式化操作。 典型代表有:IDE,SATA,SCSI,SAS,USB等。

  • SAN(Storage Area Network): 存储区域网络,是一个网络上的磁盘。它提供的一个块设备而非文件系统。 早期是通过SCSI协议传输数据,后来设计通过光纤通道交换机连接存储阵列和服务器主机,也称为FC SAN,当然也可以基于以太网传输,我们称之为ISCSI协议。

  • NAS(Network Attached Storage): 网络附加存储,是一个网络上的文件系统,我们无法进行格式化操作。典型代表有:NFS,CIFS等。

专门的存储厂商可以通过RAID技术来实现数据的高效存储,国内外很多企业都有自己的存储设备,例如EMC,NetApp,IBM,惠普,Dell,爱数等。

但是这些专业的存储设备不仅价格是非常昂贵的,而且是非常重的,大多数都是基于FC SAN,ISCSI或者NAS访问接口,所以在某种意义上将他们的存储能力和扩展能力是非常有限的,这个时候我们就需要一个能够实现横向存储的分布式存储。

 

2.存储系统的分类

  • 块存储系统: 通常对应的是一个裸设备,比如一块磁盘,我们需要格式化后进行挂载方能使用。 代表产品: lvm,cinder。

  • 文件系统存储系统: 文件系统只是数据组织存放的接口。文件系统通常是构建在一个块存储级别之上。 文件系统被分为元数据区域和数据区域,对于用户而言,它呈现为一个树形结构(实际上提供的是一个目录)。 代表产品: NFS,glusterfs。

  • 对象存储系统: 对象存储并没有向文件系统那样划分为元数据区域和数据区域,而是按照不同的对象进行存储,而且每个对象内部维护着元数据和数据区域。因此每个对象都有自己独立的管理格式。 代表产品: Fastdfs,swift。

补充知识:

为什么网速很慢,上传10T这种大文件确很快?

因为每一个文件都有独有的hash值,就是我们上传文件时,系统去扫描文件的哈希码并保存在数据库中,每个文件(包括其副本)的哈希码都是独一无二的,就是说,如果哈希码相同,我们可以定义为是同一个文件。接下来就简单了,上传时判断哈希码,如果数据库里有相同的哈希码就说明这个文件在云端有一摸一样的副本了,直接显示上传完成就可以了,文件并没有被真实上传,你的等待时间是计算哈希码的时间。如果在云端没有相同哈希码的文件,系统再老老实实上传。

而修改文件名并不会改变hash值,不要不更改文件内容,哈希码就不会改变。所以可以实现秒传的技术。

文件哈希码的特性使哈希码用途很广泛,因为用哈希码可以标定所有相同的文件。除了秒传、去重等功能,还可以用在判断文件是否更新、统一阻止违规文件传播、统一删除文件上上传文件等

如果多个用户拥有相同资源,实际上远程存储服务器也只是存储一份,如果我们本地删除改文件,其实也是删除软连接,远端存储服务器的数据并不会删除。所有也并不会影响其他用户访问。所有大家在网盘上传隐私性较强的东西一定要谨慎~

二、Ceph分布式存储系统概述

Ceph 是一个开源的分布式存储系统,旨在提供高性能、高可扩展性和高可靠性的存储解决方案。它能够通过统一的存储平台同时支持块存储、对象存储和文件存储。Ceph 是一个去中心化的系统,能够在大规模分布式环境中工作,广泛应用于云计算和大数据处理领域。

特点

  • 高可扩展性:Ceph 能够动态扩展,随着更多的存储节点的加入,集群的容量和性能也能够得到相应的扩展。

  • 高可靠性:Ceph 使用 CRUSH 算法来实现数据的分布式存储和副本管理,从而确保数据的高可靠性。当某个节点发生故障时,Ceph 可以自动恢复丢失的数据。

  • 自我修复:Ceph 会自动检测节点故障并进行数据恢复,确保数据的高可用性。

  • 灵活性:Ceph 可以同时提供块存储、对象存储和文件存储服务,适应多种存储需求。

  • 性能优化:Ceph 使用对象存储和 CRUSH 算法来优化存储性能,支持高吞吐量和低延迟的存储需求。

1.Ceph 组件

Ceph OSD (Object Storage Daemon)

  • 作用:负责存储数据和处理数据的复制、恢复、重平衡等操作。每个 OSD 进程通常对应一个物理硬盘或磁盘阵列。

  • 功能:数据存储、数据复制、数据重建和故障转移等。OSD 是 Ceph 集群的工作核心。

Ceph MON (Monitor)

  • 作用:监控 Ceph 集群的健康状况,维护集群的元数据,并确保集群的一致性。MON 节点管理集群状态信息、存储池、OSD 设备等元数据。

  • 功能:提供集群的状态信息,处理客户端和 OSD 之间的交互,确保集群的一致性和健康状态。

Ceph MDS (Metadata Server)

  • 作用:仅在 Ceph 用作文件系统(CephFS)时使用,负责处理文件系统的元数据管理,如文件目录结构、文件权限、文件名等。

  • 功能:在 CephFS 中管理目录、文件元数据和锁,并提供文件访问接口。

Ceph Client

  • 作用:客户端是与 Ceph 集群交互的应用程序或系统,进行数据存储、访问、管理等操作。

  • 功能:客户端可以是使用 Ceph 提供的不同接口进行操作的应用,例如 Ceph RBD(块存储)、CephFS(文件存储)等。

Ceph RGW (Rados Gateway)

  • 作用:Rados Gateway 提供与 Ceph 集群的对象存储服务的接口,支持通过 HTTP 协议访问存储的数据,兼容 S3 和 OpenStack Swift API。

  • 功能:允许对象存储服务的访问和管理,提供 RESTful 接口,适用于云存储服务和大数据应用等。

CRUSH (Controlled Replication Under Scalable Hashing)

  • 作用:CRUSH 是 Ceph 的数据分布和复制算法,用于决定数据如何在 OSD 之间分配和存储,避免中央元数据服务的瓶颈。

  • 功能:实现数据的分布式存储和复制策略,确保数据冗余和高可用性。

Ceph Pools

  • 作用:池是 Ceph 中用于存储数据的逻辑分区,每个池有不同的设置和配置,如副本数量、对象大小等。

  • 功能:用于数据存储和隔离,支持不同的存储策略(例如,块存储、对象存储等)。

Ceph Dashboard (可选)

  • 作用:提供 Ceph 集群的 Web 界面,供管理员查看集群的状态、健康状况、性能指标、配置等。

  • 功能:集群监控和管理界面,支持查看集群健康、性能、日志等信息。

Ceph RBD (Rados Block Device)

  • 作用:Ceph 提供的块存储服务,允许客户端将 Ceph 集群作为块设备挂载到操作系统中,适用于虚拟化存储或数据库等应用场景。

  • 功能:提供与传统块设备(如 iSCSI)类似的功能,但具有 Ceph 集群的可扩展性和容错性。

CephFS (Ceph File System)

  • 作用:Ceph 的文件系统接口,允许将 Ceph 集群作为一个分布式文件系统进行访问。

  • 功能:提供 POSIX 兼容的文件系统,支持多客户端并发访问,适用于高性能计算、大数据处理等应用场景。

总结:

  • OSD:处理数据存储和复制。

  • MON:监控集群状态和元数据管理。

  • MDS:管理 CephFS 文件系统的元数据。

  • RGW:提供对象存储接口。

  • CRUSH:数据分布和复制算法。

  • Pools:逻辑存储池,用于数据组织。

  • Client:与集群交互的客户端应用程序。

  • RBD:块存储服务。

  • CephFS:分布式文件系统。

  • Dashboard:集群管理和监控界面。

2.Ceph逻辑单元

  • pool(池):pool是Ceph存储数据时的逻辑分区,它起到namespace的作用,在集群层面的逻辑切割。每个pool包含一定数量(可配置)的PG。

  • PG(Placement Group):PG是一个逻辑概念,每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到对象所属的PG,然后遍历这个PG就可以了,无需遍历所有对象。而且在数据迁移时,也是以PG作为基本单位进行迁移。PG的副本数量也可以看作数据在整个集群的副本数量。一个PG 包含多个 OSD 。引入 PG 这一层其实是为了更好的分配数据和定位数据。

  • OID:存储的数据都会被切分成对象(Objects)。每个对象都会有一个唯一的OID,由ino与ono生成,ino即是文件的File ID,用于在全局唯一标示每一个文件,而ono则是分片的编号,OID = ( ino + ono )= (File ID + File part number),例如File Id = A,有两个分片,那么会产生两个OID,A01与A02。

  • PgID:首先使用静态hash函数对OID做hash取出特征码,用特征码与PG的数量去模,得到的序号则是PGID。

  • Object:Ceph最底层的存储单元是 Object对象,每个 Object 包含元数据和原始数据

3.pool、PG、OSD 关系

  • 一个Pool里有很多PG,

  • 一个PG里包含一堆对象;一个对象只能属于一个PG;

  • PG有主从之分,一个PG分布在不同的OSD上(针对三副本类型)

三、Ceph 设计

1.整体设计

基础存储系统 RADOS

Reliable, Autonomic,Distributed Object Store,即可靠的、自动化的、分布式的对象存储

这就是一个完整的对象存储系统,所有存储在 Ceph 系统中的用户数据事实上最终都是由这一层来存储的。而 Ceph 的高可靠、高可扩展、高性能、高自动化等等特性本质上也是由这一层所提供的

基础库 librados

这层的功能是对 RADOS 进行抽象和封装,并向上层提供 API,以便直接基于 RADOS(而不是整个 Ceph)进行应用开发。特别要注意的是,RADOS 是一个对象存储系统,因此,librados 实现的 API 也只是针对对象存储功能的。RADOS 采用 C++ 开发,所提供的原生 librados API 包括 C 和 C++ 两种。

高层应用接口

这层包括了三个部分:RADOS GW(RADOS Gateway)、 RBD(Reliable Block Device)和 Ceph FS(Ceph File System),其作用是在 librados 库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中,RADOS GW 是一个提供与 Amazon S3 和 Swift 兼容的 RESTful API 的 gateway,以供相应的对象存储应用开发使用。RADOS GW 提供的 API 抽象层次更高,但功能则不如 librados 强大。

应用层

这层是不同场景下对于 Ceph 各个应用接口的各种应用方式,例如基于 librados 直接开发的对象存储应用,基于 RADOS GW 开发的对象存储应用,基于 RBD 实现的云硬盘等等。librados 和 RADOS GW 的区别在于,librados 提供的是本地 API,而 RADOS GW 提供的则是 RESTfulAPI。

由于 Swift 和 S3 支持的 API 功能近似,这里以 Swift 举例说明。Swift 提供的 API 功能主要包括:

  • 用户管理操作:用户认证、获取账户信息、列出容器列表等;

  • 容器管理操作:创建 / 删除容器、读取容器信息、列出容器内对象列表等;

  • 对象管理操作:对象的写入、读取、复制、更新、删除、访问许可设置、元数据读取或更新等

2.逻辑架构

 

3.Ceph物理组件架构

RADOS是Ceph的核心,我们谈及的物理组件架构也只是RADOS的物理架构。

RADOS集群是由若干服务器组成,每一个服务器上都相应会运行RADOS的核心守护进程(OSD、MON、MDS)。具体守护进程的数量需要根据集群的规模和既定的规则来配置。

 

我们首先来看每一个集群节点上面的守护进程的主要作用:

OSD Daemon:两方面主要作用,一方面负责数据的处理操作,另外一方面负责监控本身以及其他OSD进程的健康状态并汇报给MON。OSD守护进程在每一个PG(Placement Group)当中,会有主次(Primary、Replication)之分,Primary主要负责数据的读写交互,Replication主要负责数据副本的复制。其故障处理机制主要靠集群的Crush算法来维持Primary和Replication之间的转化和工作接替。所有提供磁盘的节点上都要安装OSD 守护进程。

MON Daemon:三方面主要作用,首先是监控集群的全局状态(OSD Daemon Map、MON Map、PG Map、Crush Map),这里面包括了OSD和MON组成的集群配置信息,也包括了数据的映射关系。其次是管理集群内部状态,当OSD守护进程故障之后的系列恢复工作,包括数据的复制恢复。最后是与客户端的查询及授权工作,返回客户端查询的元数据信息以及授权信息。安装节点数目为2N+1,至少三个来保障集群算法的正常运行。

MDS Daemon:它是Ceph FS的元数据管理进程,主要是负责文件系统的元数据管理,它不需要运行在太多的服务器节点上。安装节点模式保持主备保护即可

4.Ceph数据对象组成

从客户端发出的一个文件请求,到Rados存储系统写入的过程当中会涉及到哪些逻辑对象,他们的关系又是如何的?首先,我们先来列出这些对象:

(1)文件(FILE):用户需要存储或者访问的文件。对于一个基于Ceph开发的对象存储应用而言,这个文件也就对应于应用中的“对象”,也就是用户直接操作的“对象”。

(2)对象(Object):RADOS所看到的“对象”。Object指的是最大size由RADOS限定(通常为2/4MB)之后RADOS直接进行管理的对象。因此,当上层应用向RADOS存入很大的file时,需要将file切分进行存储。

(3)PG(Placement Group):PG是一个逻辑概念,阐述的是Object和OSD之间的地址映射关系,该集合里的所有对象都具有相同的映射策略;Object & PG,N:1的映射关系;PG & OSD,1:M的映射关系。一个Object只能映射到一个PG上,一个PG会被映射到多个OSD上。

(4)OSD(Object Storage Device):存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本和纠删码。

接下来,我们以更直观的方式来展现在Ceph当中数据是如何组织起来的:

 

(1) File > Object

本次映射为首次映射,即将用户要操作的File,映射为RADOS能够处理的Object。

具体映射操作本质上就是按照Object的最大Size对File进行切分,每一个切分后产生的Object将获得唯一的对象标识Oid。Oid的唯一性必须得到保证,否则后续映射就会出现问题。

(2) Object > PG

完成从File到Object的映射之后, 就需要将每个 Object 独立地映射到 唯一的 PG 当中 去。

Hash(Oid)& Mask > PGid

根据以上算法, 首先是使用Ceph系统指定的一个静态哈希函数计算 Oid 的哈希值,将 Oid 映射成为一个近似均匀分布的伪随机值。然后,将这个伪随机值和 Mask 按位相与,得到最终的PG序号( PG id)。根据RADOS的设计,给定PG的总数为 X(X= 2的整数幂), Mask=X-1 。因此,哈希值计算和按位与操作的整体结果事实上是从所有 X 个PG中近似均匀地随机选择一个。基于这一机制,当有大量object和大量PG时,RADOS能够保证object和PG之间的近似均匀映射。

(3) PG > OSD

最后的 映射就是将PG映射到数据存储单元OSD。RADOS采用一个名为CRUSH的算法,将 PGid 代入其中,然后得到一组共 N 个OSD。这 N 个OSD即共同负责存储和维护一个PG中的所有 Object 。和“object -> PG”映射中采用的哈希算法不同,这个CRUSH算法的结果不是绝对不变的,而是受到其他因素的影响。

① 集群状态(Cluster Map):系统中的OSD状态 。数量发生变化时, CLuster Map 可能发生变化,而这种变化将会影响到PG与OSD之间的映射。

② 存储策略配置。系统管理员可以指定承载同一个PG的3个OSD分别位于数据中心的不同服务器乃至机架上,从而进一步改善存储的可靠性。

到这里,可能大家又会有一个问题“为什么这里要用CRUSH算法,而不是HASH算法?”

这一次映射,我们对映射算法有两种要求:

一方面,算法必须能够随着系统的节点数量位置的变化,而具备动态调整特性,保障在变化的环境当中仍然可以保持数据分布的均匀性;另外一方面还要有相对的稳定性,也就是说大部分的映射关系不会因为集群的动态变化发生变化,保持一定的稳定性。

而CRUSH算法正是符合了以上的两点要求,所以最终成为Ceph的核心算法。

四、ceph 数据存储过程

如果我们想要将数据存储到ceph集群,那么大致步骤如下所示:

  • Rados Cluster集群固定大小的object可能不符合我们要存储某个大文件,因此一个大文件想要存储到ceph集群,它可能会被拆分成多个data object对象进行存储;

  • 通常情况下data object请求向某个pool存储数据时,通过CRUSH算法会先对data object进行一致性哈希计算,而后将存储任务映射到到该pool中的某个PG上;

  • 紧接着,CRUSH算法(是用来完成object存储路由的一个算法)会根据pool的冗余副本数量和data object的存储类型找到足量的OSD进行存储,当然对应的PG是有active PG和standby PG角色之分的,通常副本数我们会设置为3;

五、ceph集群部署

1.集群环境准备

主机名ip配置
ceph14110.0.0.1411c2G,300GB ,500GB
ceph14210.0.0.1421c2G,300GB ,500GB
ceph14310.0.0.1431c2G,300GB ,500GB

 ceph所有节点基础环境准备

基于cephadm部署前提条件,官方提的要求Ubuntu 22.04 LTS出了容器运行时其他都满足- Python 3- Systemd- Podman or Docker for running containers- Time synchronization (such as Chrony or the legacy ntpd)- LVM2 for provisioning storage devices参考链接:https://docs.ceph.com/en/latest/cephadm/install/#requirements

 设置时区

timedatectl set-timezone Asia/Shanghai
ll /etc/localtime

 安装docker环境

关于docker安装脚本可参考我这篇博文:kubeadm 部署k8s-CSDN博客

tar xf autoinstall-docker-docker-compose.tar.gz 
./install-docker.sh i

 添加hosts文件解析

cat >> /etc/hosts <<EOF
10.0.0.141 ceph141
10.0.0.142 ceph142
10.0.0.143 ceph143
EOF

2.cephadm部署初始化新集群

下载需要安装ceph版本的cephadm

[root@ceph141 ~]# CEPH_RELEASE=18.2.4
[root@ceph141 ~]# curl --silent --remote-name --location https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm

 将cephadm添加到PATH环境变量

[root@ceph141 ~]# mv cephadm /usr/local/bin/
[root@ceph141 ~]# 
[root@ceph141 ~]# chmod +x /usr/local/bin/cephadm 
[root@ceph141 ~]# 
[root@ceph141 ~]# ls -l /usr/local/bin/cephadm
-rwxr-xr-x 1 root root 215316 Aug 20 22:19 /usr/local/bin/cephadm

 创建新集群

[root@ceph141 ~]# cephadm bootstrap --mon-ip 10.0.0.141 --cluster-network 10.0.0.0/24 --allow-fqdn-hostname
Creating directory /etc/ceph for ceph.conf
Verifying podman|docker is present...
Verifying lvm2 is present...
...
Generating a dashboard self-signed certificate...
Creating initial admin user...
Fetching dashboard port number...
Ceph Dashboard is now available at:#访问的url,账号,密码URL: https://ceph141:8443/User: admin        Password: s3o1ou58iyEnabling client.admin keyring and conf on hosts with "admin" label

 查看docker镜像

登录dashbod

查看节点信息

 

参考地址:https://www.cuiliangblog.cn/

ceph的官方文档: https://docs.ceph.com/en/latest/ 
 官方架构图:  https://docs.ceph.com/en/latest/architecture/
        

相关文章:

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…...

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…...

Ubuntu 顶部状态栏 配置,gnu扩展程序

顶部状态栏 默认没有配置、隐藏的地方 安装使用Hide Top Bar 或Just Perfection等进行配置 1 安装 sudo apt install gnome-shell-extension-manager2 打开 安装的“扩展管理器” 3. 对顶部状态栏进行配置 使用Hide Top Bar 智能隐藏&#xff0c;或者使用Just Perfection 直…...

React应用深度优化与调试实战指南

一、渲染性能优化进阶 1.1 精细化渲染控制 typescript 复制 // components/HeavyComponent.tsx import React, { memo, useMemo } from react;interface Item {id: string;complexData: {// 复杂嵌套结构}; }const HeavyComponent memo(({ items }: { items: Item[] }) &g…...

Spring中的事件和事件监听器是如何工作的?

目录 一、事件&#xff08;Event&#xff09; 二、事件发布器&#xff08;Event Publisher&#xff09; 三、事件监听器&#xff08;Event Listener&#xff09; 四、使用场景 五、总结 以下是关于Spring中的事件和事件监听器的介绍与使用说明&#xff0c;结合了使用场景&…...

Vue.js组件开发-实现多个文件附件压缩下载

在 Vue 项目中实现多个附件压缩下载&#xff0c;可以借助 jszip 库来创建压缩文件&#xff0c;以及 file-saver 库来保存生成的压缩文件。 步骤 1&#xff1a;安装依赖 首先&#xff0c;在 Vue 项目中安装 jszip 和 file-saver&#xff1a; npm install jszip file-saver步骤…...

基于dlib/face recognition人脸识别推拉流实现

目录 一.环境搭建 二.推拉流代码 三.人脸检测推拉流 一.环境搭建 1.下载RTSP服务器MediaMTX与FFmpeg FFmpeg是一款功能强大的开源多媒体处理工具,而MediaMTX则是一个轻量级的流媒体服务器。两者结合,可以实现将本地视频或者实时摄像头画面推送到RTSP流,从而实现视频…...

qt QNetworkRequest详解

1、概述 QNetworkRequest是Qt网络模块中的一个核心类&#xff0c;专门用于处理网络请求。它封装了网络请求的所有关键信息&#xff0c;包括请求的URL、HTTP头部信息等&#xff0c;使得开发者能够方便地在Qt应用程序中执行网络操作&#xff0c;如文件下载、网页内容获取等。QNe…...

uvm timeout的哪些事

如下图所示&#xff0c;设置timeout并未生效&#xff0c;原因多了一个空格&#xff0c;坑 进一步分析&#xff0c;默认是overidable的 是否加括号呢&#xff0c;如下所示&#xff0c;这两个造型都可以&#xff0c;中间有空格也行 那么&#xff0c;我加上单位可以吗&#xff0c;…...

JavaScript赋能智能网页设计

构建AI驱动的实时风格迁移系统 案例概述 本案例将实现一个基于深度学习的实时图像风格迁移系统&#xff0c;通过浏览器端神经网络推理实现以下高级特性&#xff1a; WebAssembly加速的ONNX模型推理 WebGL Shader实现的风格混合算法 WebRTC实时视频流处理 基于Web Workers的…...

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…...

leetcode_链表 234.回文链表

234.回文链表 给你一个单链表的头节点head&#xff0c;请你判断该链表是否为回文链表。如果是, 返回 true ; 否则, 返回false。思路&#xff1a; 找到中间节点(快慢指针法)反转后半部分的链表比较前半部分和后半部分链表 # Definition for singly-linked list. # class List…...

cloc下载和使用

cloc&#xff08;Count Lines of Code&#xff09;是一个跨平台的命令行工具&#xff0c;用于计算代码行数。以下是下载和使用 cloc 的步骤&#xff1a; 下载 cloc 对于 Windows 用户&#xff1a; 访问 cloc 的 GitHub 仓库&#xff1a;https://github.com/AlDanial/cloc在 …...

在 Windows 系统上,将 Ubuntu 从 C 盘 迁移到 D 盘

在 Windows 系统上&#xff0c;如果你使用的是 WSL&#xff08;Windows Subsystem for Linux&#xff09;并安装了 Ubuntu&#xff0c;你可以将 Ubuntu 从 C 盘 迁移到 D 盘。迁移过程涉及导出当前的 Ubuntu 发行版&#xff0c;然后将其导入到 D 盘的目标目录。以下是详细的步骤…...

【Redis】Redis入门以及什么是分布式系统{Redis引入+分布式系统介绍}

文章目录 介绍redis的引入 分布式系统单机架构应用服务和数据库服务分离【负载均衡】引入更多的应用服务器节点 单机架构 分布式是什么 数据库分离和负载均衡 理解负载均衡 数据库读写分离 引入缓存 数据库分库分表 引入微服务 介绍 The open source, in-memory data store us…...

wow-agent---task4 MetaGPT初体验

先说坑&#xff1a; 1.使用git clone模式安装metagpt 2.模型尽量使用在线模型或本地高参数模型。 这里使用python3.10.11调试成功 一&#xff0c;安装 安装 | MetaGPT&#xff0c;参考这里的以开发模型进行安装 git clone https://github.com/geekan/MetaGPT.git cd /you…...

Leetcode::3432. 统计元素和差值为偶数的分区方案

3432. 统计元素和差值为偶数的分区方案 已解答 简单 相关企业 提示 给你一个长度为 n 的整数数组 nums 。 分区 是指将数组按照下标 i &#xff08;0 < i < n - 1&#xff09;划分成两个 非空 子数组&#xff0c;其中&#xff1a; 左子数组包含区间 [0, i] 内的所…...

linux如何修改密码,要在CentOS 7系统中修改密码

要在CentOS 7系统中修改密码&#xff0c;你可以按照以下步骤操作&#xff1a; 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后&#xff0c;使用 passwd 命令来修改密码&#xff1a; passwd 系统会提…...

GIS与相关专业软件汇总

闲来无事突然想整理一下看看 GIS及相关领域 究竟有多少软件或者工具包等。 我询问了几个AI工具并汇总了一个软件汇总&#xff0c;不搜不知道&#xff0c;一搜吓一跳&#xff0c;搜索出来了大量的软件&#xff0c;大部分软件或者工具包都没有见过&#xff0c;不知大家还有没有要…...

云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持

一.LNMP架构部署 1.1. LNMP服务搭建 1.磁盘信息 2.内存 3.负载信息 4.Nginx你们公司都用来干嘛 5.文件句柄(文件描述符 打开文件最大数量) 6.你处理过系统中的漏洞吗 SSH漏洞 7.你写过什么shell脚本 8.监控通过什么告警 zabbix 具体监控哪些内容 9.mysql redis查询 你好H…...

mamba论文学习

rnn 1986 训练速度慢 testing很快 但是很快就忘了 lstm 1997 训练速度慢 testing很快 但是也会忘&#xff08;序列很长的时候&#xff09; GRU实在lstm的基础上改进&#xff0c;改变了一些门 transformer2017 训练很快&#xff0c;testing慢些&#xff0c;时间复杂度高&am…...

uva 1354 Mobile Computing

原题&#xff1a; 房间中有一个天平&#xff0c;房间的宽度为r&#xff0c;有s个砝码&#xff0c;每个砝码的重量是 w i w_i wi​。设计一个尽量宽&#xff0c;但是宽度不能超过r的天平&#xff0c;挂住所有砝码。天平全部由长度为1的木棍组成&#xff0c;木棍的每一端要么挂一…...

理解C++中的右值引用

右值引用&#xff0c;顾名思义&#xff0c;就是对一个右值进行引用&#xff0c;或者说给右值一个别名。右值引用的规则和左值一用一模一样&#xff0c;都是对一个值或者对象起个别名。 1. 右值引用和左值引用一样&#xff0c;在定义的同时必须立即赋值&#xff0c;如果不立即赋…...

约数个数(简单)

给定 nn 个正整数 aiai&#xff0c;请你输出这些数的乘积的约数个数&#xff0c;答案对 10971097 取模。 输入格式 第一行包含整数 nn。 接下来 nn 行&#xff0c;每行包含一个整数 aiai。 输出格式 输出一个整数&#xff0c;表示所给正整数的乘积的约数个数&#xff0c;答…...

Day33:字符串的切片

在 Python 中&#xff0c;**切片&#xff08;Slicing&#xff09;**是对字符串&#xff08;以及其他序列类型&#xff0c;如列表、元组等&#xff09;进行提取部分内容的强大工具。通过切片&#xff0c;你可以非常方便地提取字符串的子字符串、倒序字符串&#xff0c;甚至进行步…...

基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真。选择回归法进行最大功率点的追踪&#xff0c;使用光强和温度作为影响因素&#xff0c;电压作为输出进行建模。…...

redis离线安装部署详解(包括一键启动)

像上文一样 因为在学习的过程中没有查到一个详细的离线部署方案 所以在自己学习之后想要自己写一个文章 希望可以帮助后续学习redis离线部署的朋友少走一线弯路 首先就是下载安装包 可以自己在本地下载再传到机器上&#xff08;通过xftp或lrzsz都可&#xff09; http://d…...

Coze插件开发之基于已有服务创建并上架到扣子商店

Coze插件开发之基于已有服务创建并上架到扣子商店 在应用开发中&#xff0c;需要调用各种插件&#xff0c;以快速进行开发。但有时需要调用的插件在扣子商店里没有&#xff0c;那怎么办呢&#xff1f; 今天就来带大家快速基于已有服务创建一个新的插件 简单来讲&#xff0c;就是…...

【Unity】 HTFramework框架(五十九)快速开发编辑器工具(Assembly Viewer + ILSpy)

更新日期&#xff1a;2025年1月23日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析A…...

【Linux】统计文本中每行指定位置出现的字符串的次数

统计文本中每行指定位置出现的字符串的次数 假定情景 某些项目&#xff0c;会把某个特定事件记录到Log中并且落盘&#xff08;保持到硬盘&#xff09;。基于落盘后的日志&#xff0c;要统计这些日志里产生该特定事件的次数 统计脚本 可以写一个sh脚本&#xff0c;来解析某个…...

牛客周赛round78 B,C

B.一起做很甜的梦 题意&#xff1a;就是输出n个数&#xff08;1-n&#xff09;&#xff0c;使输出的序列中任意选连续的小序列&#xff08;小序列长度>2&&<n-1&#xff09;不符合排列&#xff08;例如如果所选长度为2&#xff0c;在所有长度为2 的小序列里不能出…...

【DB】Oracle存储过程

目录 什么是存储过程&#xff1f; 为什么要使用存储过程&#xff1f; 创建存储过程 无参存储过程语法&#xff1a; 带参存储过程语法&#xff1a; 带有输入参数的存储过程 带有输出参数的存储过程 带有输入输出参数的存储过程 带有异常处理的存储过程 存储过程中游标…...

亚博microros小车-原生ubuntu支持系列:14雷达跟踪与雷达守卫

背景知识 激光雷达的数据格式参见&#xff1a; 亚博microros小车-原生ubuntu支持系列&#xff1a;13 激光雷达避障-CSDN博客 本节体验雷达跟踪跟守卫 PID控制 从百度百科摘一段介绍 比例积分微分控制&#xff08;proportional-integral-derivative control&#xff09;&am…...

c++迷宫问题(migong)

今天的题目叫“迷宫问题(migong&#xff09;”&#xff0c;是“DFS深度优先搜索 递归”一类的。 题目描述 设有一个N*N(2<N<10)方格的迷宫&#xff0c;入口和出口分别在左上角和右上角。迷宫格子中 分别放0和1&#xff0c;0表示可通&#xff0c;1表示不能&#xff0c;入…...

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…...

Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]

大会官网&#xff1a;www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包&#xff0c;提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件&#xff0c;包括其作用、使用方法以及示例代码&#xff0c;帮助你快速掌握 Swing 的核心知识。 一…...

深圳大学-智能网络与计算-实验三:网络容量优化分析实验

实验目的与要求 了解什么是凸优化问题&#xff1b;学会使用 Matlab CVX 工具箱解决最优功率分配问题&#xff0c;使得信道容量最大化&#xff1b;了解注水算法&#xff1b; 方法&#xff0c;步骤 深入理解最优功率分配问题。使用 CVX 找出最优的功率分配。使用凸优化数学分析…...

嵌入式基础 -- PCIe 控制器中断管理之MSI与MSI-X简介

PCIe 控制器中断管理技术文档 1. 背景 在现代计算机系统中&#xff0c;中断是设备与 CPU 通信的重要机制&#xff0c;PCIe 控制器提供了从传统线中断到基于消息的中断&#xff08;MSI/MSI-X&#xff09;的演进&#xff0c;以提升中断处理效率和可扩展性。x86 和 ARM 架构虽然…...

Android-okhttp详解

目录 一&#xff0c;介绍 二&#xff0c;简单使用 三&#xff0c;流程分析 四&#xff0c;分发器 五&#xff0c;拦截器 5.1 重试及重定向拦截器 5.1.1 重试 5.1.2 重定向 5.2 桥接拦截器 5.3 缓存拦截器 5.4 连接拦截器 5.5 请求服务器拦截器 一&#xff0c;介绍 OkHttp是当下…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

数字图像处理:实验七

uu们&#xff01;这是我们目前数字图像系列的最后一张&#xff0c;之后有关人工智能结合的数字图像处理咸鱼哥正在学习和创作中&#xff0c;所以还请大家给咸鱼哥点时间&#xff0c;同时也提前预祝大家2025年新春快乐&#xff01;&#xff08;咸鱼哥真诚的祝愿每一个人&#xf…...

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…...

QWindow类使用介绍与代码演示

深入浅出C++ Qt开发技术专栏 https://blog.csdn.net/yao_hou/category_9276099.html?spm=1001.2014.3001.5482 文章目录 QWindow主要功能和特性常用的函数示例代码适用场景QWindow父类QSurface`QSurface` 类概述主要功能和特性常用的函数相关的子类示例代码`QSurface` 的实际应…...

OpenCV图像显示imshow()函数——详解

OpenCV图像显示imshow()函数——详解 本文目录&#xff1a; 零、时光宝盒 一、OpenCV 图像显示使用imshow()函数语法 二、imshow()显示图片时发生图片显示不全的解决方法 解决办法&#xff08;1&#xff09; 解决办法&#xff08;2&#xff09; 总结 三、imshow()图像显…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构&#xff0c;允许一个容器数据库&#xff08;Container Database, CDB&#xff09;托管多个独立的可插拔数据库&#xff08;Pluggable Database, PDB&#xff09;。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

二次封装的方法

二次封装 我们开发中经常需要封装一些第三方组件&#xff0c;那么父组件应该怎么传值&#xff0c;怎么调用封装好的组件原有的属性、插槽、方法&#xff0c;一个个调用虽然可行&#xff0c;但十分麻烦&#xff0c;我们一起来看更简便的方法。 二次封装组件&#xff0c;属性怎…...

【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证

引言 前面已经对BQ3568HM开发板进行了初步测试&#xff0c;后面我要实现MQTT的工作&#xff0c;但是遇到一个问题&#xff0c;就是开发板无法通过校园网的认证操作。未认证的话会&#xff0c;学校使用的深澜软件系统会屏蔽所有除了认证用的流量。好在我们学校使用的认证系统和…...

安装Ubuntu22.04

1.引用教程 如何安装Ubuntu Server 22.04 LTS_ubuntu22.04 server-CSDN博客 2.空间分配 要使用 docker 比较多所以分别的 docker 空间大...

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中&#xff0c;Charles 不仅可以实现简单的网络抓包操作&#xff0c;还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节&#xff0c;为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…...

浅拷贝(Shallow Copy)和深拷贝(Deep Copy)

浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是对象复制的两种方式&#xff0c;它们在处理对象内部引用类型成员时有不同的行为。下面我将详细解释这两种拷贝的区别&#xff0c;并提供具体的 Java 示例代码。 浅拷贝&#xff08;Shal…...