ceph 集群搭建

文章目录

ceph介绍

Ceph 是一个开源的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能。 Ceph 消除了对系统单一中心节点的依赖,实现了无中心结构的设计思想。

ceph特点

高性能

摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
能够支持上千个存储节点的规模,支持 PB 甚至 EB 级的数据。

高可扩展性

副本数可以灵活控制。
支持故障域分隔,数据强一致性。
多种故障场景自动进行修复自愈。
没有单点故障,自动管理。

特性丰富

支持三种存储接口:块存储、文件存储、对象存储。
支持自定义接口,支持多种语言驱动。

ceph架构图

Ceph 的架构哲学:

  1. 每个组件必须是可扩展的。
  2. 不存在单点故障。
  3. 解决方案必须是基于软件的、开源的、适应力强的。
  4. 可以运行在常规的硬件上。
  5. 任何组件都是必须自我管理。

下面是 Ceph 的整体架构图:

RADOS

RADOS 全称 Reliable Autonomic Distributed Object Store,是Ceph底层核心,提供了一个可靠、自动、智能的分布式存储。 RADOS 本身就是一个完整的对象存储系统 ,实际上所有存储在Ceph中的用户数据都是由这一层来存储的。 Ceph 的高可高、高扩展、高性能、自动化等特性实际上也是这一层来提供的。 RADOS 在物理上由大量存储设备节点组成,每个节点拥有自己的CPU、内存、磁盘、网络等硬件资源,并运行着自己的操作系统和文件系统。 在逻辑上 RADOS 由少量 MON 和大规模 OSD 组成。

MON

即 Monitor, 是Ceph集群的监控器,负责维护整个集群的健康状态,提供一致性决策。

Object

Ceph 最底层的存储单元是 Object 对象, 大小一般默认为 4MB ,你也可以在创建块设备或者pool的时候根据需求设置自定义大小。 Ceph OSD 在扁平的命名空间内把所有数据存储为对象(也就是没有目录层次)。

对象的结构:

  1. 对象标志(ID):唯一标识一个对象。
  2. 对象的数据:其在本地文件系统中对应一个文件,对象的数据就保存在文件中。
  3. 对象的元数据:以Key-Value(键值对)的形式,可以保存在文件对应的扩展属性中。

Note: 一个对象 ID 不止在本地唯一 ,它在整个集群内都是唯一的。

OSD(Object Storage Device)

对象存储设备,主要功能是存储数据、处理数据的复制、回复、平衡数据分布。 一个Ceph存储集群至少需要两个 OSD 以达到active+clean的健康状态、并默认为数据保存两份副本。 Ceph 集群节点上的每个磁盘、分区都可以成为一个OSD。

关系说明:

  1. 一个OSD上可以分布多个 PG
  2. OSD设备是存储 Object 的载体

PG (placement group)

PG 是 OSD之上的一层逻辑,可视其为一个逻辑概念。Ceph 把对象映射到 PG 中。 从名字可理解 PG 是一个放置策略组,很多个对象一起组团,然后再存入 OSD 中,用来方便定位和追踪对象。 因为一个拥有数百万对象的系统,不可能在对象这一级追踪位置。

可以把 PG 看做一个对象集合,该集合里的所有对象都具有相同的放置策略:对象的副本都分布在相同的 OSD 列表上。

PG 减少了各对象存入对应 OSD 时的元数据数量,更多的 PG 使得均衡更好。

关系说明:

  1. PG有主从之分,对于多副本而言,一个PG的主从副本分布在不同的OSD上;
  2. 一个对象只能属于一个PG,一个PG包含很多个对象
  3. 一个PG对应于一个OSD列表,PG的所有对象对存放在对应的OSD列表上

Pool

Pool 是一个抽象的存储池,它是 PG 之上的一层逻辑。所有的对象都必须存在存储池中。 存储池管理着归置组数量、副本数量、和存储池规则集。要往存储池里存数据,用户必须通过认证、且权限合适,存储池可做快照。

你可以这样粗略的理解:如果把整个 Ceph 存储系统看做是一个数据库的话,那么Pool的角色可以看做是数据表。用户可能需要根据不同的 需求把对象存储在不同的存储池中。

关系说明:

  1. 一个 Pool 由多个 PG 构成,一个 PG 只能属于一个 Pool。
  2. 同一个 Pool 中的 PG 具有相同的类型,比如,如 Pool 为副本类型,则 Pool 中所有的 PG 都是多副本的。

PGP (Placement Group for Placemen)

PG 的归置组:

  1. PGP 起到对 PG 进行归置的作用;
  2. PGP的取值应该与PG相同,在PG的值增大的同时,也要增大PGP的值以保持二者的值相同;
  3. 当一个 Pool 的 PG 增大后,Ceph 并不会开始进行rebalancing,只有在 PGP 的值增大后, PG才会开始迁移至其他的OSD上,并且开始rebalancing

MDS

全称 MetaData Server,保存Ceph 文件系统的元数据,为基于POSIX文件系统的用户提供了一些基础命令如ls等。 如果需要使用 CephFS, 则必须启动 MDS 服务。 整个 CephFS 的元数据都是实时同步的,所以能否很方便的实现 CephFS 的共享挂载,弥补了Ceph 的块设备接口在共享性方面的不足。

Librados

Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。

CRUSH

CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。 CRUSH 算法通过计算数据存储位置来确定如何存储和检索。 CRUSH 授权 Ceph 客户端直接连接 OSD ,而非通过一个中央服务器或经纪人。 数据存储、检索算法的使用,使 Ceph 避免了单点故障、性能瓶颈、和伸缩的物理限制。

RBD

通过 Linux 内核客户端或QEMU/KVM驱动提供一个完全的分布式块设备。

RBD 镜像是基于存储池构建的逻辑存储系统,RBD 镜像通过librbd及RADOS映射到对象(rados对象),然后利用Crush计算来定位在存储设备中的位置。

RGW

基于HTTP REST协议的网关,兼容Amazon S3 API和OpenStack Swift API。

Ceph FS

通过 Linux 内核客户端或FUSE提供一个兼容POSIX的文件系统。

ceph 文件系统是基于元数据存储池和数据存储池构建的逻辑系统, 文件系统中的文件会通过 libcephfs 及 RADOS 映射到对象(rados对象),然后利用 Crush 计算来定位在存储设备中的位置。

ceph与传统存储对比

存储结构特点建设成本、使用维护、应用场景,性能
DAS 磁盘利用率,性能低,延迟率低,不易扩展 适合性能要求不高,容量低的场景
维护简单
性能低
成本最低
SAN 具有高带宽,低延时的优势
价格较高,且可扩展性差
适合性能要求高和延时低的场景。
不适合存储规模不断扩大的场景,例如公有云,私有云以及大数据应用。
维护最复杂,成本最高。
NAS 文件级存储,带宽最低,延时最大 适合对带宽要求不高,延时高的场景,比如部门级文件共享
维护简单,成本较低。
Ceph 带宽高,延时位于 DAS 和 SAN 之间 适用于对延时要求不是特别高的场景
适用于云环境以及大数据场景
维护成本较低
成本高于 DAS 低于 SAN,IOPS 随着存储容量线性增长。

Ceph io流程及数据分布

首先看下 Ceph 整体架构图简图:

默认每个主 OSD 都携带两个副本。有效存储比例为 3:1 。 在写入的时候也是先写入到主分区(Primary OSD),然后在自动同步到副本(Replicate OSD)。

1.正常IO流程图

写入数据步骤

1、client 创建cluster handler。
2、client 读取配置文件。
3、client 连接上monitor,获取集群map信息。
4、client 读写io 根据 crshmap 算法请求对应的主 OSD 数据节点。
5、主 osd 数据节点同时写入另外两个副本节点数据。
6、等待主节点以及另外两个副本节点写完数据状态。
7、主节点及副本节点写入状态都成功后,返回给client,io写入完成。

如果是读取数据的话,步骤 4 直接读取数据返回。后面的步骤都不执行了。

2. 新 Primary IO 流程图

如果新加入的 OSD1 取代了原有的 OSD4 成为 Primary OSD, 由于 OSD1 上未创建 PG , 不存在数据,那么 PG 上的 I/O 无法进行, 如下图所示:

此时的步骤如下:

1、client连接monitor获取集群map信息。
2、同时新主osd1由于没有pg数据会主动上报monitor告知让 OSD2 临时接替为主节点。
3、临时主 OSD2 会把数据全量同步给新主节点 OSD1。
4、client IO读写直接连接临时主 OSD2 进行读写。
5、OSD2 收到读写io,同时写入另外两副本节点。
6、等待 OSD2 以及另外两副本写入成功。
7、OSD2 三份数据都写入成功返回给client, 此时client io读写完毕。
8、如果 OSD1 数据同步完毕,此时 OSD1 会正式替换 OSD2 成为主节点,OSD2 变为副本。

3. Ceph IO 算法流程

  1. 计算File -> Object映射(假设 File 为用户要读写的文件)得到 oid(object id)[oid = ino + ono]
    • ino : File 的元数据序列号,File的唯一id。
    • ono : File 切分产生的某个 object 的序号,默认以4M切分一个块大小。
  2. Object 是 RADOS需要的对象。Ceph指定一个静态hash函数计算oid的值,将oid映射成一个近似均匀分布的伪随机值, 然后和mask按位相与,得到pgid。Object -> PG映射:
    • hash(oid) & mask-> pgid 。
    • mask = PG总数m(m为2的整数幂)-1 。
  3. PG 用途是对object的存储进行组织和位置映射。一个 PG 里面会有很多 Object。采用CRUSH算法,将pgid代入其中, 然后得到一组OSD。PG -> OSD映射:[CRUSH(pgid)->(osd1,osd2,osd3)]

Ceph IO伪代码流程:

locator = object_name
obj_hash =  hash(locator)
pg = obj_hash % num_pg
osds_for_pg = crush(pg)  # returns a list of osds
primary = osds_for_pg[0]
replicas = osds_for_pg[1:]

Ceph RBD IO流程

 

步骤:

1、客户端创建一个pool,需要为这个pool指定pg的数量。
2、创建pool/image rbd设备进行挂载。
3、用户写入的数据进行切块,每个块的大小默认为4M,并且每个块都有一个名字,名字就是object+序号。
4、将每个object通过pg进行副本位置的分配。
5、pg根据cursh算法会寻找3个osd,把这个object分别保存在这三个osd上。
6、osd上实际是把底层的disk进行了格式化操作,一般部署工具会将它格式化为xfs文件系统。
7、bject的存储就变成了存储一个文rbd0.object1.file。

Ceph RBD IO框架图

客户端写数据osd过程:

  1. 采用的是librbd的形式,使用librbd创建一个块设备,向这个块设备中写入数据。
  2. 在客户端本地同过调用librados接口,然后经过pool,rbd,object、pg进行层层映射,在PG这一层中, 可以知道数据保存在哪3个OSD上,这3个OSD分为主从的关系。
  3. 客户端与primay OSD 建立socket 通信,将要写入的数据传给primary OSD,由primary OSD再将数据发送给其他replica OSD数据节点。

Ceph Pool 和 PG 分布情况

  1. pool是ceph存储数据时的逻辑分区,它起到 namespace 的作用。
  2. Ceph 集群搭建成之后,会有一个默认的 RBD pool。
  3. 每个pool包含一定数量(可配置)的PG。
  4. PG里的对象被映射到不同的Object上。
  5. pool 是分布到整个集群的,RBD pool 和 CephFS 的 pool 并没有隔离。
  6. pool可以做故障隔离域,根据不同的用户场景不一进行隔离。

Ceph 数据扩容 PG 分布

场景模拟:现状3个OSD, 4个PG, 扩容到4个OSD, 4个PG

扩容前:

扩容后:

扩容后,`PGa1`,`PGb2`和`PGc3` 迁移到了 OSD4 上了。
每个OSD上分布很多PG, 并且每个PG会自动散落在不同的OSD上。
如果扩容那么相应的PG会进行迁移到新的OSD上,保证PG数量的均衡。

搭建Ceph存储集群

部署环境

名称IP系统备注
ceph-admin 192.168.159.10 ubuntu-20.04 ceph-deploy Montior
ceph-node1 192.168.159.11 ubuntu-20.04 Montior osd mds
ceph-node2 192.168.159.12 ubuntu-20.04 Montior osd mds
ceph-node3 192.168.159.13 ubuntu-20.04 Montior osd mds
ceph-client 192.168.159.14 ubuntu-20.04 Montior osd mds

ceph集群规划

修改主机名称

hostnamectl set-hostname ceph-admin
hostnamectl set-hostname ceph-node1
hostnamectl set-hostname ceph-node2
hostnamectl set-hostname ceph-node3
hostnamectl set-hostname ceph-client

更改ubuntu源

deb http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ focal-backports main restricted universe multiverse

注:这里采用163源,也可以采用阿里云源:如:http://mirrors.aliyun.com/ubuntu,替换方式vim快捷键Shift +:号-Shift +% 然后输入%s#http://mirrors.163.com/ubuntu#http://mirrors.aliyun.com/ubuntu#g回车键后保存即可。

apt update

关闭swap交换分区

sed -r -i.bak 's$(/swap.img.*)$#\1$g' /etc/fstab

注意:采用后向引用并且保存原配置文件生成新配置文件

编辑所有机器 hosts 文件,vim /etc/hosts,添加以下 host 配置:

cat >>/etc/hosts<<EOF
10.108.160.3   ceph-admin
10.108.166.191 ceph-node1
10.108.166.192 ceph-node2
10.108.166.193 ceph-node3
10.108.166.194 ceph-client
EOF

设置文件描述符

cat >>/etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 65536
EOF

设置同步时间(所有节点):

apt install ntpdate
ntpdate ntp1.aliyun.com

所有节点都要执行,确保时间同步(这一点非常重要)

生成SSH密钥对并,并发送至各节点

root@ceph-admin:/etc# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:2bYEgF4iYGifTxZCxc17f4pm9rv16wQw3Bnlh7tLp0k root@ceph-admin
The key's randomart image is:
+---[RSA 3072]----+
|oo..oo+      ... |
|o...oo.+  . . +. |
|. .ooo. o  + o...|
|   o.o . =  o  ..|
|    +   S =  ..  |
|     .   o o ... |
|          o o.E..|
|         = ..oo= |
|        + .+o =+.|
+----[SHA256]-----+

传输到各节点

ssh-copy-id -i /root/.ssh/id_rsa.pub ceph-node1
ssh-copy-id -i /root/.ssh/id_rsa.pub ceph-node2
ssh-copy-id -i /root/.ssh/id_rsa.pub ceph-node3

安装ceph-deploy(admin节点)

根据我们上面的配置,选择 ceph1 节点作为 admin 节点,所以ceph-deploy需要安装在 ceph-admin节点。

首先配置 key

wget -q -O- 'http://mirrors.163.com/ceph/keys/release.asc' | sudo apt-key add -
echo deb http://mirrors.163.com/ceph/debian-octopus/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

注意:上面的 octopus是指你要安装的 ceph 发行版本,我们这里是选择的是 octopus,如果你需要更改其他版本,把octopus替换成其他版本就行了。

安装ceph-deploy工具(为防止报错python3-pip同步安装)

apt install ceph-deploy python3-pip

创建ceph集群遇见以下报错:

问题1 、[ceph_deploy][ERROR ] RuntimeError: AttributeError: module ‘platform&#8217; has no attribute ‘linux_distribution’

解决办法安装python3-pip

apt install python3-pip

然后执行,安装中网络问题无法安装,多尝试几次即可。

方法1:

pip3 install git+https://github.com/ceph/ceph-deploy.git

方法2:

#替换github.com加入地址更换成//github.com.cnpmjs.org即可
pip3 install git+https://github.com.cnpmjs.org/ceph/ceph-deploy.git

创建ceph集群工作目录

mkdir -p /etc/my-cluster

创建一个ceph集群

ceph-deploy new ceph-node1 ceph-node2 ceph-node3

安装ceph

ceph-deploy install --no-adjust-repos ceph-node1 ceph-node2 ceph-node3

注意:–no-adjust-repos参数市直接使用本地源,不使用官方默认源。

部署Monitor集群服务

初始化并部署monitor,收集所有密钥

ceph-deploy mon create-initial

使用ceph-deploy命令将配置文件admin key复制到管理节点和ceph节点,以便每次执行ceph CLI命令无需指定monitor地址和ceph.client.admin.keyring。

ceph-deploy admin ceph-node1 ceph-node2 ceph-node3 

部署osd服务并添加硬盘,创建3个OSD,分别对应每个节点未使用的硬盘:

ceph-deploy osd create --data /dev/sdb ceph-node1
ceph-deploy osd create --data /dev/sdb ceph-node2
ceph-deploy osd create --data /dev/sdb ceph-node3

部署MGR服务

ceph-deploy mgr create ceph-node1 ceph-node2 ceph-node3

注意:MGR是ceph L版本新增加组件,主要作用是分担和扩展monitor的组件部分,减轻monitor的负担。

建议每台monitor节点都部署一个mgr,以实现相同级别的高可用。

设置不安全模式

root@ceph-node2:~# ceph -s
cluster:
id: cf00934c-82b7-41ef-a0d8-0555725b678d
health: HEALTH_WARN
mon is allowing insecure global_id reclaim

解决办法:

ceph config set mon auth_allow_insecure_global_id_reclaim false

CephFS文件系统

部署MDS服务

部署mds(管理节点执行:ceph-admin)

ceph-deploy mds create ceph-node1 ceph-node2 ceph-node3

创建存储池:

ceph osd pool create cephfs_data <pg_num>

创建元数据池:

ceph osd pool create cephfs_metadata <pg_num>

设置副本数:

ceph osd pool set <元数据>  size 1
ceph osd pool set  <数据>  size1

查询副本数:

ceph osd pool get <元数据> size
ceph osd pool get <数据>size

启动cephfs:

ceph fs new <ceph_name> <元数据> <存储池> 

例子:

ceph osd pool create cephfs_data 128       存储池
ceph osd pool create cephfs_metadata 128元数据

说明:根据实际情况设置存储pg_num数量与pgp_num

设置副本数:

ceph osd pool set cephfs_metadata size 1
ceph osd pool set cephfs_data size1

查看副本数:

ceph osd pool get cephfs_metadata size 
ceph osd pool get cephfs_data size

CephFS挂载

客户端挂载 cephfs 有两种方式,kernel driverfuse

  • fuse 客户端最容易与服务器做到代码级的同步,但是内核客户端的性能通常更好。
  • 这两种客户端不一定会提供一样的功能,如 fuse 客户端可支持客户端强制配额,但内核客户端却不支持。
  • 遇到缺陷或性能问题时,最好试试另一个客户端,以甄别此缺陷是否特定于客户端

1.内核挂载

默认ceph是启用cephx认证功能,所以我们需要先导出认证keyring:

root@ceph-admin:/etc/my-cluster# ceph auth export client.admin
export auth(key=AQC0MG1hGePCBRAA6IwoBN48C91e615MjxDs5g==)
[client.admin]
	key = AQC0MG1hGePCBRAA6IwoBN48C91e615MjxDs5g==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

拿到keyring之后直接挂载:

root@ceph-client:~# mount -t ceph 192.168.159.11:6789,192.168.159.12:6789,192.168.159.13:6789:/ /mnt  -o name=admin,secret=AQC0MG1hGePCBRAA6IwoBN48C91e615MjxDs5g==
root@ceph-client:~# df -h
Filesystem                                                     Size  Used Avail Use% Mounted on
udev                                                           936M     0  936M   0% /dev
tmpfs                                                          196M  1.3M  195M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv                               49G  4.3G   42G  10% /
tmpfs                                                          980M     0  980M   0% /dev/shm
tmpfs                                                          5.0M     0  5.0M   0% /run/lock
tmpfs                                                          980M     0  980M   0% /sys/fs/cgroup
/dev/sda2                                                      976M  106M  804M  12% /boot
/dev/loop0                                                      70M   70M     0 100% /snap/lxd/19188
/dev/loop1                                                      32M   32M     0 100% /snap/snapd/10707
/dev/loop2                                                      56M   56M     0 100% /snap/core18/1944
tmpfs                                                          196M     0  196M   0% /run/user/0
192.168.159.11:6789,192.168.159.12:6789,192.168.159.13:6789:/  282G     0  282G   0% /mnt

当然你也可以关闭认证,直接修改/etc/ceph/ceph.conf文件,将cephx改成none

auth_cluster_required = none
auth_service_required = none
auth_client_required = none

这时候就可以直接挂载了:

mount -t ceph 192.168.159.11:6789,192.168.159.12:6789,192.168.159.13:6789:/ /mnt 

这里的192.168.159.10MDS服务运行的节点 IP,这里也可以直接换成 ceph-node1

设置开机自动挂载:

先保存keyring到文件

echo 'AQC0MG1hGePCBRAA6IwoBN48C91e615MjxDs5g==' >/etc/ceph/admin.key

修改/etc/fstab,追加:

192.168.159.11:6789,192.168.159.12:6789,192.168.159.13:6789:/ /mnt ceph name=admin,secretfile=/etc/ceph/admin.key,noatime,_netdev  0  0

注意:设置开机挂载客户端需要安装:ceph-common

fuse挂载

先安装挂载工具

apt install ceph-fuse

拷贝配置文件ceph.conf

root@ceph-admin:/etc/ceph# scp -rp /etc/ceph/ceph.client.admin.keyring 192.168.159.9:/etc/ceph
root@ceph-admin:/etc/ceph# scp -rp /etc/ceph/ceph.conf  192.168.159.9:/etc/ceph

设置开机自动挂载

同样需要将存储节点的 admin 秘钥拷贝到本地,参考上文。

然后修改/etc/fstab文件,加入:

id=admin /mnt  fuse.ceph defaults 0 0

例如:

id=admin /mnt fuse.ceph defaults,_netdev 0 0

安装ceph dashboard

apt install ceph-mgr-dashboard

启用ceph dashboard

ceph mgr module enable dashboard

重启:

 systemctl restart ceph-mgr.target

创建登录密码:

生成配置密码文件
echo 'admin@123' >admin.txt
ceph dashboard set-login-credentials admin -i admin.txt

添加web地址:

ceph config set mgr mgr/dashboard/server_port 8080
ceph config set mgr mgr/dashboard/server_addr 0.0.0.0

禁用SSL

ceph config set mgr mgr/dashboard/ssl false

登录地址查询:

root@ceph-admin:/my-cluster# ceph mgr services
{
    "dashboard": "https://ceph-node1:8080/"
}

注意:ceph-node1换成实际使用IP即可。

文章参考:

此片文章原文如下,做为自己总结使用。感谢以上两篇作者

https://www.r9it.com/20200216/cephfs.html

https://dev.to/jmarhee/solving-module-platform-has-no-attribute-linuxdistribution-for-ceph-deploy-with-python-3-8-3fbl

https://blog.csdn.net/renlixing87/article/details/105698800

posted @ 2023-03-08 11:34  耀阳居士  阅读(678)  评论(0编辑  收藏  举报