Ceph:关于 Ceph 中 BlueStore 架构以及 OSD 创建的一些笔记

news2024/12/24 8:20:01

写在前面


  • 准备考试,整理ceph 相关笔记
  • 内容涉及:Blue Store OSD 存储引擎介绍,对应 OSD 的不同创建方式
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


BlueStore 简介

Ceph 12.2.0(Luminous) 版本开始的。在 Luminous 版本中,BlueStore 被引入作为一种新的、高性能的 OSD 存储引擎,以替代旧的 FileStore 引擎。

在 Ceph 中,BlueStore 可以提供更快的响应时间和更高的数据吞吐量,同时也具有更好的可靠性稳定性。相比之下,旧的 FileStore 存储引擎通常需要更多的 CPU 和内存资源,对 IO 延迟的敏感度也较高。

FileStore 将对象存储为块设备基础上的文件系统(通常是 XFS)中的文件。

BlueStore 将对象直接存储在原始块设备上,免除了对文件系统层的需要,提高了读写操作速度,通过直接操作底层块设备来管理数据,而不是传统的文件系统。

这种方法提供了更好的性能和可靠性,因为可以将数据划分为较小的块并使用校验和来检测错误。此外,BlueStore可以直接与Solid State Drive(SSD)交互,并利用其快速读写速度。

BlueStore还具有可扩展性,可以处理数百万个物理盘和千亿个对象。它实现了动态负载平衡自动恢复机制,以确保高可用性和数据可靠性。

BlueStore 架构

Ceph 集群中存储的对象有下面三部分构成:

  • 集群范围的唯一标识符
  • 二进制对象数据
  • 对象元数据

BlueStore 将 对象 元数据 存储在 块数据库 中,块数据库将元数据作为键值对存储在 RocksDB 数据库中,这是一种高性能的键值存储,块数据库驻留于存储设备上的一个小型 BlueFS 分区,BlueFS 是一种最小的文件系统,设计用于保存 RocksDB 文件,BlueStore 利用预写式日志 (WAL)以原子式将数据写入到块设备。预写式日志执行日志记录功能,并记录所有事务

预写式日志(Write-Ahead-Log,简称 WAL): 是一种常见的数据库和文件系统技术,用于提高数据持久性和可靠性。

WAL 的基本思想是在执行实际的数据更改操作之前,先将数据更改操作写入一个专门的日志文件中,然后再将其应用到存储中。

通过这种方式,WAL 可以确保对数据的操作被记录下来,即使在出现故障或崩溃的情况下也可以进行恢复。

在 Ceph 中,WAL 被广泛应用于 OSD 上的处理操作中。每个 OSD 都有一个特殊的预写式日志设备(WAL device),用于记录 OSD 写入的所有数据更改操作。通过使用 WAL,Ceph 可以在发生故障或崩溃时快速恢复数据,并确保数据的可靠性和一致性。

BlueStore 性能

FileStore 先写入到日志,然后从日志中写入到块设备。

BlueStore 可避免这种双重写入的性能损失,直接将数据写入块设备,同时使用单独的数据流将事务记录到预写式日志。

当工作负载相似 时,BlueStore 的写操作速度约为 FileStore 的 两倍,如果在集群中混用不同的存储设备,您可以自定义BlueStore OSD来提入性能。

创建新的 BlueStore OSD 时,默认为将数据、块数据库和预写式日志都放置到同一个块设备上。从数据中分离块数据库和预写式日志,并将它们放入更快速的 SSD 或 NVMe 设备,或许能提高性能。

在这里插入图片描述

例如,如果对象数据位于 HDD 设备上,可以通过将块数据库放在 SSD 设备上并将预写式日志放到 NVMe 设备上来提高性能

使用服务规范文件定义 BlueStore 数据、块数据库和预写日志设备的 位置。示例如下:

指定 OSD 服务对应的 BlueStore 设备

service_type: osd
service_id: osd_example
placement:
  host_pattern: '*'
data_devices: # 对象数据
  paths:
    - /dev/vda
db_devices:  # 块数据库
  paths: 
    - /dev/nvme0
wal_devices: # 预写日志
  paths: 
    - /dev/nvme1

BlueStore 存储后端提供下列功能:

  • 允许将不同的设备用于数据、块数据库和预写式日志 (WAL)
  • 支持以虚拟方式使用 HDD、SSD 和 NVMe 设备的任意组合
  • 通过提高元数据效率,可以消除对存储设备的双重写入

BlueStore 在用户空间内运行,管理自己的缓存,并且其内存占用比 FileStore 少,BlueStore 使用 RocksDB 存储键值元数据,BlueStore默认是自调优,但如果需要,可以手动调优BlueStore参数

BlueStore 分区写数据的块大小为 bluestore_ min_alloc_size 参数的大小,缺省值为4kib .

  • bluestore_min_alloc_size 参数指定了每个对象分配所需的最小空间量,即使对象实际大小较小也会分配该数量的空间。如果要写入的数据小于该大小,则 BlueStore 将剩余空间用0填充。
  • 设置较小的 bluestore_min_alloc_size 可能会导致过多的碎片和浪费,因为一些较小的对象在分配时仍然需要使用与较大对象相同的空间。但是,如果设置较大的 bluestore_min_alloc_size ,则可能会浪费更多的空间,因为对象可能只使用其中的一部分空间。
  • bluestore_min_alloc_size 参数应根据特定的工作负载和性能需求进行调整。对于需要存储许多小型对象的应用程序,可能需要将此值设置得较小,而对于需要存储大型对象的应用程序,可能需要将此值设置得较大。

BlueStore 数据库分片

BlueStore 可以限制存储在 RocksDB 中的大型 map 对象的大小,并将它们分布到多个列族中,这个过程被称为分片。

使用 sharding(分片) 时,将访问修改频率相近的密钥分组,以提高性能节省磁盘空间。Sharding 可以缓解RocksDB压缩的影响,压缩数据库之前,RocksDB 需要达到一定的已用空间,这会影响 OSD 性能,这些操作与已用空间级别无关,可以更精确地进行压缩,并将对 OSD 性能的影响降到最低

Red Hat建议配置的 RocksDB 空间至少为数据设备大小的 4%

在Red Hat Ceph Storage 5 (ceph version 16)中,默认启用分片,从早期版本迁移过来的集群的 osd 中没有启用分片,从以前版本迁移过来的集群中的osd将不会启用分片

使用 ceph config get 验证一个 OSD 是否启用了 sharding ,并查看当前的定义

[ceph: root@clienta /]# ceph \
 config get osd.1 bluestore_rocksdb_cf
true

为 true 的时候说明默认启用了分片

osd 分片的参数定义

[ceph: root@clienta /]# ceph \
 config get osd.1 bluestore_rocksdb_cfs
m(3) p(3,0-12) O(3,0-13)=block_cache={type=binned_lru} L P

block_cache={type=binned_lru}: 这是 RocksDB 的缓存设置。这里使用了 binned LRU 策略作为块缓存的替换策略。

L: 这是 BlueStore 的 日志设置,表示将日志写入硬盘而不是内存。这对数据持久性非常重要,因为任何未同步的写操作都会在下次启动时丢失。

P: 这是 BlueStore 的 预分配设置。预分配是一种优化技术,可以在写入新对象时事先分配足够的磁盘空间,以减少写入延迟和碎片。此处,“P”表示预分配已启用。

m(3) p(3,0-12) O(3,0-13):在这个映射中

  • m(3) 表示使用 mon0、mon1 和 mon2 作为监视器。
  • p(3,0-12) 表示数据池中有 13 个 PG,它们被分配到了 OSD 0 到 OSD 12 上
  • O(3,0-13) 表示对象池中也有 13 个 PG,它们被分配到了 OSD 0 到 OSD 13 上

数据池(Data Pools):数据池用于存储客户端的数据。例如,如果您想在Ceph中创建一个文件系统或块设备,就必须将其存储在数据池中。数据池通常会经过复制或编码以提高容错性和可靠性。

对象池(Object Pools):对象池用于存储Ceph内部使用的对象,如 PG Map、OSD Map、Mon Map等。这些对象也可以被视为元数据,因为它们包含了关于Ceph集群的配置信息和状态信息。与数据池不同,对象池通常不需要复制或编码,因为它们已经具有容错性和可靠性。

在大多数 Ceph 用例中,默认值会带来良好的性能。生产集群的最佳分片定义取决于几个因素,Red Hat建议使用默认值,除非面临显著的性能问题。

在生产升级的集群中,可能需要权衡在大型环境中为 RocksDB 启用分片所带来的性能优势和维护工作

可以使用 BlueStore 管理工具 ceph-bluestore-tool 重新共享 RocksDB 数据库,而无需重新配置 osd 。要重新共享一个 OSD,需要停止守护进程并使用 --sharding 选项传递新的 sharding 定义。--path 选项表示 OSD 数据 Location,默认为/var/lib/ceph/$fsid/osd.$ID/

[ceph: root@node /]# ceph-bluestore-tool \
 --path <data path> \
 --sharding="m{3) p{3,0-12) 0(3,0-13)= block_cache={type=binned_lru} L P" reshard

提供 BlueStore OSD

作为存储管理员,可以使用 Ceph Orchestrator 服务在集群中添加或删除osd,添加OSD时,需要满足以下条件:

  • 设备不能有分区
  • 设备不能被挂载
  • 设备空间要求5GB以上
  • 设备不能包含 Ceph BlueStore OSD

使用 ceph orch device ls 命令列出集群中主机中的设备

[ceph: root@clienta /]# ceph orch device ls
Hostname                 Path      Type  Serial  Size   Health   Ident  Fault  Available  
clienta.lab.example.com  /dev/vdb  hdd           10.7G  Unknown  N/A    N/A    Yes        
clienta.lab.example.com  /dev/vdc  hdd           10.7G  Unknown  N/A    N/A    Yes        
clienta.lab.example.com  /dev/vdd  hdd           10.7G  Unknown  N/A    N/A    Yes        

Available 列中标签为 Yes 的节点为 OSD 发放的候选节点。如果需要查看已使用的存储设备,请使用 ceph device ls命令

[root@serverc ~]# ceph device ls
DEVICE  HOST:DEV                     DAEMONS                      WEAR  LIFE EXPECTANCY
11906   servere.lab.example.com:vdc  osd.7
14767   servere.lab.example.com:vda  mon.servere
22173   serverc.lab.example.com:vdc  osd.1
23132   serverd.lab.example.com:vda  mon.serverd
2755    serverc.lab.example.com:vdd  osd.2
27887   servere.lab.example.com:vdd  osd.8
29006   serverd.lab.example.com:vdd  osd.5
29020   serverc.lab.example.com:vdb  osd.0
29847   serverc.lab.example.com:vda  mon.serverc.lab.example.com
5089    servere.lab.example.com:vdb  osd.6
9128    serverd.lab.example.com:vdc  osd.4
977     serverd.lab.example.com:vdb  osd.3
[root@serverc ~]#

使用 ceph orch device zap 命令准备设备,该命令 删除所有分区并清除设备中的数据 ,以便将其用于资源配置,使用 --force 选项确保删除上一个OSD可能创建的任何分区

[ceph: root@node /]# ceph orch \
 device zap node /dev/vda --force

BlueStore OSD 配置方法

基于Orchestrator提供

Orchestrator 服务可以发现集群主机之间的可用设备,添加设备,并创建 OSD守护进程。Orchestrator 处理在主机之间平衡的新 osd 的放置,以及处理 BlueStore 设备选择

使用 ceph orch apply osd --all-available-devices 命令提供所有可用的、未使用的设备

[ceph: root@node /]# ceph \
 orch apply osd --all-available-devices

该命令创建一个OSD服务,名为osd.all-available-devices,使 Orchestrator 服务能够管理所有OSD供应。
Orchestrator从集群中的新磁盘设备和使用ceph orch设备zap命令准备的现有设备自动创建osd

若要禁用 Orchestrator 自动供应 osd,请将非托管标志设置为 true

[ceph: root@node /]# ceph \
 orch apply osd --all-available-devices --unmanaged=true

基于指定目标提供

可以使用特定的设备和主机创建OSD进程,使用 ceph orch daemon add 命令创建带有指定主机和存储设备的单个OSD守护进程

[ceph: root@node /]# ceph orch daemon add osd node:/dev/vdb

停止 OSD 进程,使用带OSD ID的 ceph orch daemon stop 命令

[ceph: root@node /]# ceph arch daemon stop osd.12 

使用 ceph orch daemon rm 命令移除OSD守护进程

[ceph: root@node /)# ceph orch daemon rm osd.12

释放一个OSD ID,使用 ceph osd rm 命令

[ceph: root@node /]# ceph osd rm 12

基于服务规范文件提供

使用服务规范文件描述OSD服务的集群布局,可以使用过滤器自定义服务发放,通过过滤器,可以在不知道具体硬件架构的情况下配置OSD服务,这种方法在自动化集群引导和维护窗口时很有用

下面是一个示例服务规范YAML文件,它定义了两个OSD服务,每个服务使用不同的过滤器来放置和BlueStore设备位置

service_type: osd
service_id: osd_size_and_model
placement:
  host_pattern: '*'
data_devices:
  size: '100G:'
db_devices: 
  model: My-Disk 
wal_devices:
  size: '10G:20G' 
unmanaged: true

osd_size_and_model 服务指定任何主机都可以用于放置,并且该服务将由存储管理员管理,数据设备必须有一个100gb或更多的设备,提前写日志必须有一个10 - 20gb的设备。数据库设备必须是My-Disk型号

---
service_type: osd 
service_id: osd_host_and_path 
placement: 
  host_pattern: 'node[6-10]' 
data_devices: 
  paths: 
    - /dev/sdb 
db_devices: 
  paths: 
    - /dev/sdc 
wal_devices: 
  paths: 
    - /dev/sdd 
encrypted: true

osd_host_and_path 服务指定目标主机必须在node6和node10之间的节点上提供,并且服务将由协调器服务管理,数据、数据库和预写日志的设备路径必须 /dev/sdb、 /dev/sdc 和 /dev/sdd,此服务中的设备将被加密

执行ceph orch apply命令应用服务规范

[ceph: root@node /]# ceph orch apply -i service_spec.yaml 

其他OSD实用工具

ceph-volume 命令是将逻辑卷部署为 osd 的模块化工具,它在框架类型中使用了插件,ceph-volume 实用程序支持 lvm 插件和原始物理磁盘,它还可以管理由遗留的 ceph-disk 实用程序提供的设备

[ceph: root@serverc /]# ceph-volume  lvm list


====== osd.0 =======

  [block]       /dev/ceph-096c573c-d9b8-4fd6-acf9-a4a33d1352ae/osd-block-82c98821-3c02-468a-8e2f-7c5dfc2a0fbe

      block device              /dev/ceph-096c573c-d9b8-4fd6-acf9-a4a33d1352ae/osd-block-82c98821-3c02-468a-8e2f-7c5dfc2a0fbe
      block uuid                dL5z54-f0sG-gHjB-4277-EjVW-w80o-x0LKeE
      cephx lockbox secret
      cluster fsid              4c759c0c-d869-11ed-bfcb-52540000fa0c
      cluster name              ceph
      crush device class        None
      encrypted                 0
      osd fsid                  82c98821-3c02-468a-8e2f-7c5dfc2a0fbe
      osd id                    0
      osdspec affinity          None
      type                      block
      vdo                       0
      devices                   /dev/vdb

====== osd.1 =======

  [block]       /dev/ceph-1171e241-a952-4e41-938a-45354c55f27d/osd-block-1ca3352b-4c2d-4a85-86cc-33d1715c1915

      block device              /dev/ceph-1171e241-a952-4e41-938a-45354c55f27d/osd-block-1ca3352b-4c2d-4a85-86cc-33d1715c1915
      block uuid                AzAAag-oKMq-RQl1-7lZO-4ez0-iMsC-F0bDm3
      cephx lockbox secret
      cluster fsid              4c759c0c-d869-11ed-bfcb-52540000fa0c
      cluster name              ceph
      crush device class        None
      encrypted                 0
      osd fsid                  1ca3352b-4c2d-4a85-86cc-33d1715c1915
      osd id                    1
      osdspec affinity          None
      type                      block
      vdo                       0
      devices                   /dev/vdc

....................
[ceph: root@serverc /]#

使用ceph-volume lvm 命令手动创建和删除 BlueStore osd,在块存储设备 /dev/vdc 上创建一个新的BlueStore OSD:

[ceph: root@node /]# ceph-volume \
 lvm create --bluestore --data /dev/vdc 

create 子命令的另一种选择是使用 ceph-volume lvm prepareceph-volume lvm activate 子命令,通过这种方法,osd逐渐引入到集群中,可以控制新的osd何时处于up或in状态,因此可以确保大量数据不会意外地在osd之间重新平衡

子命令用于配置OSD使用的逻辑卷,可以指定逻辑卷或设备名称,如果指定了设备名,则会自动创建一个逻辑卷

[ceph: root@node /]# ceph-volume \
 lvm prepare --bluestore --data /dev/vdc 

activate子命令为OSD启用一个systemd单元,使其在启动时启动,使用activate子命令时,需要从命令ceph-volume lvm list的输出信息中获取OSD的fsid (UUID)。提供唯一标识符可以确保激活正确的OSD,因为OSD id可以重用

[ceph: root@node /]# ceph-volume \
 lvm activate <osd-fsid>

创建OSD后,使用systemctl start ceph-osd@$id命令启动OSD,使其在集群中处于up状态

batch子命令可以同时创建多个osd。

[ceph: root@node /]# ceph-volume \
 lvm batch --bluestore /dev/vdc /dev/vdd /dev/nvme0n1 

inventory子命令用于查询节点上所有物理存储设备的信息

[ceph: root@serverc /]# ceph-volume inventory

Device Path               Size         rotates available Model name
/dev/vde                  10.00 GB     True    True
/dev/vdf                  10.00 GB     True    True
/dev/vda                  10.00 GB     True    False
/dev/vdb                  10.00 GB     True    False
/dev/vdc                  10.00 GB     True    False
/dev/vdd                  10.00 GB     True    False

Demo

# 查看 Ceph 集群健康状态
ceph health 
# 查看 Ceph 集群存储使用情况和空间信息
ceph df
# 查看 OSD 的拓扑结构和状态信息
ceph osd tree 

# 列出 Ceph 集群上的所有设备和它们的状态
ceph device ls 
# 列出可用于添加 OSD 的所有设备
ceph orch device ls | grep server | grep Yes 

# 添加新的 OSD 实例到指定主机上
ceph orch daemon add osd serverc.lab.example.com:/dev/vde
ceph orch daemon add osd serverc.lab.example.com:/dev/vdf 
# 检查新的 OSD 实例是否运行正常
ceph orch ps | egrep 'osd.9|osd.10'
ceph df 
ceph osd tree 

# 将所有可用设备创建为 OSD
ceph orch apply osd --all-available-devices
# 检查 OSD 是否已成功添加
ceph orch ls | grep osd.all-available-devices
ceph osd tree 

# 从指定主机上删除 OSD 实例
ceph orch daemon stop osd.11
ceph orch daemon rm osd.11 --force
ceph osd rm osd.11 
ceph orch osd rm status 
ceph orch device zap servere.lab.example.com /dev/vde --force
# 检查 OSD 是否已成功删除
ceph orch device ls | grep servere.*vde | grep No 
ceph device ls | grep servere.*vde 
ceph orch ps | grep osd.11 

# 使用 YAML 文件管理 OSD 设备
ceph orch ls --service-type osd --format yaml | head -n 10 > all-available-devices.yaml 
echo unmanaged: true >> all-available-devices.yaml
ceph orch apply -i all-available-devices.yaml
# 检查是否已成功添加未管理的设备
ceph orch ls | grep available | grep unmanaged 

# 删除指定主机上的 OSD 实例和相关设备
ceph orch daemon stop osd.15
ceph orch daemon rm osd.15 --force
ceph orch osd rm status 
ceph osd rm osd.15
ceph orch device zap serverd.lab.example.com /dev/vdf --force
# 等待一段时间后检查 OSD 设备状态
sleep 60
ceph orch device ls | grep serverd.*vdf | grep Yes 

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 😃


https://docs.ceph.com/

https://access.redhat.com/documentation/zh-cn/red_hat_ceph_storage/5

https://github.com/ceph/ceph

CL260 授课老师课堂笔记


© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

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

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

相关文章

FreeCAD 3D绘图教程

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D开发工具链 构建现实世界 FreeCAD主要用于为现实世界设计对象。您在FreeCAD中所做的一切都使用现实世界的单位&#xff0c;无论是微米&#xff0c;公里&#xff0c;英寸还是英尺&#xff0c;甚至是单位的任意组合。FreeCAD提供了…

FreeRTOS实时操作系统(十)信号量

系列文章目录 文章目录 系列文章目录信号量二值信号量二值信号量API函数创建二值信号量函数释放二值信号量函数获取二值信号量函数 实验测试 计数型信号量计数型信号量API函数动态创建函数信号量计数值获取函数 实验测试 优先级反翻转实验测试 互斥信号量API函数实验测试 信号量…

深兰科技与韩国EVERYBOT集团签署服务机器人出口订单

7月4日&#xff0c;在深兰科技集团上海总部&#xff0c;韩国EVERYBOT Inc.集团与深兰科技智胜(上海)科技有限公司签署了服务机器人出口订单及韩国市场战略合作协议。根据协议&#xff0c;EVERYBOT将从深兰科技订购首批服务机器人&#xff0c;同时成为深兰科技各类服务机器人产品…

Layui如何给lay-data插入按钮呢?如何通过按钮获取Id值呢?

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;推荐系列&#xff1a;点击进入 &#…

机器学习实战:Python基于NN神经网络进行分类(十一)

文章目录 1 前言1.1 神经网络的介绍1.2 神经网络的应用 2. Tensorflow实战演示2.1 导入函数2.2 导入数据2.3 数据预处理2.4 建立神经网络2.5 训练模型2.6 评估模型2.7 预测 3. 讨论 1 前言 神经网络&#xff08;Neural network&#xff0c;NN&#xff09;机器学习是一种基于人…

【动态规划算法】第五题:62.不同路径

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作…

查看虚拟机主机IP

虚拟机主机ip 文章目录 ifconfigip addr图形化界面 ifconfig 失败了 ip addr 图形化界面

动手学DL——环境部署随笔【深度学习】【Anaconda】【CUDA】【PyTorch】【jupyter】

文章目录 1、环境部署1.1、安装 Anaconda1.2、安装 GPU版 PyTorch1.3、安装结束1.4、 jupyter 连接虚拟环境 1、环境部署 记录虚拟环境安装部署细节&#xff0c;以备重装。 1.1、安装 Anaconda anaconda 2022.10 windows 版本,https://repo.anaconda.com/archive/ 加入环境变量…

如何在 Django框架下完成 websocket 连接 在 Heroku 上部署 websocket 应用

文章目录 websocket 和 socket 连接的区别与 Django 建立 websocket 连接ASGI v.s. WSGIDjango > 3.0ChannelsDaphnesettings.pyconsumers.py & routing.py 测试 websocket 连接postman Heroku 部署 websocket 应用asgi.pyProcfile websocket 和 socket 连接的区别 Webs…

TLS、SSL、CA 证书、公钥、私钥

1. HTTP 的问题 HTTP 协议是超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff09;的缩写&#xff0c;它是从 WEB 服务器传输超文本标记语言 HTML 到本地浏览器的传送协议。HTTP 设计之初是为了提供一种发布和接收 HTML 页面的方法&#xff0c;时至今日&#x…

计算机组成原理(期末或考研备考)- 主存储器,DRAM,SRAM,ROM

讲解视频 SRAM VS DRAM DRAM工作原理 DRAM采用栅极电容上的电荷存储信息&#xff0c;由于DRAM上的电容电荷一般只能维持1-2ms&#xff0c;即使电源不断电&#xff0c;信息也会自动消失。因此每隔一定时间必须刷新。 集中刷新&#xff0c;利用固定的时间对所有的行进行刷新&am…

程序员和网络安全的优劣势一览表

程序员的优点&#xff1a; 学的都是计算机基础和一些程序语言&#xff0c;入门比较简单&#xff0c;无论什么行业参加几个月的培训找到一份月薪5K的工作还是没有问题的&#xff0c;人才的需求量虽然没有之前多&#xff0c;但是对真正有技术的人才需求还是挺大的。 程序员的缺…

Python_魔法属性和方法

目录 魔法属性 __doc__ __moudle__ __class__ __name__ __dict__ 魔法方法 __new__() __init__ () __del__() __call__() __str__ () __getitem__()&#xff0c;__setitem__(),__delitem__() __setattr__()、__getattr__&#xff08;&#xff09; __iter__() …

构建LLM应用你所要知道的事情;Midjourney可以生成图片外的场景

&#x1f989; AI新闻 &#x1f680; AI作画工具Midjourney推出新功能"Pan"&#xff0c;可以生成图片外的场景 摘要&#xff1a;AI作画工具Midjourney最近推出了"pan"功能&#xff0c;用户可以通过控制输入框中的"上下左右"来平移图片以生成场…

【案例】VR全景图:效果+源码

狠人话不多说,直接放视频效果地址 一、效果 1.视频效果 视频效果地址:点击这里 2.图片效果 二、构思 该怎么实现?页面如何布局页面是否可随意控制显示1.功能 控制页面显示数量可放大控制全景图+自动播放左右按钮控制上一页或下一页(尾页:下一页按钮隐藏,首页:上一页按…

Spring Boot 中的熔断器:原理和使用

Spring Boot 中的熔断器&#xff1a;原理和使用 什么是熔断器&#xff1f; 熔断器是一种用于处理分布式系统中故障的设计模式。它可以防止出现故障的服务对整个系统造成连锁反应。熔断器通过监控故障服务的调用情况&#xff0c;当故障服务出现问题时&#xff0c;熔断器会迅速…

【vue】Vue3中使用函数调用组件内函数和创建组件【超详细】

uniappuview vue3typescript版本&#xff0c;使用函数方式调用和创建组件&#xff0c;并使用组件内的方法 项目场景 今天突然觉得在视图上应用组件&#xff0c;然后在script脚本里操作组件这方式特别的麻烦。因为每次使用组件时都要进行应用&#xff0c;不管你用不用你都要引…

TDengine“露面”中国油气田企业智慧油田技术交流大会,为时序数据处理带来全新思路

2023 年 7 月 4 日- 6 日&#xff0c;由中国石油和化学工业联合会主办&#xff0c;中国石油油气和新能源分公司、中国石化油田勘探开发事业部、中国海洋石油有限公司勘探开发部协办的“中国油气田企业智慧油田技术交流大会”在北京市召开。本次大会邀请了中国石油、中国石化、中…

Android Studio实现内容丰富的安卓房屋出租租赁平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号063 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看租房列表…

SSMP整合案例(12) 在界面中实现删除操作

接下来我们来说删除 首先 我们要在表格上加上删除和修改两个操作按钮 我们先在App.vue页面部分编写 参考代码如下 <el-table-columnalign"right"label"操作" ><template slot-scope"scope"><el-buttonsize"mini"type…