文章目录
- **ceph分布式存储**
-
- [**第** **1** **章** **Ceph** **分布式存储 介绍**](#第 1 章 Ceph 分布式存储 介绍)
-
- **存储中用户角色**
- [**Ceph** **介绍**](#Ceph 介绍)
-
- [**Ceph** **简介**](#Ceph 简介)
- [**Ceph** **技术优势**](#Ceph 技术优势)
- [**Ceph** **使用场景**](#Ceph 使用场景)
- [**Ceph** **历史**](#Ceph 历史)
- [**企业版** **Ceph** **存储**](#企业版 Ceph 存储)
-
- [**Ceph** **存储**](#Ceph 存储)
- [**Ceph** **架构介绍**](#Ceph 架构介绍)
-
- **Ceph集群架构简介**
- **Ceph访问方式简介**
- **Ceph存储后端组件简介**
- **Ceph访问方式-详细**
-
- [**Ceph原生API(librados)**](#Ceph原生API(librados))
- [**Ceph块设备(RBD、librbd)**](#Ceph块设备(RBD、librbd))
- **Ceph对象网关(RADOS网关、librgw)**
- **Ceph文件系统(CephFS、libcephfs)**
- **存储访问方式选择**
- **Ceph后端存储组件-详细**
-
- **Ceph监视器(MON)**
- **Ceph对象存储设备(OSD)**
- **Ceph管理器(MGR)**
- **Ceph元数据服务器(MDS)**
- [**集群映射(Cluster Map)**](#集群映射(Cluster Map))
- [**第** **2** **章** **Ceph** **分布式存储 部署**](#第 2 章 Ceph 分布式存储 部署)
-
- [**Ceph** **集群安装介绍**](#Ceph 集群安装介绍)
-
- [**Ceph** **集群安装方式**](#Ceph 集群安装方式)
- [**Ceph** **集群 最小硬件规格**](#Ceph 集群 最小硬件规格)
- [**Ceph** **服务端口**](#Ceph 服务端口)
- [**Cephadm** **与其他服务交互**](#Cephadm 与其他服务交互)
- [**Cephadm** **管理接口**](#Cephadm 管理接口)
-
- [**Ceph CLI** **接口**](#Ceph CLI 接口)
- [**Ceph Dashboard** **接口**](#Ceph Dashboard 接口)
- [**Ceph** **集群安装过程**](#Ceph 集群安装过程)
-
- [**Ceph** **集群环境说明**](#Ceph 集群环境说明)
- **准备虚拟机模板**
- **准备集群节点**
- [**Ceph** **集群初始化**](#Ceph 集群初始化)
-
- [**Ceph** **初始化**](#Ceph 初始化)
- **输出信息说明**
-
-
- [**Dashboard** **登录信息**](#Dashboard 登录信息)
- **客户端访问方法**
- **启用遥测**
-
- [**访问** **dashboard**](#访问 dashboard)
- **添加节点**
- [**部署** **mon** **和** **mgr**](#部署 mon 和 mgr)
- [**部署** **OSD**](#部署 OSD)
- **验证**
-
- **查看集群中部署的服务**
- **查看集群状态**
- [**查看集群** **osd** **结构**](#查看集群 osd 结构)
- [**Ceph** **集群组件管理**](#Ceph 集群组件管理)
-
- [**ceph orch** **命令**](#ceph orch 命令)
- **禁用服务自动扩展**
- **删除服务**
- **部署服务**
- [**删除** **OSD**](#删除 OSD)
-
- [**确定** **OSD** **和设备关系**](#确定 OSD 和设备关系)
- **使用编排删除**
- **手动删除过程**
- 删除主机
- [第三章 **Ceph** **分布式存储 集群配置**](#第三章 Ceph 分布式存储 集群配置)
-
- **管理集群配置**
-
- [**Ceph** **集群配置概述**](#Ceph 集群配置概述)
- **修改集群配置文件**
- **使用集群配置数据库**
-
- [**ceph config ls**](#ceph config ls)
- [**ceph config help** <key>](#ceph config help <key>)
- [**ceph config dump**](#ceph config dump)
- [**ceph config show t y p e . type. type.id [** <key> **]**](#ceph config show t y p e . type. type.id [ <key> ])
- [**ceph config show-with-defaults t y p e . type. type.id**](#ceph config show-with-defaults t y p e . type. type.id)
- [**ceph config get t y p e . type. type.id [** <key> **]**](#ceph config get t y p e . type. type.id [ <key> ])
- [**ceph config set t y p e . type. type.id** <key> <value>](#ceph config set t y p e . type. type.id <key> <value>)
- [**ceph config rm t y p e . type. type.id [** <key> **]**](#ceph config rm t y p e . type. type.id [ <key> ])
- [**ceph config log** [<num:int>]](#ceph config log [num:int])
- [**ceph config reset** [<num:int>]](#ceph config reset [num:int])
- **集群引导选项**
- **在运行时覆盖配置设置**
-
- [**ceph tell** **命令**](#ceph tell 命令)
- [**ceph daemon** **命令**](#ceph daemon 命令)
- [**Web UI** **更改**](#Web UI 更改)
- [**配置集群监控器** **Monitor**](#配置集群监控器 Monitor)
-
- [**配置** **Ceph** **监控器**](#配置 Ceph 监控器)
- **查看监控器仲裁**
- **分析监控器映射**
- **管理集中配置数据库**
- **集群验证**
- [第四章 **Ceph** **分布式存储 池管理**](#第四章 Ceph 分布式存储 池管理)
-
- [**Ceph** **数据组织结构**](#Ceph 数据组织结构)
-
- **POOL**
- [**Place Group**](#Place Group)
- **映射对象到OSD**
- **客户端访问ceph流程**
-
- [**Ceph** **数据读取流程**](#Ceph 数据读取流程)
- [**Ceph** **数据写入流程**](#Ceph 数据写入流程)
- **数据保护**
- **创建池**
- [**查看 池 状态**](#查看 池 状态)
- [**管理 池**](#管理 池)
- [**管理 池 中对象**](#管理 池 中对象)
- [**管理 池 快照**](#管理 池 快照)
- [**管理 池 快照中对象**](#管理 池 快照中对象)
- [**管理 池 命名空间**](#管理 池 命名空间)
- **重命名池**
- **删除池**
- 查看快照中对象
- 获取快照中对象
- 恢复对象内容为指定快照时内容
ceph分布式存储
第 1 章 Ceph 分布式存储 介绍
存储中用户角色
云存储用户角色
在一个比较大的云存储环境中,可能存在不同职责的存储用户。
存储管理员
存储管理员作为主要角色,执行以下任务:
-
安装、配置和维护 Ceph 存储集群。
-
对基础架构架构师进行有关 Ceph 功能和特性的培训。
-
告知用户有关 Ceph 数据表示和方法的信息,作为他们数据应用程序的选择。
-
提供弹性和恢复,例如复本、备份和灾难恢复方法。
-
通过基础架构即代码实现自动化和集成。
-
提供对数据分析和高级海量数据挖掘的访问。
存储操作员
-
存储操作员协助存储集群的日常操作,通常不如存储管理员经验丰富。
-
存储操作员主要使用 Ceph Dashboard GUI 来查看和响应集群警报和统计信息。
-
存储操作员还负责日常存储管理任务,例如更换故障存储设备。
其他存储相关的角色
其他直接使用 Ceph 的角色包括应用程序开发人员、项目经理和具有数据处理、数据仓库、大数据和类似应用程序需求的服务管理员。存储管理员经常与这些角色进行交流。定义这些关系有助于说明存储管理员职责,并阐明存储管理员范围的任务限制或边界。
-
云操作员,管理组织中的云资源,例如 OpenStack 或 OpenShift 基础设施。存储管理员与云操作员密切合作,维护 Ceph 集群。
-
自动化工程师,负责为常见的重复任务创建剧本。
-
**应用程序开发人员(**DevOps 开发人员),可以是原始代码开发人员、维护人员或其他负责应用程序正确部署和行为的云用户。存储管理员与应用程序开发人员协调以确保存储资源可用、设置配额并保护应用程序存储。
-
服务管理员,管理最终用户服务(不同于操作系统服务)。服务管理员具有与项目经理类似的角色,但针对的是现有的生产服务产品。
-
**部署工程师(**DevOps 工程师) ,在更大的环境中,专职人员与存储管理员和应用程序开发人员一起执行、管理和调整应用程序部署。应用架构师,应用程序架构师可以在 Ceph 基础架构布局与资源可用性、扩展和延迟之间建立关联。这种架构专业知识可帮助存储管理员有效地设计复杂的应用程序部署。为了支持云用户及其应用程序,存储管理员必须了解资源可用性、扩展和延迟的这些相同方面。
-
基础架构架构师,存储管理员必须掌握存储集群的架构布局,才能管理资源位置、容量和延迟。Ceph 集群部署和维护的基础架构架构师是存储管理员的主要信息来源。 基础架构架构师可能是云服务提供商员工或供应商解决方案架构师或顾问。
-
数据中心操作员,是较低 Ceph 存储基础设施层的角色,负责数据供应。数据中心操作员通常受雇于公共云服务提供商或私有数据中心云中组织的内部 IT 团队。
组织中用户角色
由于组织之间的人员配备、技能、安全性和规模不同,因此角色的实施通常不同。 尽管角色有时与个人相匹配,但用户通常会根据他们的工作职责承担多个角色。
-
在电信服务提供商和云服务提供商中,常见的角色是云操作员、存储操作员、基础架构架构师和云服务开发人员,通常只消费存储而不维护它们。
-
在银行、金融等需要安全、私有、专用基础架构的组织中,所有角色都由内部人员配备。 存储管理员、云操作员和基础架构架构师角色充当服务提供商并支持所有其他角色。
-
在大学和较小的实施中,技术支持人员可以承担所有角色。 一个人可能会承担存储管理员、基础架构架构师和云操作员角色。
Ceph 介绍
Ceph 简介
-
Ceph 是一款开源、分布式、软件定义存储 。
-
Ceph 具备极高的可用性、 扩展性和易用性, 用于存储海量数据。
-
Ceph 存储可部署在通用服务器上, 这些服务器的CPU可以是x86架构, 也可以是ARM架构。
-
Ceph 支持在同一集群内既有x86主机,又有ARM 主机。
软件定义 software-defined storage (SDS)
Ceph 技术优势
-
采用 RADOS 系统将所有数据作为对象, 存储在存储池中。
-
去中心化, 客户端可根据CRUSH算法自行计算出对象存储位置, 然后进行数据读写。
-
集群可自动进行扩展、 数据再平衡、 数据恢复等。
Ceph 使用场景

Ceph 历史
-
Ceph是圣克鲁兹加利福尼亚大学的 Sage Weil **在2003年开发的,他的博士学位项目的一部分。**初始的项目原型是大约 40000 行 C++代码的 Ceph 文件系统,于 2006 年遵循 LGPL 协议(Lesser GUN Public License)开源。Ceph没有采用双重许可模式,也就不存在只针对企业版的特性。
-
2003-2007 年是Ceph的研究开发时期。在这期间,它的核心组件逐步形成,并且社区对项目的贡献开始逐渐变大。
-
2007年年末,Ceph已经越来越成熟,并开始等待孵化。
-
2012年4月,Sage Weil 在 DreamHost 的资助下成立了 Inktank 公司,主要目的是提供广泛的Ceph 专业服务和技术支持。
-
2014年4月,Inktank 成为红帽大家庭的一员,Inktank Ceph Enterprise 也变为Ceph 存储。
-
此外,Ceph也与Linux内核、SUSE、OpenStack项目、CloudStack等项目进行了整合。一些公司将Ceph整合为存储设备产品的核心,如富士通的CD10000项目和SANDisk的InfiniFlash。
上游 Ceph 版本
参考链接: https://docs.ceph.com/en/latest/releases/
统计时间:2024-11

自Infernalis起,上游 Ceph 采用了新的版本号编号方案:每一稳定发行版主要版本号递增1。
-
2017年年底之前,上游CEPH项目每年发布两个稳定版本。
-
截止到Luminous版本,上游项目交替发布开发版本和长期稳定(LTS)版本。稳定版本发布后,将停止更新开发版本。红帽的RHCS产品与社区的LTS版本的CEPH生命周期一致。
-
从 Nautilus release (14.2.0)开始,每年 March 1st 发布一个稳定版本。稳定版本周期大概2年。
版本格式 x.y.z 说明:
-
x identifies the release cycle (e.g., 13 for Mimic).
-
y identifies the release type:
-
x.0.z - development releases (for early testers and the brave at heart)
-
x.1.z - release candidates (for test clusters, brave users)
-
x.2.z - stable/bugfix releases (for users)
-
-
z identifies the release number
企业版 Ceph 存储
Ceph 存储
-
Ceph 存储是一个企业级别的、软件定义的、支持数千客户端、存储容量 EB 级别的分布式数据对象存储,提供统一存储(对象、块和文件存储)。
-
**Ceph 存储与 Ceph 项目的关系,类似于RHEL与Fedora关系。**红帽定期将来自上游项目的最新变化整合到企业版、并提供专业支持。红帽对Ceph存储的改进也会以开源形式回馈到上游项目。
-
红帽为企业版Ceph 存储提供36个月支持,比上游支持长1年。
Ceph 架构介绍
Ceph集群架构简介
Ceph存储是一种分布式数据对象存储。这是一种企业级软件定义存储解决方案,可扩展至数以千计数据访问量在艾字节以上的客户端。Ceph旨在提供卓越的性能、可靠性和可扩展性。
Ceph采用模块化分布式架构,包含下列元素:
- 对象存储后端,称为RADOS(可靠的自主分布式对象存储)
- 与RADOS交互的多种访问方式
RADOS是一种自我修复、自我管理、基于软件的对象存储。
Ceph访问方式简介
Ceph提供以下访问Ceph集群的方法:
-
Ceph原生API(librados)
-
Ceph块设备(RBD、librbd),也称为 RADOS块设备(RBD)镜像
-
Ceph对象网关(RADOSGW、librgw)
-
Ceph文件系统(CephFS、libcephfs)
Ceph存储后端组件简介
-
**监控器(MON)**维护集群状态映射。它们可帮助其他守护进程互相协调。
-
**对象存储设备(OSD)**存储数据并处理数据复制、恢复和重新平衡。
-
**管理器(MGR)**通过基于浏览器的仪表板和RESTAPI,跟踪运行时指标并公开集群信息。
-
**元数据服务器(MDS)**存储CephFS使用的元数据(而非对象存储或块存储),以便客户端能够高效运行 POSIX命令。
这些守护进程可以扩展,以满足所部署的存储集群的要求。
下图描述了Ceph集群的四种数据访问方法、支持访问方式的库,以及管理和存储数据的底层Ceph组件。

Ceph访问方式-详细
Ceph原生API(librados)
实施Ceph块设备、Ceph对象网关等其他Ceph接口的基础库为librados。librados库是原生C语言库,可以让应用直接与RADOS协作来访问Ceph集群存储的对象。也有类似的库适用于C++、Java、Python、Ruby、Erlang和 PHP。
为最大化性能,请编写软件以直接与librados配合使用。这种方式可以在改进Ceph环境中存储性能方面达到最佳效果。为了简化对Ceph存储的访问,您可以改为使用所提供的更高级访问方式,如ceph块设备、Ceph对象网关(RADOSGW)和CephFS。
Ceph块设备(RBD、librbd)
Ceph块设备(RADOS块设备或RBD)通过RBD镜像在Ceph集群内提供块存储。Ceph分散在集群不同的OSD中构成RBD镜像的个体对象。由于组成RBD的对象分布到不同的OSD,对块设备的访问自动并行处理。
RBD提供下列功能:
-
Ceph集群中虚拟磁盘的存储
-
Linux内核中的挂载支持
-
QEMU、KVM和 OpenStack Cinder 的启动支持
Ceph对象网关(RADOS网关、librgw)
Ceph对象网关(RADOS网关、RADOSGW或RGW)是使用librados构建的对象存储接口。它使用这个库来与Ceph集群通信,并且直接写入到OSD进程。它通过RESTfulAPI为应用提供了网关,并且支持两种接口:Amazon S3和 OpenStack Swift。
Ceph对象网关提供扩展支持,它不限制部署的网关数量,而且支持标准的HTTP负载均衡器。Ceph对象网关包括以下用例:
-
镜像存储(例如,SmugMug和TumbIr)
-
备份服务
-
文件存储和共享(例如,Dropbox)
Ceph文件系统(CephFS、libcephfs)
Ceph文件系统(CephFS)是一种并行文件系统,提供可扩展的、单层级结构共享磁盘。红帽Ceph存储可为CephFS提供生产环境支持,包括快照支持。
Ceph元数据服务器(MDS)管理与CephFS中存储的文件相关联的元数据,包括文件访问、更改和修改时间戳。
存储访问方式选择
-
为了最大限度地提高性能,请编写用户的应用程序以直接使用 librados 。
-
如果想简化对Ceph存储的访问,也可以使用其他三种访问方式。
Ceph后端存储组件-详细
RADOS(Reliable ,Autonomic ,Distributed Object Store),即可靠的、自主的、分布式的对象存储,是Ceph存储系统的核心。Ceph的所有优秀特性都是由RADOS提供的 ,包括分布式对象存储、高可用性、高可靠性、没有单点故障、自我修复以及自我管理等。Ceph中的一切数据都以对象的形式存储,RADOS负责存储这些对象,而不考虑它们的数据类型。
Ceph监视器(MON)
-
MON 必须就集群的状态达成共识,才能对外提供服务。
- Ceph 集群配置奇数个监视器,以确保监视器在对集群状态进行投票时可以建立法定人数。
- 要使 Ceph 存储集群正常运行和访问,必须有超过一半的已配置监视器正常工作。
-
Ceph Monitor (MON) 是维护集群映射的守护进程。 集群映射是多个映射的集合,包含有关集群状态及其配置的信息。 Ceph 必须处理每个集群事件,更新相应的映射,并将更新后的映射复本到每个 MON 守护进程。
Ceph对象存储设备(OSD)
Ceph 对象存储设备 (OSD) 将存储设备连接到 Ceph 存储集群。 单个存储服务器可以运行多个 OSD 守护进程并为集群提供多个 OSD。
Ceph 客户端和 OSD 守护进程使用可扩展哈希下的受控复制 (CRUSH) 算法来高效地计算有关对象位置的信息,而不是依赖于中央查找表。
CRUSH映射
CRUSH 将每个对象分配给一个放置组(PG),也就是单个哈希存储桶, PG 将对象映射给多个OSD。 PG是对象(应用层)和 OSD(物理层)之间的抽象层。 CRUSH 使用伪随机放置算法将对象分布在 PG 之间,并使用规则来确定 PG 到 OSD 的映射。 如果发生故障,Ceph 会将 PG 重新映射到不同的物理设备
(OSD) 并同步它们的内容以匹配配置的数据保护规则。

主要,次要OSD
与对象关联的多个OSD中,其中一个 OSD 是对象归置组的主 OSD,Ceph 客户端在读取或写入数据时总
是联系主OSD。 其他 OSD 是次要 OSD,在集群发生故障时确保数据的弹性可靠。
主要 OSD 功能:
-
服务所有 I/O 请求
-
复本和保护数据
-
检查数据一致性
-
重新平衡数据
-
恢复数据
次要 OSD 功能:
-
始终在主 OSD 的控制下行动
-
可以变为主 OSD
!WARNING
运行 OSD 的主机不得使用基于内核的客户端挂载 Ceph RBD 映像或 CephFS 文件系统。 由于内存死锁或之前会话上挂起的阻塞 I/O,挂载的资源可能会变得无响应。
**典型的Ceph集群部署方案:为每个物理磁盘创建一个OSD守护进程。**OSD也支持以更灵活的方式部署OSD守护进程,比如每个磁盘、每个主机或者每个RAID卷创建一个OSD守护进程。
**如下图:**Ceph集群包涵3个Monitor,多个OSD服务器。其中一个OSD服务器提供5个OSD,每个OSD守护进程对应一个存储设备。各个存储设备使用文件系统格式化,目前仅支持XFS文件系统。XFS文件系统上默认启用扩展属性,用于存储有关内部对象状态、快照元数据和Ceph RADOS网关ACL的信息。

OSD日志 :每个OSD都有自己的OSD日志,OSD日志与文件系统日志无关,用于提升OSD操作写性能。
**客户端的写请求常常是随机的,OSD进程按顺序将请求写入到日志。**这让主机文件系统有更多的时间来合并写操作,提高写效率,从而提高了性能。在所有OSD日志记录了写请求之后,CEPH集群通知客户端写入完成,然后将OSD日志的内容应用到后端文件系统。应用完成后,回收已经提交的日志请求,以回收日志存储设备上的空间。
-
当OSD或者存储服务器故障:如果日志未应用到文件系统,则根据日志将数据replay到文件系统;如果已经应用到后端文件系统,则根据复本恢复。
-
OSD日志最好配置为独立的、速度快的磁盘上,例如SSD,性能和写效率更好。
Ceph管理器(MGR)
-
Ceph Manager(MGR)负责集群大部分数据统计。
-
**如果集群中没有MGR,不会影响客户端I/O操作。**但是,将不能查询集群统计数据。为避免这种情形,建议为每个集群至少部署两个Ceph Managers,每个Managers运行在独立的失败域中。
-
MGR守护程序提供集中访问从集群收集的所有数据,并为存储管理员提供一个简单的Web 仪表板。 MGR 守护进程还可以将状态信息导出到外部监控服务器,例如 Zabbix。
Ceph元数据服务器(MDS)
-
Ceph 元数据服务器 (MDS) 管理 Ceph 文件系统 (CephFS) 元数据。
-
MDS提供符合 POSIX 的共享文件系统元数据管理,包括所有权、时间戳和模式。
-
MDS 使用 RADOS 存储元数据, 将文件 inode 映射到对象以及 Ceph 在树中存储数据的位置。
-
访问 CephFS 文件系统的客户端首先向 MDS 发送请求,MDS 提供客户端 获取文件内容所需的信息以便从正确的OSD获取文件内容。
集群映射(Cluster Map)
前面我们提到,MON维护集群映射。
Ceph 客户端和 OSD 通过集群映射确定数据存储位置。
五个映射表示集群拓扑,统称为集群映射。Ceph监控器守护进程维护集群映射。CephMON集群在监控器守护进程出现故障时确保高可用性。
集群映射有:
-
监视器映射(Monitor Map) , 包含集群的 fs id; 每个监视器(monitor)的位置、名称、地址和端口; 和地图时间戳。 fsid 是一个唯一的、自动生成的标识符 (UUID),用于标识 Ceph 集群。CephMonitor 守护进程维护集群映射。 使用 ceph mon dump 命令查看监视器图。
-
OSD映射(OSD Map) , 包含集群的 fs id、池列表、复本大小、归置组编号、OSD 列表及其状态以及映射时间戳。 使用 ceph osd dump 命令查看 OSD 映射。
-
放置组映射(Placement Group Map) ,包含 PG 版本; 使用百分比; 每个归置组的详细信息,例如 PG ID、Up Set、Acting Set、PG 的状态、每个池的数据使用统计信息; 和地图时间戳。 使用ceph pg dump 命令查看 PG Map 统计信息。
-
CRUSH映射(CRUSH Map) , 包含存储设备列表、故障域层次结构(例如设备、主机、机架、行、房间)以及在存储数据时遍历层次结构的规则。 使用 ceph osd crush dump 命令查看 cursh Map统计信息。
-
元数据服务器映射(MDS map) ,包含用于存储元数据的池、元数据服务器列表、元数据服务器状态和映射时间戳。 使用 ceph fs dump 命令查看 MDS 映射。
其他 map:
-
Manager map ,包含 Manager 服务器列表、Manager 服务器状态和映射时间戳。 使用 ceph mgr dump 命令查看 MGR 映射。
-
Service map ,包含RGW信息,如果集群中安装了RGW。 使用 ceph service dump 命令查看rgw 统计信息。
第 2 章 Ceph 分布式存储 部署
Ceph 集群安装介绍
Ceph 集群安装方式
官方推荐部署方式:
-
Cephadm:基于容器部署,支持 Octopus 及以后版本,部署完成后可通过命令行和图形界面进行ceph集群的管理。
-
Rook:基于 kubernetes 部署,支持 Nautilus 及以后版本,部署完成后可通过命令行和图形界面进行ceph集群的管理,同时可通过 kubernetes 对组件所在 pod 进行管理。
其他部署方式:
-
ceph-ansible,通过ansible进行ceph部署
-
ceph-deploy,已经不再维护,不建议使用该方式部署
-
DeepSea,通过salt进行ceph部署
-
手动部署
Ceph 集群 最小硬件规格

此处的最小硬件规格指的是在实际生产中的规格,实验手册中的规格会比此表中的规格小。
关于OSD的资源需注意:
-
每增加一个osd服务,就需要增加列出的资源。
-
OSD的CPU资源最少是1核,后续根据带宽和IOPS进行调整,每200-500MB/s增加一核,或者每1000-3000IOPS增加一核。
-
OSD的内存可以选择2G-4G,可以实现基本功能,但是会有卡顿。
Ceph 服务端口

说明:
- 所有端口都是TCP协议。
- 在实验手册中,为了降低安装难度,直接关闭了firewalld及SELinux。
Cephadm 简介
-
Cephadm 是一个ceph全生命周期管理工具, 通过"引导( bootstrapping ) " 可创建一个包含一个MON和一个MGR的单节点集群, 后续可通过自带的编排接口进行集群的扩容、 主机添加、 服务部署。
-
Cephadm 使用容器部署 Ceph,大大降低了部署 Ceph 集群的复杂性和包依赖性。
-
cephadm 软件包安装在集群第一个节点中,该节点充当引导节点。Cephadm 是部署新集群时启动的第一个守护程序,同时也是管理器守护程序 (MGR) 中的一个模块。
Cephadm 与其他服务交互

Cephadm 管理接口
Ceph 使用容器化部署,首先创建一个最小的集群,只有一个主机(引导节点)和两个守护进程(监视器和管理器守护进程)。
Ceph 提供两个管理接口:Ceph CLI 和 Dashboard GUI,用于配置 Ceph 守护进程和服务以及扩展或收缩集群。
cephadm 工具与 Ceph Manager 编排模块交互,Ceph Manager Orchestrator 再与其他组件交互:

Ceph CLI 接口
cephadm shell 命令启动一个容器化版本的 shell,容器中安装了所有必需的 Ceph 包。该命令应该只在引导节点中运行,因为在引导集群时只有该节点可以访问 /etc/ceph 中的管理密钥环。
实际情况,在集群中其他节点也可以执行,例如ceph1。
bash
[root@ceph1 ~ 14:17:39]# cephadm shell
Inferring fsid bc5b5200-ca79-11f0-9e78-000c2974062f
Using recent ceph image quay.io/ceph/ceph@sha256:f15b41add2c01a65229b0db515d2dd57925636ea39678ccc682a49e2e9713d98
[ceph: root@ceph1 /]# exit
exit
还可以通过容器化的 shell 直接运行命令: cephadm shell -- command 。
bash
[root@ceph1 ~ 14:31:39]# cephadm shell -- ceph status
Inferring fsid bc5b5200-ca79-11f0-9e78-000c2974062f
Using recent ceph image quay.io/ceph/ceph@sha256:f15b41add2c01a65229b0db515d2dd57925636ea39678ccc682a49e2e9713d98
cluster:
id: bc5b5200-ca79-11f0-9e78-000c2974062f
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1.dyx.cloud,ceph2,ceph3 (age 19m)
mgr: ceph1.dyx.cloud.ilnlbd(active, since 34m), standbys: ceph2.dvnrax, ceph3.bwnrnx
osd: 9 osds: 9 up (since 15m), 9 in (since 15m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 2.6 GiB used, 177 GiB / 180 GiB avail
pgs: 1 active+clean
为了操作方便,可以直接在物理主机执行ceph命令,需要安装eph-common软件包。
bash
[root@ceph1 ~ 14:10:10]# dnf install -y ceph-common
[root@ceph1 ~ 14:32:47]# ceph status
cluster:
id: bc5b5200-ca79-11f0-9e78-000c2974062f
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1.dyx.cloud,ceph2,ceph3 (age 21m)
mgr: ceph1.dyx.cloud.ilnlbd(active, since 36m), standbys: ceph2.dvnrax, ceph3.bwnrnx
osd: 9 osds: 9 up (since 17m), 9 in (since 17m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 2.6 GiB used, 177 GiB / 180 GiB avail
pgs: 1 active+clean
Ceph Dashboard 接口
Ceph Dashboard GUI 是一个基于 Web 的应用程序,用于监视和管理集群。 Ceph Dashboard GUI 得到了增强,可通过此界面执行许多集群任务,比 Ceph CLI 更直观的方式提供集群信息。
与 Ceph CLI 一样,Dashboard GUI Web 是 ceph-mgr 守护进程的一个模块。 默认情况下,Ceph 在创建集群时将Dashboard GUI部署在引导节点,并使用 TCP 端口 8443。
Ceph Dashboard GUI 提供以下功能:
- 用户和角色管理,用户可以创建具有多个权限和角色的不同用户帐户。
- 单点登录,仪表板 GUI 允许通过外部身份提供者进行身份验证。
- 审计,用户可以将仪表板配置为记录所有 REST API 请求
- 安全,默认情况下,仪表板使用 SSL/TLS 来保护所有 HTTP 连接。
Ceph Dashboard GUI 还实现了集群管理和监控功能:
-
管理功能
-
使用 CRUSH 地图查看集群层次结构
-
启用、编辑和禁用管理器模块
-
创建、删除和管理 OSD
-
管理 iSCSI
-
管理池
-
-
监控功能
-
检查整体集群健康状况
-
查看集群中的主机及其服务
-
查看日志
-
查看集群警报
-
检查集群容量
-
下图显示了仪表板 GUI 的状态屏幕,可以快速查看一些重要的集群参数,例如集群状态、集群中的主机
数量或 OSD 数量。

Ceph 集群安装过程
Ceph 集群环境说明
部署方法:cephadm
操作系统:Centos Stream 8(最小化安装)
硬件配置:2 cpu、4G memory、1个系统盘+3个20G数据盘
本教材共使用4台虚拟机:
-
客户端:client
-
主集群:ceph1、ceph2、ceph3


准备虚拟机模板
基于 CentOS-Stream-8-template 模板克隆出 ceph-template
根据实验硬件要求,更改 ceph-template 硬件配置。

bash
# 1 配置主机名解析
[root@localhost ~ 10:43:19]# cat >> /etc/hosts << EOF
###### ceph ######
192.168.108.10 client.dyx.cloud client
192.168.108.11 ceph1.dyx.cloud ceph1
192.168.108.12 ceph2.dyx.cloud ceph2
192.168.108.13 ceph3.dyx.cloud ceph3
192.168.108.14 ceph4.dyx.cloud ceph4
192.168.108.15 ceph5.dyx.cloud ceph5
192.168.108.16 ceph6.dyx.cloud ceph6
EOF
[root@localhost ~ 10:45:01]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
###### ceph ######
192.168.108.10 client.dyx.cloud client
192.168.108.11 ceph1.dyx.cloud ceph1
192.168.108.12 ceph2.dyx.cloud ceph2
192.168.108.13 ceph3.dyx.cloud ceph3
192.168.108.14 ceph4.dyx.cloud ceph4
192.168.108.15 ceph5.dyx.cloud ceph5
192.168.108.16 ceph6.dyx.cloud ceph6
# 2 关闭 SELinux
[root@localhost ~ 10:45:05]# sed -ri 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
# 3 关闭防火墙
[root@localhost ~ 10:45:19]# systemctl disable firewalld --now
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
# 4 配置yum仓库
[root@localhost ~ 10:45:25]# cat << 'EOF' > /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/storage/x86_64/ceph-pacific
enabled=1
gpgcheck=0
EOF
# 5 安装基础软件包
[root@localhost ~ 10:45:39]# dnf install -y bash-completion vim lrzsz unzip rsync sshpass tar
Ceph 2.2 MB/s | 568 kB 00:00
... ...
Complete!
# 6 配置时间同步
[root@localhost ~ 10:46:25]# dnf install -y chrony
Last metadata expiration check: 0:00:18 ago on Wed 26 Nov 2025 10:46:16 AM CST.
Dependencies resolved.
========================================================================================
Package Architecture Version Repository Size
========================================================================================
Installing:
chrony x86_64 4.5-1.el8 baseos 357 k
Installing weak dependencies:
timedatex x86_64 0.5-3.el8 baseos 32 k
Transaction Summary
========================================================================================
Install 2 Packages
Total download size: 389 k
Installed size: 768 k
Downloading Packages:
(1/2): timedatex-0.5-3.el8.x86_64.rpm 294 kB/s | 32 kB 00:00
(2/2): chrony-4.5-1.el8.x86_64.rpm 2.3 MB/s | 357 kB 00:00
----------------------------------------------------------------------------------------
Total 2.5 MB/s | 389 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : timedatex-0.5-3.el8.x86_64 1/2
Running scriptlet: timedatex-0.5-3.el8.x86_64 1/2
Running scriptlet: chrony-4.5-1.el8.x86_64 2/2
Installing : chrony-4.5-1.el8.x86_64 2/2
Running scriptlet: chrony-4.5-1.el8.x86_64 2/2
Verifying : chrony-4.5-1.el8.x86_64 1/2
Verifying : timedatex-0.5-3.el8.x86_64 2/2
Installed:
chrony-4.5-1.el8.x86_64 timedatex-0.5-3.el8.x86_64
Complete!
#systemctl enable chronyd --now
# 7 安装 cephadm
[root@localhost ~ 10:46:37]# dnf install -y cephadm
Last metadata expiration check: 0:00:37 ago on Wed 26 Nov 2025 10:46:16 AM CST.
Dependencies resolved.
... ...
Complete!
[root@localhost ~ 10:48:15]# cephadm --help
usage: cephadm [-h] [--image IMAGE] [--docker] [--data-dir DATA_DIR]
[--log-dir LOG_DIR] [--logrotate-dir LOGROTATE_DIR]
[--sysctl-dir SYSCTL_DIR] [--unit-dir UNIT_DIR] [--verbose]
[--timeout TIMEOUT] [--retry RETRY] [--env ENV]
[--no-container-init]
{version,pull,inspect-image,ls,list-networks,adopt,rm-daemon,rm-cluster,run,shell,enter,ceph-volume,zap-osds,unit,logs,bootstrap,deploy,check-host,prepare-host,add-repo,rm-repo,install,registry-login,gather-facts,exporter,host-maintenance,disk-rescan}
...
Bootstrap Ceph daemons with systemd and containers.
positional arguments:
{version,pull,inspect-image,ls,list-networks,adopt,rm-daemon,rm-cluster,run,shell,enter,ceph-volume,zap-osds,unit,logs,bootstrap,deploy,check-host,prepare-host,add-repo,rm-repo,install,registry-login,gather-facts,exporter,host-maintenance,disk-rescan}
sub-command
version get ceph version from container
pull pull the default container image
inspect-image inspect local container image
ls list daemon
... ...
# 安装 cephadm 的时候,会自动安装官方推荐的容器引擎 podman
[root@localhost ~ 10:48:26]# rpm -q podman
podman-4.9.4-0.1.module_el8+971+3d3df00d.x86_64
# 8 提前下载镜像
[root@localhost ~ 10:48:33]# podman pull quay.io/ceph/ceph:v16
Trying to pull quay.io/ceph/ceph:v16...
Getting image source signatures
Copying blob 5f3bf99f2b6d done |
Copying blob 6ac36e7c57f2 done |
Copying config 3c4eff6082 done |
Writing manifest to image destination
3c4eff6082ae7530e7eda038765ce400beb1bc1b8df67dffb45910eb45b06b2c
[root@localhost ~ 10:50:35]# podman pull quay.io/ceph/ceph-grafana:8.3.5
Trying to pull quay.io/ceph/ceph-grafana:8.3.5...
Getting image source signatures
Copying blob b29fa70dd594 done |
Copying config dad864ee21 done |
Writing manifest to image destination
dad864ee21e98e69f4029d1e417aa085001566be0d322fbc75bc6f29b0050c01
[root@localhost ~ 10:58:22]# podman pull quay.io/prometheus/node-exporter:v1.3.1
Trying to pull quay.io/prometheus/node-exporter:v1.3.1...
Getting image source signatures
Copying blob b5db1e299295 done |
Copying blob aa2a8d90b84c done |
Copying blob b45d31ee2d7f done |
Copying config 1dbe0e9319 done |
Writing manifest to image destination
1dbe0e931976487e20e5cfb272087e08a9779c88fd5e9617ed7042dd9751ec26
[root@localhost ~ 10:59:30]# podman pull quay.io/prometheus/alertmanager:v0.23.0
Trying to pull quay.io/prometheus/alertmanager:v0.23.0...
Getting image source signatures
Copying blob aa2a8d90b84c skipped: already exists
Copying blob aa42aae1183b done |
Copying blob b45d31ee2d7f skipped: already exists
Copying blob e64c3c57ffe7 done |
Copying blob 7665a4a59238 done |
Copying blob 9a345be9cdfe done |
Copying config ba2b418f42 done |
Writing manifest to image destination
ba2b418f427c0636d654de8757e830c80168e76482bcc46bb2138e569d6c91d4
[root@localhost ~ 11:02:46]# podman pull quay.io/prometheus/prometheus:v2.33.4
Trying to pull quay.io/prometheus/prometheus:v2.33.4...
Getting image source signatures
Copying blob 604ad6adddc4 done |
Copying blob 009932687766 done |
Copying blob 1ad6d9643fdd done |
Copying blob ff9264fbb6f4 done |
Copying blob e6f7fea04459 done |
Copying blob 63fc05a36a59 done |
Copying blob 54b552d4bfbc done |
Copying blob a23b2328402c done |
Copying blob 9ec38b0764ed done |
Copying blob cf8aa72409ac done |
Copying blob 7104c0fa6750 done |
Copying blob b782297611dd done |
Copying config 514e6a882f done |
Writing manifest to image destination
514e6a882f6e74806a5856468489eeff8d7106095557578da96935e4d0ba4d9d
# 准备配置主机脚本
[root@localhost ~ 11:26:50]# cat > /usr/local/bin/sethost <<'EOF'
#/bin/bash
hostnamectl set-hostname ceph$1.dyx.cloud
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.1$1/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2 autoconnect yes
init 0
EOF
[root@localhost ~ 11:10:44]# chmod +x /usr/local/bin/sethost
[root@localhost ~ 11:11:02]#
关机虚拟机,并打快照。
准备集群节点
使用完全克隆方式,克隆出其他虚拟机,并配置主机名和IP地址
bash
#ceph1到ceph6按以下修改
#sethost 1 #ceph1用1,ceph2到ceph6分别为2-6
#client做以下修改
hostnamectl set-hostname client.dyx.cloud
nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.10/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2
Ceph 集群初始化
Ceph 初始化
bash
[root@ceph1 ~ 11:39:20]# cephadm bootstrap --mon-ip 192.168.108.11 --allow-fqdn-hostname --initial-dashboard-user admin --initial-dashboard-password dyx@123 --dashboard-password-noupdate
选项说明:
-
--mon-ip 192.168.108.11,指定 monitor ip。
-
--allow-fqdn-hostname,指定允许使用长名称。当主机名是长名称时,初始化时必须使用该参数。
-
--initial-dashboard-user admin,指定 Web UI 登录的管理员账户。
-
--initial-dashboard-password laogao@123,指定 Web UI 登录的管理员账户对应密码。
-
--dashboard-password-noupdate,指定不要更新 Web UI 登录密码。
输出信息如下:
bash
Creating directory /etc/ceph for ceph.conf
Verifying podman|docker is present...
Verifying lvm2 is present...
Verifying time synchronization is in place...
Unit chronyd.service is enabled and running
Repeating the final host check...
podman (/usr/bin/podman) version 4.9.4 is present
systemctl is present
lvcreate is present
Unit chronyd.service is enabled and running
Host looks OK
Cluster fsid: bc5b5200-ca79-11f0-9e78-000c2974062f
Verifying IP 192.168.108.11 port 3300 ...
Verifying IP 192.168.108.11 port 6789 ...
Mon IP `192.168.108.11` is in CIDR network `192.168.108.0/24`
Mon IP `192.168.108.11` is in CIDR network `192.168.108.0/24`
Internal network (--cluster-network) has not been provided, OSD replication will default to the public_network
Pulling container image quay.io/ceph/ceph:v16...
Ceph version: ceph version 16.2.15 (618f440892089921c3e944a991122ddc44e60516) pacific (stable)
Extracting ceph user uid/gid from container image...
Creating initial keys...
Creating initial monmap...
Creating mon...
Waiting for mon to start...
Waiting for mon...
mon is available
Assimilating anything we can from ceph.conf...
Generating new minimal ceph.conf...
Restarting the monitor...
Setting public_network to 192.168.108.0/24 in mon config section
Wrote config to /etc/ceph/ceph.conf
Wrote keyring to /etc/ceph/ceph.client.admin.keyring
Creating mgr...
Verifying port 9283 ...
Waiting for mgr to start...
Waiting for mgr...
mgr not available, waiting (1/15)...
mgr not available, waiting (2/15)...
mgr not available, waiting (3/15)...
mgr is available
Enabling cephadm module...
Waiting for the mgr to restart...
Waiting for mgr epoch 5...
mgr epoch 5 is available
Setting orchestrator backend to cephadm...
Generating ssh key...
Wrote public SSH key to /etc/ceph/ceph.pub
Adding key to root@localhost authorized_keys...
Adding host ceph1.dyx.cloud...
Deploying mon service with default placement...
Deploying mgr service with default placement...
Deploying crash service with default placement...
Deploying prometheus service with default placement...
Deploying grafana service with default placement...
Deploying node-exporter service with default placement...
Deploying alertmanager service with default placement...
Enabling the dashboard module...
Waiting for the mgr to restart...
Waiting for mgr epoch 9...
mgr epoch 9 is available
Generating a dashboard self-signed certificate...
Creating initial admin user...
Fetching dashboard port number...
Ceph Dashboard is now available at:
URL: https://ceph1.dyx.cloud:8443/
User: admin
Password: dyx@123
Enabling client.admin keyring and conf on hosts with "admin" label
Enabling autotune for osd_memory_target
You can access the Ceph CLI as following in case of multi-cluster or non-default config:
sudo /usr/sbin/cephadm shell --fsid bc5b5200-ca79-11f0-9e78-000c2974062f -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
Or, if you are only running a single cluster on this host:
sudo /usr/sbin/cephadm shell
Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
For more information see:
https://docs.ceph.com/en/pacific/mgr/telemetry/
Bootstrap complete.
[root@ceph1 ~ 11:42:16]#
输出信息说明
Dashboard 登录信息
bash
Ceph Dashboard is now available at:
URL: https://ceph1.dyx.cloud:8443/
User: admin
Password: dyx@123
客户端访问方法
bash
Enabling client.admin keyring and conf on hosts with "admin" label
Enabling autotune for osd_memory_target
You can access the Ceph CLI as following in case of multi-cluster or non-default config:
sudo /usr/sbin/cephadm shell --fsid bc5b5200-ca79-11f0-9e78-000c2974062f -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
Or, if you are only running a single cluster on this host:
sudo /usr/sbin/cephadm shell
启用遥测
发送匿名数据给社区,以改善Ceph。
bash
Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
访问 dashboard

添加节点
添加节点过程:
-
Ceph采用共享秘钥进行身份验证, 使用命令"ceph cephadm get-pub-key" 获取到主机接入集群时所需的ssh 公钥。
-
获取到公钥后, 使用该公钥实现对节点的免密ssh管理。
-
使用命令"ceph orch host add" 添加主机。
bash
# 为了配置方便,我们在ceph1上安装ceph客户端工具 ceph-common
[root@ceph1 ~ 14:10:10]# dnf install -y ceph-common
Last metadata expiration check: 3:23:59 ago on Wed 26 Nov 2025 10:46:16 AM CST.
Dependencies resolved.
... ...
# 获取集群公钥
[root@ceph1 ~ 14:10:56]# ceph cephadm get-pub-key > ~/ceph.pub
# 推送公钥到其他节点
[root@ceph1 ~ 14:11:25]# ssh-copy-id -f -i ~/ceph.pub root@ceph2.dyx.cloud
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/ceph.pub"
The authenticity of host 'ceph2.dyx.cloud (192.168.108.12)' can't be established.
ECDSA key fingerprint is SHA256:nOUFHRdr1rBwIb8vZxcNTeRARPN3k9zMIhLlYKBu0LE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? `yes`
root@ceph2.dyx.cloud's password: `123`
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@ceph2.dyx.cloud'"
and check to make sure that only the key(s) you wanted were added.
[root@ceph1 ~ 14:11:59]# ssh-copy-id -f -i ~/ceph.pub root@ceph3.dyx.cloud
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/ceph.pub"
The authenticity of host 'ceph3.dyx.cloud (192.168.108.13)' can't be established.
ECDSA key fingerprint is SHA256:nOUFHRdr1rBwIb8vZxcNTeRARPN3k9zMIhLlYKBu0LE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? `yes`
root@ceph3.dyx.cloud's password:`123`
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@ceph3.dyx.cloud'"
and check to make sure that only the key(s) you wanted were added.
# 添加节点
[root@ceph1 ~ 14:12:08]# ceph orch host add ceph2.dyx.cloud
Added host 'ceph2.dyx.cloud' with addr '192.168.108.12'
[root@ceph1 ~ 14:12:27]# ceph orch host add ceph3.dyx.cloud
Added host 'ceph3.dyx.cloud' with addr '192.168.108.13'
[root@ceph1 ~ 14:12:36]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph1.dyx.cloud 192.168.108.11 _admin
ceph2.dyx.cloud 192.168.108.12
ceph3.dyx.cloud 192.168.108.13
3 hosts in cluster
# 等待自动部署服务到其他节点,部署完成后效果如下:
[root@ceph1 ~ 14:12:49]# ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 4m ago 2h count:1
crash 3/3 4m ago 2h *
grafana ?:3000 1/1 4m ago 2h count:1
mgr 2/2 4m ago 2h count:2
mon 3/5 4m ago 2h count:5
node-exporter ?:9100 3/3 4m ago 2h *
prometheus ?:9095 1/1 4m ago 2h count:1
# crash 3/3个
# mgr 2/2个
# mon 3/5个
# node-exporter 3/3个
部署 mon 和 mgr
bash
# 禁用 mon 和 mgr 服务的自动扩展功能
[root@ceph1 ~ 14:13:01]# ceph orch apply mon --unmanaged=true
Scheduled mon update...
[root@ceph1 ~ 14:13:39]# ceph orch apply mgr --unmanaged=true
Scheduled mgr update...
[root@ceph1 ~ 14:13:46]# ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 13s ago 2h count:1
crash 3/3 14s ago 2h *
grafana ?:3000 1/1 13s ago 2h count:1
mgr 2/2 14s ago 8s `<unmanaged>
mon 3/5 14s ago 15s `<unmanaged>`
node-exporter ?:9100 3/3 14s ago 2h *
prometheus ?:9095 1/1 13s ago 2h count:1
# mon 和 mgr 的 PLACEMENT 状态为 <unmanaged>
# 配置主机标签,ceph2 和 ceph3 添加标签" _admin"
[root@ceph1 ~ 14:13:55]# ceph orch host label add ceph2.dyx.cloud _admin
Added label _admin to host ceph2.dyx.cloud
[root@ceph1 ~ 14:14:22]# ceph orch host label add ceph3.dyx.cloud _admin
Added label _admin to host ceph3.dyx.cloud
[root@ceph1 ~ 14:14:27]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph1.dyx.cloud 192.168.108.11 _admin
ceph2.dyx.cloud 192.168.108.12 `_admin`
ceph3.dyx.cloud 192.168.108.13 `_admin`
3 hosts in cluster
# 将 mon 和 mgr 组件部署到具有_admin标签的节点上
[root@ceph1 ~ 14:14:36]# ceph orch apply mon --placement="label:_admin"
Scheduled mon update...
[root@ceph1 ~ 14:15:05]# ceph orch apply mgr --placement="label:_admin"
Scheduled mgr update...
#观察现象
[root@ceph1 ~ 14:15:32]# ceph orch ls | egrep 'mon|mgr'
mgr 3/3 118s ago 27s `label:_admin`
mon 3/3 118s ago 34s `label:_admin`
[root@ceph1 ~ 14:15:39]# ceph orch ps |egrep 'mon|mgr'
mgr.ceph1.dyx.cloud.ilnlbd ceph1.dyx.cloud *:9283 running (18m) 52s ago 2h 440M - 16.2.15 3c4eff6082ae 3f3d60e2b20a
mgr.ceph2.dvnrax ceph2.dyx.cloud *:8443,9283 running (3m) 2m ago 3m 386M - 16.2.15 3c4eff6082ae 2cf654cf9eee
mgr.ceph3.bwnrnx ceph3.dyx.cloud *:8443,9283 running (60s) 58s ago 60s 36.3M - 16.2.15 3c4eff6082ae 65d4591985b1
mon.ceph1.dyx.cloud ceph1.dyx.cloud running (18m) 52s ago 2h 79.1M 2048M 16.2.15 3c4eff6082ae 8f924f5592ec
mon.ceph2 ceph2.dyx.cloud running (3m) 2m ago 3m 80.4M 2048M 16.2.15 3c4eff6082ae 8d93e9b4927c
mon.ceph3 ceph3.dyx.cloud running (3m) 58s ago 3m 84.5M 2048M 16.2.15 3c4eff6082ae d38e8e32f093
部署 OSD
bash
# 将所有主机上闲置的硬盘添加为 OSD
[root@ceph1 ~ 14:16:13]# ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...
验证
查看集群中部署的服务
bash
[root@ceph1 ~ 14:16:44]# ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 43s ago 2h count:1
crash 3/3 3m ago 2h *
grafana ?:3000 1/1 43s ago 2h count:1
mgr 3/3 3m ago 114s label:_admin
mon 3/3 3m ago 2m label:_admin
node-exporter ?:9100 3/3 3m ago 2h *
osd.all-available-devices `0` - 21s *
prometheus ?:9095 1/1 43s ago 2h count:1
[root@ceph1 ~ 14:17:06]# ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 8s ago 2h count:1
crash 3/3 9s ago 2h *
grafana ?:3000 1/1 8s ago 2h count:1
mgr 3/3 9s ago 2m label:_admin
mon 3/3 9s ago 2m label:_admin
node-exporter ?:9100 3/3 9s ago 2h *
osd.all-available-devices `9` 9s ago 39s *
prometheus ?:9095 1/1 8s ago 2h count:1
部分输出说明:
-
RUNNING:服务的运行状态,前一个数字表示当前运行的服务数量,后一个数字表示系统根据策略或配置推荐的服务部署数量。
-
PLACEMENT:为服务编排器部署服务时提供的参数,编排器可根据该参数判断服务所部署的节点,常见的 placement 包括:
- 具体节点名称,例如: --placement=ceph2
- 标签,例如: --placement="label:mylabel"
- 数量,例如: --placement="3 host1 host2 host3"
- unmanaged ,表示服务不自动部署。通过设置 --unmanaged 为 true 打开该功能,设置为false 关闭该功能>
查看集群状态
bash
[root@ceph1 ~ 14:17:24]# ceph -s
cluster:
id: bc5b5200-ca79-11f0-9e78-000c2974062f
health: `HEALTH_OK`
services:
mon: 3 daemons, quorum ceph1.dyx.cloud,ceph2,ceph3 (age 4m)
mgr: ceph1.dyx.cloud.ilnlbd(active, since 19m), standbys: ceph2.dvnrax, ceph3.bwnrnx
osd: 9 osds: 9 up (since 15s), 9 in (since 35s)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 2.6 GiB used, 177 GiB / 180 GiB avail
pgs: 1 active+clean
命令 ceph -s 对应的长命令为 ceph --status 。
输出包含:MON、 MGR及OSD的状态,包括数量、位置及运行时间。
集群的健康状态可分为:
-
HEALTH_OK:表示健康状态良好
-
HEALTH_WARN:表示集群存在告警,需进行排查处理后,可转为HEALTH_OK
-
HEALTH_ERR:表示集群存在比较严重的错误,需要立即处理
查看集群 osd 结构
bash
[root@ceph1 ~ 14:17:30]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.17537 root default
-5 0.05846 host ceph1
0 hdd 0.01949 osd.0 up 1.00000 1.00000
3 hdd 0.01949 osd.3 up 1.00000 1.00000
6 hdd 0.01949 osd.6 up 1.00000 1.00000
-3 0.05846 host ceph2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
4 hdd 0.01949 osd.4 up 1.00000 1.00000
7 hdd 0.01949 osd.7 up 1.00000 1.00000
-7 0.05846 host ceph3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
5 hdd 0.01949 osd.5 up 1.00000 1.00000
8 hdd 0.01949 osd.8 up 1.00000 1.00000
集群中运行的主要组件:
-
mgr,ceph 管理程序
-
monitor,ceph 监视器
-
osd,ceph 对象存储进程
-
rgw,ceph 对象存储网关
其他组件:
-
crash,崩溃数据收集模块
-
prometheus,监控组件
-
grafana,监控数据展示dashboard
-
alertmanager,prometheus告警组件
-
node_exporter,prometheus节点数据收集组件
查询出服务的具体情况后, 可对指定服务进一步操作:
-
使用命令 ceph orch daemon start|stop|restart|redeploy|reconfig <service_name> 对指定服务进行启动、停止、重启等操作。
-
使用命令 ceph orch daemon rm <service_name> [--force] 可删除指定服务。
!TIP
这时关闭所有ceph存储节点。并打快照,便于后续做实验。
Ceph 集群组件管理
ceph orch 命令
ceph orch 命令与编排器模块交互,编排器模块是ceph-mgr的插件,与外部编排服务交互。
ceph orch 命令支持多个外部编排器:
-
host:物理节点
-
service type:服务类型,如nfs, mds, osd, mon, rgw, mgr, iscsi
-
Service:逻辑服务
-
Daemon:进程
cephadm使用的特殊标签:
-
_no_schedule:不在此类标签的节点上部署或调度任何服务。
-
_no_autotune_memory:不对此类标签的节点进行内存调优。
-
_admin:自动将ceph.conf和ceph.client.admin.keyring发送到此类标签的节点上。
禁用服务自动扩展
Ceph 集群服务自动扩展功能,会自动部署ceph组件到存储节点。如果想手动管理 ceph 服务,则需要禁用 ceph 服务自动扩展功能。
bash
# 查看 mon 服务
[root@ceph1 ~ 15:38:46]# ceph orch ls mon
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
mon 3/3 37s ago 85m `label:_admin`
# 禁用 mon 服务自动扩展
[root@ceph1 ~ 15:40:22]# ceph orch apply mon --unmanaged=true
Scheduled mon update...
[root@ceph1 ~ 15:40:52]# ceph orch ls mon
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
mon 3/5 69s ago 2s `<unmanaged>``
# 启用 mon 服务自动扩展
[root@ceph1 ~ 15:40:54]# ceph orch apply mon --unmanaged=false
Scheduled mon update...
[root@ceph1 ~ 15:41:01]# ceph orch ls mon
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
mon 3/5 78s ago 1s count:5
# 通过标签部署 mon 服务
[root@ceph1 ~ 15:41:03]# ceph orch apply mon --placement="label:_admin"
Scheduled mon update...
[root@ceph1 ~ 15:41:32]# ceph orch ls mon
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
mon 3/3 109s ago 2s `label:_admin`
删除服务
以 crash 服务为例。
bash
# 禁用服务自动扩展
[root@ceph1 ~ 15:41:34]# ceph orch apply crash --unmanaged=true
Scheduled crash update...
[root@ceph1 ~ 15:41:59]# ceph orch ls crash
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
crash 3/3 2m ago 8s `<unmanaged>`
# 查看服务中实例
[root@ceph1 ~ 15:42:08]# ceph orch ps |grep crash
crash.ceph1 ceph1.dyx.cloud running (53m) 2m ago 4h 6643k - 16.2.15 3c4eff6082ae 2ecac62afe07
crash.ceph2 ceph2.dyx.cloud running (3m) 2m ago 89m 6639k - 16.2.15 3c4eff6082ae 102997c56299
crash.ceph3 ceph3.dyx.cloud running (3m) 2m ago 89m 6639k - 16.2.15 3c4eff6082ae bd96b76dbc8b
# 删除特定实例
[root@ceph1 ~ 15:42:32]# ceph orch daemon rm crash.ceph1
Removed crash.ceph1 from host 'ceph1.dyx.cloud'
[root@ceph1 ~ 15:42:52]# ceph orch ps |grep crash
crash.ceph2 ceph2.dyx.cloud running (4m) 3m ago 90m 6639k - 16.2.15 3c4eff6082ae 102997c56299
crash.ceph3 ceph3.dyx.cloud running (4m) 3m ago 90m 6639k - 16.2.15 3c4eff6082ae bd96b76dbc8b
# 删除服务
[root@ceph1 ~ 15:43:05]# ceph orch rm crash
Removed service crash
[root@ceph1 ~ 15:43:16]# ceph orch ls crash
No services reported
部署服务
使用 ceph 的编排器部署服务, 有两种方式:
-
apply 方式 :定义了服务状态,由编排器根据参数自动寻找合适的节点进行服务部署。语法:
ceph orch apply <service_type> [--placement=<placement_string>] [--unmanaged]例如:
ceph orch apply crash 和 ceph orch apply mon --placement="label:_admin"。 -
daemon add 方式:根据命令中的参数,直接进行服务部署。
语法:
ceph orch daemon add <daemon_type> <placement>
命令 orch apply osd [--all-available-devices] 将节点上的所有可用设备配置为OSD。
删除 OSD
确定 OSD 和设备关系
bash
[root@ceph1 ~ 09:46:41]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.17537 root default
#主机ceph1下的硬盘
-5 0.05846 host ceph1
#看不出来osd.0对应哪块磁盘
0 hdd 0.01949 osd.0 up 1.00000 1.00000
3 hdd 0.01949 osd.3 up 1.00000 1.00000
6 hdd 0.01949 osd.6 up 1.00000 1.00000
-3 0.05846 host ceph2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
4 hdd 0.01949 osd.4 up 1.00000 1.00000
7 hdd 0.01949 osd.7 up 1.00000 1.00000
-7 0.05846 host ceph3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
5 hdd 0.01949 osd.5 up 1.00000 1.00000
8 hdd 0.01949 osd.8 up 1.00000 1.00000
# 获取集群id
[root@ceph1 ~ 09:47:31]# ceph -s |grep id
id: bc5b5200-ca79-11f0-9e78-000c2974062f
# 登录到ceph1上确认osd.0使用的块设备
[root@ceph1 ~ 09:47:37]# ls -l /var/lib/ceph/bc5b5200-ca79-11f0-9e78-000c2974062f/osd.0/block
lrwxrwxrwx 1 ceph ceph 93 Nov 27 09:46 /var/lib/ceph/bc5b5200-ca79-11f0-9e78-000c2974062f/osd.0/block -> /dev/ceph-e1d741e4-a9c7-44e2-8d30-71e93994ed95/osd-block-f95f8323-d2ac-40d9-a2a2-cb872b1e4d67
# cb872b1e4d67是块设备名称最后一串字符
[root@ceph1 ~ 09:48:18]# lsblk |grep -B1 cb872b1e4d67
sdb 8:16 0 20G 0 disk
└─ceph--e1d741e4--a9c7--44e2--8d30--71e93994ed95-osd--block--f95f8323--d2ac--40d9--a2a2--cb872b1e4d67 253:5 0 20G 0 lvm
# 确认osd.0对应sdb
脚本实现
bash[root@ceph1 ~ 09:48:44]# vim /usr/local/bin/show-osd-device
bash[root@ceph1 ~ 09:50:19]# cat /usr/local/bin/show-osd-device #!/bin/bash # author laogao # date 2025-08-19 # Description 确认 osd 和 device 之间对应关系 # usage 在ceph node 上执行 cluster_id=$(ceph -s|grep id |awk '{print $2}') cd /var/lib/ceph/${cluster_id} for osd in osd.* do device_id=$(ls -l $osd/block | awk -F '-' '{print $NF}') device=/dev/$(lsblk |grep -B1 ${device_id} |grep -v ${device_id} | awk '{print $1}') echo $osd : $device done
bash[root@ceph1 ~ 09:50:08]# chmod +x /usr/local/bin/show-osd-device执行效果
bash[root@ceph1 ~ 09:50:14]# show-osd-device osd.0 : /dev/sdb osd.3 : /dev/sdc osd.6 : /dev/sdd
使用编排删除
示例:删除 osd.0
bash
# 禁用 osd 服务自动扩展
[root@ceph1 ~ 09:50:35]# ceph orch apply osd --all-available-devices --unmanaged=true
Scheduled osd.all-available-devices update...
[root@ceph1 ~ 09:51:11]# ceph orch ls osd
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
osd.all-available-devices 9 3m ago 9s `<unmanaged>`
# 删除 osd.0
[root@ceph1 ~ 09:51:21]# ceph orch osd rm 0
Scheduled OSD(s) for removal
# 删除device上数据
[root@ceph1 ~ 09:51:57]# ceph orch device zap ceph1.dyx.cloud /dev/sdb --force
#看osd0管理的是/dev/sdb还是啥
zap successful for /dev/sdb on ceph1.dyx.cloud
# 确认结果
[root@ceph1 ~ 09:52:27]# ceph orch device ls
HOST PATH TYPE DEVICE ID SIZE AVAILABLE REFRESHED REJECT REASONS
ceph1.dyx.cloud /dev/sdb hdd VMware_Virtual_I_00000000000000000001 20.0G Yes 19s ago
ceph1.dyx.cloud /dev/sdc hdd VMware_Virtual_I_01000000000000000001 20.0G 19s ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph1.dyx.cloud /dev/sdd hdd VMware_Virtual_I_11000000000000000001 20.0G 19s ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph1.dyx.cloud /dev/sr0 hdd VMware_IDE_CDR10_10000000000000000001 12.8G 19s ago Has a FileSystem
ceph2.dyx.cloud /dev/sda hdd VMware_Virtual_I_00000000000000000001 20.0G 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph2.dyx.cloud /dev/sdb hdd VMware_Virtual_I_01000000000000000001 20.0G 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph2.dyx.cloud /dev/sdc hdd VMware_Virtual_I_11000000000000000001 20.0G 5m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph2.dyx.cloud /dev/sr0 hdd VMware_IDE_CDR10_10000000000000000001 12.8G 5m ago Has a FileSystem
ceph3.dyx.cloud /dev/sdb hdd VMware_Virtual_I_00000000000000000001 20.0G 4m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph3.dyx.cloud /dev/sdc hdd VMware_Virtual_I_01000000000000000001 20.0G 4m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph3.dyx.cloud /dev/sdd hdd VMware_Virtual_I_11000000000000000001 20.0G 4m ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
ceph3.dyx.cloud /dev/sr0 hdd VMware_IDE_CDR10_10000000000000000001 12.8G 4m ago Has a FileSystem
[root@ceph1 ~ 09:52:57]# ceph orch device ls |grep ceph1.*sdb
ceph1.dyx.cloud /dev/sdb hdd VMware_Virtual_I_00000000000000000001 20.0G Yes 45s ago
[root@ceph1 ~ 09:53:03]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─cs-root 253:0 0 70G 0 lvm /
├─cs-swap 253:1 0 2G 0 lvm [SWAP]
└─cs-home 253:2 0 127G 0 lvm /home
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
└─ceph--7834547c--0741--4c84--aa36--fa8d5f78a778-osd--block--fd55c16b--25ea--4b9c--b9f1--be0b6776a0d0
253:3 0 20G 0 lvm
sdd 8:48 0 20G 0 disk
└─ceph--7bbc57a7--4248--43fd--a089--f249b9347225-osd--block--8a655336--a171--442d--90d3--c9a28229c15c
253:4 0 20G 0 lvm
sr0 11:0 1 12.8G 0 rom
[root@ceph1 ~ 09:53:07]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
# 添加回来
[root@ceph1 ~ 09:53:13]# ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...
[root@ceph1 ~ 09:53:40]# ceph orch ls osd
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
osd.all-available-devices 9 6m ago 19s *
手动删除过程
bash
[root@ceph1 ~ 09:54:21]# ceph orch daemon rm osd.0 --force# 停止 ceph1 中的 osd
[root@ceph1 ~ 09:53:51]# ceph orch daemon stop osd.0
Scheduled to stop osd.0 on host 'ceph1.dyx.cloud'
[root@ceph1 ~ 09:54:11]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.17537 root default
-5 0.05846 host ceph1
#查看osd.0down了
0 hdd 0.01949 osd.0 down 1.00000 1.00000
3 hdd 0.01949 osd.3 up 1.00000 1.00000
6 hdd 0.01949 osd.6 up 1.00000 1.00000
-3 0.05846 host ceph2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
4 hdd 0.01949 osd.4 up 1.00000 1.00000
7 hdd 0.01949 osd.7 up 1.00000 1.00000
-7 0.05846 host ceph3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
5 hdd 0.01949 osd.5 up 1.00000 1.00000
8 hdd 0.01949 osd.8 up 1.00000 1.00000
# 待 osd 停止后,删除 osd 进程
[root@ceph1 ~ 09:54:21]# ceph orch daemon rm osd.0 --force
Removed osd.0 from host 'ceph1.dyx.cloud'
#可以ps aux|grep osd.0观察
# 从 crush map 中剔除 osd
[root@ceph1 ~ 09:54:45]# ceph osd out 0
cemarked out osd.0.
# 从 crush map 中删除 osd
[root@ceph1 ~ 09:55:08]# ceph osd crush rm osd.0
removed item id 0 name 'osd.0' from crush map
# 执行下面的命令将会自动标记为out,并且从crush map中删除,最后删除osd相关文件。
[root@ceph1 ~ 09:55:21]# ceph osd rm 0
removed osd.0
# 删除device上数据
[root@ceph1 ~ 09:55:30]# ceph orch device zap ceph1.dyx.cloud /dev/sdb --force
zap successful for /dev/sdb on ceph1.dyx.cloud
# 确认结果
[root@ceph1 ~ 09:56:24]# ceph orch device ls|grep 'ceph1.*sdb'
ceph1.dyx.cloud /dev/sdb hdd VMware_Virtual_I_00000000000000000001 20.0G 4s ago Has a FileSystem, Insufficient space (<10 extents) on vgs, LVM detected
# 添加回来
[root@ceph1 ~ 09:56:27]# ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...
[root@ceph1 ~ 09:56:39]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.17537 root default
-5 0.05846 host ceph1
0 hdd 0.01949 osd.0 up 1.00000 1.00000
3 hdd 0.01949 osd.3 up 1.00000 1.00000
6 hdd 0.01949 osd.6 up 1.00000 1.00000
-3 0.05846 host ceph2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
4 hdd 0.01949 osd.4 up 1.00000 1.00000
7 hdd 0.01949 osd.7 up 1.00000 1.00000
-7 0.05846 host ceph3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
5 hdd 0.01949 osd.5 up 1.00000 1.00000
8 hdd 0.01949 osd.8 up 1.00000 1.00000
删除主机
从集群中删除主机流程:
- 禁用集群所有服务自动扩展
- 查看待删除主机上当前运行的服务
- 停止待删除主机上的所有服务
- 删除主机上的所有服务
- 删除osd在CRUSH中的映射
- 擦除osd盘中的数据
- 从集群中删除主机
示例:删除 ceph2
首先,禁用集群中所有ceph服务自动扩展,进制自动部署osd。
bash
[root@ceph1 ~ 10:20:28]# for service in $(ceph orch ls |grep -v -e NAME -e osd| awk '{print $1}');do ceph orch apply $service --unmanaged=true;done
Scheduled alertmanager update...
Scheduled grafana update...
Scheduled mgr update...
Scheduled mon update...
Scheduled node-exporter update...
Scheduled prometheus update...
[root@ceph1 ~ 10:21:04]# ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 3m ago 18s <unmanaged>
grafana ?:3000 1/1 3m ago 17s <unmanaged>
mgr 3/2 3m ago 17s <unmanaged>
mon 3/5 3m ago 16s <unmanaged>
node-exporter ?:9100 3/3 3m ago 16s <unmanaged>
osd.all-available-devices 9 3m ago 24m *
prometheus ?:9095 1/1 3m ago 15s <unmanaged>
[root@ceph1 ~ 10:21:20]# ceph orch apply osd --all-available-devices --unmanaged=true
Scheduled osd.all-available-devices update...
其次,删除主机上运行的服务。
bash
# 查看ceph2上运行的daemon
[root@ceph1 ~ 10:22:16]# ceph orch ps |grep ceph2 |awk '{print $1}'
mgr.ceph2.dvnrax
mon.ceph2
node-exporter.ceph2
osd.1
osd.4
osd.7
# 删除相应 daemon
[root@ceph1 ~ 10:22:22]# for daemon in $(ceph orch ps |grep ceph2 |awk '{print $1}');do ceph orch daemon rm $daemon --force;done
Removed mgr.ceph2.dvnrax from host 'ceph2.dyx.cloud'
Removed mon.ceph2 from host 'ceph2.dyx.cloud'
Removed node-exporter.ceph2 from host 'ceph2.dyx.cloud'
Removed osd.1 from host 'ceph2.dyx.cloud'
Removed osd.4 from host 'ceph2.dyx.cloud'
Removed osd.7 from host 'ceph2.dyx.cloud'
# 手动清理crush信息
[root@ceph1 ~ 10:23:06]# ceph osd crush rm osd.1
removed item id 1 name 'osd.1' from crush map
[root@ceph1 ~ 10:23:18]# ceph osd crush rm osd.4
removed item id 4 name 'osd.4' from crush map
[root@ceph1 ~ 10:23:23]# ceph osd crush rm osd.7
removed item id 7 name 'osd.7' from crush map
[root@ceph1 ~ 10:23:28]# ceph osd rm 1 4 7
removed osd.1, osd.4, osd.7
# 清理磁盘数据
[root@ceph1 ~ 10:23:37]# ceph orch device zap ceph2.dyx.cloud /dev/sdb --force
zap successful for /dev/sdb on ceph2.dyx.cloud
[root@ceph1 ~ 10:24:17]# ceph orch device zap ceph2.dyx.cloud /dev/sdc --force
zap successful for /dev/sdc on ceph2.dyx.cloud
[root@ceph1 ~ 10:24:28]# ceph orch device zap ceph2.dyx.cloud /dev/sda --force
zap successful for /dev/sda on ceph2.dyx.cloud
然后,删除主机。
bash
[root@ceph1 ~ 10:24:57]# ceph orch host rm ceph2
Removed host 'ceph2'
[root@ceph1 ~ 10:25:14]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph1.dyx.cloud 192.168.108.11 _admin
ceph3.dyx.cloud 192.168.108.13 _admin
2 hosts in cluster
最后,删除ceph2中相应ceph遗留文件。
bash
[root@ceph2 ~ 10:24:41]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
└─ceph--433461fb--c719--4a95--a43b--0b16f6e13b12-osd--block--26c4bafa--5a08--4537--896a--8f6ac4ceec23
253:5 0 20G 0 lvm
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 200G 0 disk
├─sdd1 8:49 0 1G 0 part /boot
└─sdd2 8:50 0 199G 0 part
├─cs-root 253:0 0 70G 0 lvm /
├─cs-swap 253:1 0 2G 0 lvm [SWAP]
└─cs-home 253:2 0 127G 0 lvm /home
sr0 11:0 1 12.8G 0 rom
[root@ceph2 ~ 10:24:43]# rm -rf /var/lib/c
ceph/ cephadm/ chrony/ cni/ containers/
[root@ceph2 ~ 10:24:43]# rm -rf /var/lib/ceph
[root@ceph2 ~ 10:26:00]# rm -rf /etc/ceph/ /etc/systemd/system/ceph*
[root@ceph2 ~ 10:26:24]# rm -rf /var/lo
local/ lock/ log/
[root@ceph2 ~ 10:26:24]# rm -rf /var/log/ceph/
[root@ceph1 ~ 10:25:21]# ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 10m ago 6m <unmanaged>
grafana ?:3000 1/1 10m ago 6m <unmanaged>
mgr 2/2 10m ago 6m <unmanaged>
mon 2/5 10m ago 6m <unmanaged>
node-exporter ?:9100 2/2 10m ago 6m <unmanaged>
osd.all-available-devices 6 10m ago 6m <unmanaged>
prometheus ?:9095 1/1 10m ago 6m <unmanaged>
实验完成后,恢复环境。
恢复环境-还原快照
第三章 Ceph 分布式存储 集群配置
管理集群配置
Ceph 集群配置概述
Ceph 配置选项具有唯一名称,该名称由下划线连接的小写字符组成。有些配置选项会包含短划线(中横杠)或空格字符。推荐做法:使用下划线。
Ceph 守护进程会从以下某个来源访问其配置:
-
编译中的默认值
-
集中配置数据库
-
存储在本地主机上的配置文件
-
环境变量
-
命令行参数
-
运行时覆盖
当存在多个设置源时,配置生效原则:
-
较新设置将覆盖较早设置源中的设置。
-
配置文件会在启动时配置守护进程。
-
配置文件设置会覆盖存储在中央数据库中的设置。
-
监控器 (MON) 节点管理集中配置数据库。
生效过程:
- 启动时,Ceph 守护进程解析命令行选项、环境变量和本地集群配置文件提供的配置选项。
- 然后,守护进程会联系 MON 集群来检索存储在集中配置数据库中的配置选项。
注意:Ceph 存储优先使用集中配置数据库中配置,弃用 ceph.conf 集群配置文件。
修改集群配置文件
Ceph会去以下目录中查找集群相关配置文件:
-
CEPH_CONF 环境变量中包含的路径
-
-c path/path:由命令行参数"-c"指定的路径
-
./$cluster.conf
-
~/.ceph/$cluster.conf
-
/etc/ceph/$cluster.conf,默认位置。
每个 Ceph 节点都会存储一个本地配置文件,默认位置是 /etc/ceph/ceph.conf 。cephadm 工具会使用最小选项集创建初始 Ceph 配置文件。
配置文件采用 INI 文件格式,其中内容涵盖 Ceph 守护进程和客户端配置。每个部分都使用[name]标头定义的名称,以及一个或多个键值对参数。
bash
[name]
parameter1 = value1
parameter2 = value2
使用井号 (#) 或分号 (😉 禁用设置或添加注释。
在引导集群时,可以借助集群配置文件,自定义引导集群。
bash
# cephadm bootstrap --config ceph-config.yaml
配置部分
Ceph 使用所应用的守护进程或客户端的部分,将配置选项分组,确定是存储在配置文件中还是存储在配置数据库中。
-
[global] 部分,存储所有守护进程(包括客户端)共有的一般配置,可为单个守护进程或客户端创建调用部分来覆盖 [global] 参数。
-
[mon] 部分,存储监控器 (MON) 的配置。
-
[osd] 部分,存储 OSD 守护进程的配置。
-
[mgr] 部分,存储管理器 (MGR) 的配置。
-
[mds] 部分,存储元数据服务器 (MDS) 的配置。
-
[client] 部分,存储应用到所有 Ceph 客户客户端的配置。
良好的示例文件参见 /usr/share/doc/ceph/sample.ceph.conf ,该文件由 ceph-common 软件包提供。
实例设置
实例设置适用于特定守护进程,名称格式为: [daemon-type.instance-ID] 。
bash
[mon]
# Settings for all mon daemons
[mon.ceph1]
# Settings that apply to the specific MON daemon running on ceph1
同样的名称还适用于 [osd]、[mgr]、[mds] 和 [client] 部分。
-
OSD 守护进程的实例 ID 始终为数字,例如 [osd.0]。
-
客户端的实例 ID 是有效的用户名,例如 [client.operator3]。
元变量
元变量是由 Ceph 定义的变量。用户可使用它们来简化配置。
-
$cluster ,Ceph 存储 5 集群的名称。默认集群名称为 ceph。
-
$type ,守护进程类型,如监控器的值为 mon 。OSD 使用 osd ,元数据服务器使用 mds ,管理器使用 mgr ,客户端软件使用 client。
-
i d ∗ ∗ ,守护进程实例 I D 。对于此变量, ∗ ∗ c e p h 1 ∗ ∗ 上监控器的值为 ∗ ∗ c e p h 1 ∗ ∗ 。 ∗ ∗ o s d . 1 ∗ ∗ 的 ∗ ∗ id**,守护进程实例 ID。对于此变量,**ceph1** 上监控器的值为 **ceph1**。**osd.1** 的 ** id∗∗,守护进程实例ID。对于此变量,∗∗ceph1∗∗上监控器的值为∗∗ceph1∗∗。∗∗osd.1∗∗的∗∗id 值为 1 ,客户端应用的值为用户名。
-
n a m e ∗ ∗ ,守护进程名称和实例 I D 。此变量是 ∗ ∗ name**,守护进程名称和实例 ID。此变量是 ** name∗∗,守护进程名称和实例ID。此变量是∗∗type.$id 的简写。
-
$host,运行守护进程的主机的名称。
bash
## Metavariables
# $cluster ; Expands to the Ceph Storage Cluster name. Useful
# ; when running multiple Ceph Storage Clusters
# ; on the same hardware.
# ; Example: /etc/ceph/$cluster.keyring
# ; (Default: ceph)
#
# $type ; Expands to one of mds, osd, or mon, depending on
# ; the type of the instant daemon.
# ; Example: /var/lib/ceph/$type
#
# $id ; Expands to the daemon identifier. For osd.0, this
# ; would be 0; for mds.a, it would be a.
# ; Example: /var/lib/ceph/$type/$cluster-$id
#
# $host ; Expands to the host name of the instant daemon.
#
# $name ; Expands to $type.$id.
# ; Example: /var/run/ceph/$cluster-$name.asok
使用集群配置数据库
集群配置数据库由 MON 节点集中管理:
-
在守护进程启动之前,暂时更改设置。
-
在守护进程运行时,更改大部分设置。
-
将永久设置存储在数据库中。
Ceph集中配置数据库默认存放在 MON 节点 /var/lib/ceph/ f s i d / m o n . fsid/mon. fsid/mon.host/store.db中。
使用 ceph config 命令,查询和配置集中配置数据库。
ceph config ls
列出集群数据库中所有配置条目。
bash
[root@ceph1 ~ 11:15:23]# ceph config ls
host
fsid
public_addr
public_addrv
public_bind_addr
cluster_addr
public_network
public_network_interface
ceph config help
查看集群数据库中特定配置帮助信息。 是 ceph config ls 命令列出的条目。
bash
[root@ceph1 ~ 11:16:10]# ceph config help host
host - local hostname
(str, basic)
Default:
Can update at runtime: false
Services: [common]
Tags: [network]
if blank, ceph assumes the short hostname (hostname -s)
[root@ceph1 ~ 11:16:23]# ceph config help fsid
fsid - cluster fsid (uuid)
(uuid, basic)
Default: 00000000-0000-0000-0000-000000000000
Can update at runtime: false
Services: [common]
Tags: [service]
ceph config dump
显示集群配置数据库设置。
bash
[root@ceph1 ~ 11:16:35]# ceph config dump
WHO MASK LEVEL OPTION VALUE RO
global basic container_image quay.io/ceph/ceph@sha256:6ba107eb55617994a9e6ed49fb938828c2ed3121aa19ceeffbf8e28608535d94 *
mon advanced auth_allow_insecure_global_id_reclaim false
mon advanced public_network 192.168.108.0/24 *
mgr advanced mgr/cephadm/container_init True *
mgr advanced mgr/cephadm/migration_current 5 *
mgr advanced mgr/dashboard/ALERTMANAGER_API_HOST http://ceph1.dyx.cloud:9093 *
mgr advanced mgr/dashboard/GRAFANA_API_SSL_VERIFY false *
mgr advanced mgr/dashboard/GRAFANA_API_URL https://ceph1.dyx.cloud:3000 *
mgr advanced mgr/dashboard/PROMETHEUS_API_HOST http://ceph1.dyx.cloud:9095 *
mgr advanced mgr/dashboard/ssl_server_port 8443 *
mgr advanced mgr/orchestrator/orchestrator cephadm
osd advanced osd_memory_target_autotune true
ceph config show t y p e . type. type.id [ ]
显示特定守护进程当前生效的设置,包含部分默认设置。
bash
[root@ceph1 ~ 11:16:50]# ceph config show mon.ceph1.dyx.cloud
NAME VALUE SOURCE OVERRIDES IGNORES
auth_allow_insecure_global_id_reclaim false mon
container_image quay.io/ceph/ceph@sha256:6ba107eb55617994a9e6ed49fb938828c2ed3121aa19ceeffbf8e28608535d94 mon
daemonize false override
keyring $mon_data/keyring default
leveldb_block_size 65536 default
leveldb_cache_size 536870912 default
leveldb_compression false default
leveldb_log default
leveldb_write_buffer_size 33554432 default
log_stderr_prefix debug default
log_to_file false default
log_to_stderr true default
mon_cluster_log_to_file false default
mon_cluster_log_to_stderr true default
mon_host [v2:192.168.108.11:3300/0,v1:192.168.108.11:6789/0] [v2:192.168.108.12:3300/0,v1:192.168.108.12:6789/0] [v2:192.168.108.13:3300/0,v1:192.168.108.13:6789/0] file
no_config_file false override
public_network 192.168.108.0/24 file (mon[192.168.108.0/24])
rbd_default_features 61 default
setgroup ceph cmdline
setuser ceph cmdline
[root@ceph1 ~ 11:17:36]# ceph config show mon.ceph1.dyx.cloud public_network
192.168.108.0/24
ceph config show-with-defaults t y p e . type. type.id
显示特定守护进程当前生效的设置,包含默认设置。
bash
[root@ceph1 ~ 11:17:42]# ceph config show-with-defaults mon.ceph1.dyx.cloud
NAME VALUE SOURCE OVERRIDES IGNORES
admin_socket $run_dir/$cluster-$name.asok default
admin_socket_mode default
auth_allow_insecure_global_id_reclaim false mon
auth_client_required cephx, none
... ...
ceph config get t y p e . type. type.id [ ]
获得集群数据库中特定配置设置。永久值
bash
[root@ceph1 ~ 11:18:08]# ceph config get mon.ceph1.dyx.cloud
WHO MASK LEVEL OPTION VALUE RO
mon advanced auth_allow_insecure_global_id_reclaim false
global basic container_image quay.io/ceph/ceph@sha256:6ba107eb55617994a9e6ed49fb938828c2ed3121aa19ceeffbf8e28608535d94 *
mon advanced public_network 192.168.108.0/24 *
[root@ceph1 ~ 11:18:23]# ceph config get mon.ceph1.dyx.cloud public_network
192.168.108.0/24
ceph config set t y p e . type. type.id
设置集群数据库中特定配置选项。
bash
# 设置特定类型所有实例
[root@ceph1 ~ 11:35:20]# ceph config set mon mon_allow_pool_delete false
# 设置特定类型特定实例
[root@ceph1 ~ 11:36:17]# ceph config set mon.ceph1.dyx.cloud mon_allow_pool_delete true
[root@ceph1 ~ 11:36:36]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete
true
ceph config rm t y p e . type. type.id [ ]
清除集群数据库中特定配置选项。--删除该参数还原默认配置的意思
bash
[root@ceph1 ~ 11:37:07]# ceph config rm mon.ceph1.dyx.cloud mon_allow_pool_delete
[root@ceph1 ~ 11:37:39]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete
false
ceph config log [num:int]
显示集群最近配置历史记录,默认显示10条,类似于linux中history命令。
bash
[root@ceph1 ~ 11:38:06]# ceph config log
--- 16 --- 2025-11-27T03:37:39.401173+0000 ---
- mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
--- 15 --- 2025-11-27T03:36:36.089662+0000 ---
+ mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
--- 14 --- 2025-11-27T03:35:28.302852+0000 ---
+ mon/mon_allow_pool_delete = false
--- 13 --- 2025-11-26T03:42:57.639614+0000 ---
+ mgr/mgr/dashboard/PROMETHEUS_API_HOST = http://ceph1.dyx.cloud:9095
--- 12 --- 2025-11-26T03:42:57.582453+0000 ---
+ mgr/mgr/dashboard/GRAFANA_API_URL = https://ceph1.dyx.cloud:3000
--- 11 --- 2025-11-26T03:42:57.543079+0000 ---
+ mgr/mgr/dashboard/ALERTMANAGER_API_HOST = http://ceph1.dyx.cloud:9093
--- 10 --- 2025-11-26T03:42:26.283177+0000 ---
+ mgr/mgr/dashboard/GRAFANA_API_SSL_VERIFY = false
--- 9 --- 2025-11-26T03:42:14.630445+0000 ---
+ osd/osd_memory_target_autotune = true
--- 8 --- 2025-11-26T03:41:54.927694+0000 ---
+ mgr/mgr/dashboard/ssl_server_port = 8443
--- 7 --- 2025-11-26T03:41:53.541906+0000 ---
+ mgr/mgr/cephadm/container_init = True
# 只显示最近更改的两条记录
[root@ceph1 ~ 11:38:17]# ceph config log 2
--- 16 --- 2025-11-27T03:37:39.401173+0000 ---
- mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
--- 15 --- 2025-11-27T03:36:36.089662+0000 ---
+ mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
ceph config reset [num:int]
回滚集群数据中特定配置为 num 指定的历史版本。
准备实验环境:
bash
#产生log 17记录
[root@ceph1 ~ 11:38:24]# ceph config set mon.ceph1.dyx.cloud mon_allow_pool_delete true
#产生log 18记录
[root@ceph1 ~ 11:39:08]# ceph config set mon.ceph1.dyx.cloud mon_allow_pool_delete false
#此刻为false
[root@ceph1 ~ 11:39:19]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete
false
[root@ceph1 ~ 11:39:34]# ceph config log 2
--- 18 --- 2025-11-27T03:39:19.598153+0000 ---
- mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
+ mon.ceph1.dyx.cloud/mon_allow_pool_delete = false
--- 17 --- 2025-11-27T03:39:08.968930+0000 ---
+ mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
回滚配置到log 20的版本
bash
[root@ceph1 ~ 11:39:45]# ceph config reset 17
#验证回到log 17的true
[root@ceph1 ~ 11:40:03]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete
true
#从19回滚到17
[root@ceph1 ~ 11:40:06]# ceph config log 1
--- 19 --- 2025-11-27T03:40:03.216559+0000 --- reset to 17 ---
- mon.ceph1.dyx.cloud/mon_allow_pool_delete = false
+ mon.ceph1.dyx.cloud/mon_allow_pool_delete = true
集群引导选项
集群引导选项提供启动集群所需的信息。MON 读取 monmap 和 ceph.conf 文件,以确定如何与其他
MON 通信,并与其他 MON 并建立仲裁。
mon_ip 选项列出集群监控器。**此选项必不可少,并且不能存储在配置数据库中。**为避免使用集群配置文件,Ceph 集群支持使用 DNS 服务记录提供 mon_host 列表。
本地集群配置文件 ceph.conf 还可包含其他选项:
-
mon_host_override,集群监视器的初始列表。
-
mon_dns_serv_name,用于检查通过 DNS 识别的集群监控器的 DNS SRV 记录的名称。
-
mon_data、osd_data 、mds_data 、mgr_data,定义守护进程的本地数据存储目录。
-
keyring 、keyfile 和 key,使用监控器进行身份验证的身份验证凭据。
在运行时覆盖配置设置
Ceph支持在守护进程运行时,临时更改大部分配置选项。
ceph tell 命令
ceph tell $type.$id config 命令可临时覆盖配置选项,并要求所配置的MON和守护进程都在运行。
-
ceph tell $type.$id config show,获取守护进程的所有运行时设置。 -
ceph tell $type.$id config get,获取守护进程的特定运行时设置。 -
ceph tell $type.$id config set,设置守护进程的特定运行时设置。当守护进程重启时,这些临时设置将恢复为原始值。
bash
[root@ceph1 ~ 13:57:19]# ceph tell mon.ceph1.dyx.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
[root@ceph1 ~ 13:57:59]# ceph tell mon.ceph1.dyx.cloud config set mon_allow_pool_delete false
{
"success": "mon_allow_pool_delete = 'false' "
}
# 临时更改的值已生效
[root@ceph1 ~ 13:58:32]# ceph tell mon.ceph1.dyx.cloud config get mon_allow_pool_delete {
"mon_allow_pool_delete": "false"
}
# 集群数据库中值仍然为true
[root@ceph1 ~ 13:58:44]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete
true
# 重启守护进程,生效的值恢复为数据库中设置的值
[root@ceph1 ~ 13:59:15]# ceph orch daemon restart mon.ceph1.dyx.cloud
Scheduled to restart mon.ceph1.dyx.cloud on host 'ceph1.dyx.cloud'
[root@ceph1 ~ 13:59:52]# ceph tell mon.ceph1.dyx.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
注意:使用此命令更改的设置在守护进程重启后会恢复为原始设置。
ceph tell $type.$id config 命令接受通配符,以获取或设置同一类型的所有守护进程的值。
bash
[root@ceph1 ~ 14:00:29]# ceph tell mon.* config get mon_allow_pool_delete
mon.ceph1.dyx.cloud: {
"mon_allow_pool_delete": "true"
}
mon.ceph2: {
"mon_allow_pool_delete": "false"
}
mon.ceph3: {
"mon_allow_pool_delete": "false"
}
ceph daemon 命令
Ceph支持在集群特定节点上使用 ceph daemon $type.$id config 命令临时覆盖配置选项。该命令不需要连接MON ,但要求对应的守护进程要运行,所以即使 MON 未运行,该命令仍可发挥作用,有助于故障排除。
ceph daemon $type.$id config show,获得特定守护进程运行时所有设置。
bash
# 在ceph1上只能查看和设置ceph1上运行的相关进程设置
[root@ceph1 ~ 14:00:55]# cephadm shell
Inferring fsid bc5b5200-ca79-11f0-9e78-000c2974062f
Using recent ceph image quay.io/ceph/ceph@sha256:f15b41add2c01a65229b0db515d2dd57925636ea39678ccc682a49e2e9713d98
[ceph: root@ceph1 /]# ceph daemon mon.ceph1.dyx.cloud config show
{
"name": "mon.ceph1.dyx.cloud",
"cluster": "ceph",
"admin_socket": "/var/run/ceph/ceph-mon.ceph1.dyx.cloud.asok",
"admin_socket_mode": "",
"auth_allow_insecure_global_id_reclaim": "false",
"auth_client_required": "cephx, none",
"auth_cluster_required": "cephx",
"auth_debug": "false",
"auth_expose_insecure_g
... ...
ceph daemon $type.$id config get,获得守护进程运行时特定设置。
bash
[ceph: root@ceph1 /]# ceph daemon mon.ceph1.dyx.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
ceph daemon $type.$id config set,设置守护进程运行时特定设置。
bash
[ceph: root@ceph1 /]# ceph daemon mon.ceph1.dyx.cloud config set mon_allow_pool_delete false
{
"success": "mon_allow_pool_delete = 'false' "
}
[ceph: root@ceph1 /]# ceph daemon mon.ceph1.dyx.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "false"
}
注意:使用此命令更改的设置在守护进程重启后会恢复为原始设置。
bash
[ceph: root@ceph1 /]# ceph orch daemon restart mon.ceph1.dyx.cloud
Scheduled to restart mon.ceph1.dyx.cloud on host 'ceph1.dyx.cloud'
[ceph: root@ceph1 /]# ceph daemon mon.ceph1.dyx.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
[ceph: root@ceph1 /]#
Web UI 更改
-
打开 Web 浏览器并导航到 https://ceph1.dyx.cloud:8443。必要时,接受证书警告。输入用户名(admin)和密码(laogao@123) 登录。
-
在 Ceph 控制面板 Web UI 中,单击 Cluster > Configuration 以显示 Configuration Settings 页面。
-
从 advanced 菜单中选择 advanced 选项,以查看高级配置选项。在搜索栏中键入mon_allow_pool_delete 来查找设置。
-
单击 mon_allow_pool_delete,然后单击 Edit。
-
编辑 mon_allow_pool_delete 设置,将 global 值设置为 true,然后单击Update。
-
控制面板会显示一条消息,以确认新的设置。
配置集群监控器 Monitor
配置 Ceph 监控器
Ceph监控器(MON)存储和维护客户端用于查找MON和OSD节点的集群映射。Ceph客户端必须连接到MON以检索集群映射,然后才能读取或写入任何数据到OSD。因此,正确配置集群MON至关重要。
MON 采用 一种 Paxos 变体算法来选举领导者,在分布式计算机集之间达成一致。
各MON分别具有以下其中一个角色:
-
Leader:第一个获得集群映射最新版本的 MON。
-
Provider:拥有最新版本的集群映射,但不是 Leader 的 MON。
-
Requester :没有最新版本的集群映射,必须先与 Provider 同步,然后才能重新加入仲裁的MON。
一旦有新的 MON **加入集群,便会进行同步。**每个 MON 都会定期检查相邻监控器是否已有更新版本的集群映射。如果相邻 MON 具有新版本的集群映射,则必须同步并获取相应集群映射。
集群中的大多数 MON **必须处于运行状态,以建立仲裁。**例如,如果部署了五个 MON,则必须运行三个才能建立仲裁。在生产 Ceph 集群中至少部署三个 MON **节点,以确保高可用性。**Ceph 支持在运行中的集群中添加或删除 MON。
集群配置文件 [mon] 块中 mon_host 定义 MON 主机 IP 地址(或 DNS 名称)和端口。cephadm 工具不会更新集群配置文件,可以通过第三方工具,例如rsync,让集群配置文件在集群节点之间保持同步的策略。
bash
[global]
fsid = 2faf683a-7cbf-11f0-b5ba-000c29e0ad0e
mon_host = [v2:192.168.108.11:3300/0,v1:192.168.108.11:6789/0]
[v2:192.168.108.12:3300/0,v1:192.168.108.12:6789/0]
[v2:192.168.108.13:3300/0,v1:192.168.108.13:6789/0]
**重要:**在集群部署和运行期间,建议不要更改 MON 节点 IP 地址。
查看监控器仲裁
-
ceph status命令,检查 MON 仲裁状态。bash[root@ceph1 ~ 15:16:11]# ceph status |grep mon mon: 3 daemons, quorum ceph1.dyx.cloud,ceph2,ceph3 (age 71m) -
ceph mon stat命令,检查 MON 仲裁状态。bash[root@ceph1 ~ 15:16:22]# ceph mon stat e3: 3 mons at {ceph1.dyx.cloud=[v2:192.168.108.11:3300/0,v1:192.168.108.11:6789/0],ceph2=[v2:192.168.108.12:3300/0,v1:192.168.108.12:6789/0],ceph3=[v2:192.168.108.13:3300/0,v1:192.168.108.13:6789/0]} removed_ranks: {}, election epoch 28, leader 0 ceph1.dyx.cloud, quorum 0,1,2 ceph1.dyx.cloud,ceph2,ceph3 -
ceph quorum_status -f json-pretty命令,友好的 json 格式输出 MON 仲裁状态。bash[root@ceph1 ~ 15:16:30]# ceph quorum_status -f json-pretty { "election_epoch": 28, "quorum": [ 0, 1, 2 ], "quorum_names": [ "ceph1.dyx.cloud", "ceph2", "ceph3" ], "quorum_leader_name": "ceph1.dyx.cloud", "quorum_age": 4356, "features": { "quorum_con": "4540138314316775423", "quorum_mon": [ "kraken", "luminous", "mimic", "osdmap-prune", "nautilus", "octopus", "pacific", "elector-pinging" ] }, "monmap": { "epoch": 3, "fsid": "bc5b5200-ca79-11f0-9e78-000c2974062f", "modified": "2025-11-26T06:12:52.173729Z", "created": "2025-11-26T03:41:13.397012Z", "min_mon_release": 16, "min_mon_release_name": "pacific", "election_strategy": 1, "disallowed_leaders: ": "", "stretch_mode": false, "tiebreaker_mon": "", "removed_ranks: ": "", "features": { "persistent": [ "kraken", "luminous", "mimic", "osdmap-prune", "nautilus", "octopus", "pacific", "elector-pinging" ], "optional": [] }, "mons": [ { "rank": 0, "name": "ceph1.dyx.cloud", "public_addrs": { "addrvec": [ { "type": "v2", "addr": "192.168.108.11:3300", "nonce": 0 }, { "type": "v1", "addr": "192.168.108.11:6789", "nonce": 0 } ] }, "addr": "192.168.108.11:6789/0", "public_addr": "192.168.108.11:6789/0", "priority": 0, "weight": 0, "crush_location": "{}" }, { "rank": 1, "name": "ceph2", "public_addrs": { "addrvec": [ { "type": "v2", "addr": "192.168.108.12:3300", "nonce": 0 }, { "type": "v1", "addr": "192.168.108.12:6789", "nonce": 0 } ] }, "addr": "192.168.108.12:6789/0", "public_addr": "192.168.108.12:6789/0", "priority": 0, "weight": 0, "crush_location": "{}" }, { "rank": 2, "name": "ceph3", "public_addrs": { "addrvec": [ { "type": "v2", "addr": "192.168.108.13:3300", "nonce": 0 }, { "type": "v1", "addr": "192.168.108.13:6789", "nonce": 0 } ] }, "addr": "192.168.108.13:6789/0", "public_addr": "192.168.108.13:6789/0", "priority": 0, "weight": 0, "crush_location": "{}" } ] } } -
控制面板中查看 MON 的状态:单击Cluster > Monitor。

分析监控器映射
Ceph 集群映射包含:
-
MON 映射
-
OSD 映射
-
PG 映射
-
MDS 映射
-
CRUSH 映射
MON 映射包含:
- 集群 fsid(文件系统 ID),fsid 是一种自动生成的唯一标识符 (UUID),用于标识 Ceph 集群。
- 各个 MON 节点通信的名称、IP 地址和网络端口。
- 映射版本信息,如 epoch 和最近一次更改时间。MON 节点通过同步更改并就当前版本达成一致来维护映射。
查看当前的 MON 映射
bash
[root@ceph1 ~ 15:17:08]# ceph mon dump
epoch 3
fsid bc5b5200-ca79-11f0-9e78-000c2974062f
last_changed 2025-11-26T06:12:52.173729+0000
created 2025-11-26T03:41:13.397012+0000
min_mon_release 16 (pacific)
election_strategy: 1
0: [v2:192.168.108.11:3300/0,v1:192.168.108.11:6789/0] mon.ceph1.dyx.cloud
1: [v2:192.168.108.12:3300/0,v1:192.168.108.12:6789/0] mon.ceph2
2: [v2:192.168.108.13:3300/0,v1:192.168.108.13:6789/0] mon.ceph3
dumped monmap epoch 3
管理集中配置数据库
MON 节点存储和维护集中配置数据库。数据库文件位于 MON 节点,默认位置是:
/var/lib/ceph/$fsid/mon.$host/store.db 。
**注意:**不建议更改数据库的位置。
数据库文件会不断增大,改进措施:
-
运行 ceph tell mon.$id compact 命令,整合数据库,以提高性能。
bash[root@ceph1 ~ 15:17:20]# ceph tell mon.ceph1.dyx.cloud compact compacted rocksdb in 0 seconds -
将
mon_compact_on_start配置选项为 TRUE ,以便在每次守护进程启动时压缩数据库。bash[root@ceph1 ~ 15:17:40]# ceph config get mon mon_compact_on_start false [root@ceph1 ~ 15:18:07]# ceph config set mon mon_compact_on_start true [root@ceph1 ~ 15:18:30]# ceph config get mon mon_compact_on_start true
设置以下数据库文件大小相关定义,以触发运行状况变化:
-
mon_data_size_warn ,当配置数据库文件的大小超过此值时,集群运行状况更改为HEALTH_WARN 。默认值15 (GB)。
-
mon_data_avail_warn ,当包含配置数据库文件的文件系统剩余容量小于或等于此百分比时,将集群运行状况更改为 HEALTH_WARN 。默认值是30 (%)。
-
mon_data_avail_crit ,当包含配置数据库的文件系统剩余容量小于或等于此百分比 时,将集群运行状况更改为 HEALTH_ERR 。默认值是5 (%)。
集群验证
Ceph 默认使用 Cephx 协议进行加密身份验证,同时使用共享密钥进行身份验证。默认情况下,Ceph会启用 Cephx。如有必要,可以禁用 Cephx,但不建议这样做,因为这样会减弱集群的安全性。
使用 ceph config set 命令启用或禁用 Cephx 协议。
bash
[root@ceph1 ~ 15:18:33]# ceph config get mon auth_service_required
cephx
[root@ceph1 ~ 15:18:58]# ceph config get mon auth_cluster_required
cephx
[root@ceph1 ~ 15:19:07]# ceph config get mon auth_client_required
cephx, none
参数说明:
-
auth_service_required,客户端与Ceph services之间通信认证。可用值 cephx 和 none 。
-
auth_cluster_required,Ceph集群守护进程之间通信认证,例如 ceph-mon , ceph-osd , ceph-mds , ceph-mgr 。可用值 cephx 和 none 。
-
auth_client_required,客户端与Ceph集群之间通信认证。可用值 cephx 和 none 。
官方原话:If this configuration setting is enabled, then Ceph clients can access Ceph services only if those clients authenticate with the Ceph Storage Cluster. Valid settings are cephx or none .
cephadm 工具创建 client.admin 用户,让用户能够运行管理命令并创建其他 Ceph 客户端用户帐户,用户密钥环存储在 /etc/ceph 目录中。
bash
[root@ceph1 ~ 15:19:15]# ls /etc/ceph
ceph.client.admin.keyring ceph.conf ceph.pub rbdmap
守护进程数据目录包含 Cephx 密钥环文件。对于 MON,密钥环文件是:
/var/lib/ceph/ f s i d / m o n . fsid/mon. fsid/mon.host/keyring。
bash
[root@ceph1 ~ 15:21:30]# ls /var/lib/ceph/bc5b5200-ca79-11f0-9e78-000c2974062f/mon.ceph1.dyx.cloud/keyring
/var/lib/ceph/bc5b5200-ca79-11f0-9e78-000c2974062f/mon.ceph1.dyx.cloud/keyring
**密钥环文件以纯文本形式存储机密密钥。**务必使用合适的 Linux 文件权限来保护它们的安全。
使用ceph auth命令创建、查看和管理集群
使用 ceph-authtool 命令创建密钥环文件。
示例:为 MON 节点创建一个密钥环文件。
bash
[root@ceph1 ~ 15:21:36]# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow*'
creating /tmp/ceph.mon.keyring
# --create-keyring /tmp/ceph.mon.keyring
创建一个新的密钥环文件(Keyring),路径为 /tmp/ceph.mon.keyring。
# --gen-key -n mon.
生成一个新密钥(--gen-key)。
-n mon. 指定密钥关联的实体名称(Entity Name),这里是 mon.(表示 Monitor 守护进程)。
注意:实体名称通常以守护进程类型开头(如 mon.、osd.),后接节点标识符(如 mon.a)。
# --cap mon 'allow *'
为该密钥分配权限(Capabilities):
mon 表示权限作用于 Monitor 服务。
'allow *' 授予 所有 Monitor 操作的完全权限(如访问集群状态、修改配置等)。
第四章 Ceph 分布式存储 池管理
Ceph 数据组织结构

POOL
池是 Ceph 存储集群的逻辑分区,用于在通用名称标签下存储对象。 Ceph 为每个池分配特定数量放置
组 (PG),用于对对象进行分组以进行存储。
每个池具有以下可调整属性:
- 池 ID
- 池名称
- PG 数量
- CRUSH 规则,用于确定此池的 PG 映射
- 保护类型(复本或擦除编码
- 与保护类型相关的参数
- 影响集群行为的各种标志
Place Group
PG 全称为Placement group, 是构成pool的子集, 也是一系列对象的集合。一个PG仅能属于一个Pool。
Ceph 将每个 PG 映射到一组 OSD。属于同一个 PG 的所有对象都返回相同的哈希结果。
PG 数量会影响ceph的性能:
-
如果pg数量过多,数据移动时,每个PG维护的数据量过少, ceph占用大量的cpu 和内存计算,影响集群正常客户端使用。
-
如果pg数量过少,单个pg存储的数据就越多,移动pg会占用大量带宽,影响集群客户端使用
在以前版本中, PG的计算公式为:
-
Ceph集群PG 总数 = (OSD 数 * 100) / 最大副本数
-
单个资源池PG总数 = (OSD 数 * 100) / 最大副本数 / 池数
以上公式中计算出的结果必须舍入到最接近2的N次幂的值。
一般情况下,PG数量设置遵循以下原则:
-
如果OSD少于5个时, PG 数量设置为128
-
OSD数量大于5小于10时, PG数量设置为512
-
OSD数量大于10小于50时, PG数量设置为4096
-
如果osd数量大于50,则需要借助工具进行计算,官方工具链接为: https://old.ceph.com/pgcalc/。
映射对象到OSD
客户端在进行数据读写时, 仅需向ceph提供资源池(pool)的名称和对象ID。一个完整的对象由三部分组成:对象ID、二进制数据、对象元数据。

-
Ceph 客户端从 MON **获取最新的集群映射复本。**集群映射向客户端提供有关集群中所有 MON、OSD 和 MDS 的信息,但不向客户提供对象的位置。
-
计算 PG ID。公式:PG ID=hash(Object ID)%(PG number)。
为了计算PG ID,Ceph需要知道对象存储池的名称和对象ID:根据池的名称获取池的PG数量,然后对Ceph对象 ID 做hash运算,最终计算出PG ID。
-
Ceph 使用 CRUSH 算法确定PG负责哪些OSDs(Acting Set)。 Acting Set 中的 OSD 在 Up Set中。 Up Set 中的第一个 OSD 是对象归置组的当前主 OSD,Up Set 中的其他 OSD 是辅助 OSD。
-
Ceph 客户端直接跟主 OSD 通信以读写对象。
客户端访问ceph流程
-
客户端向MON集群发起连接请求。
-
客户端和MON建立连接后,它将索引最新版本的cluster map,从而获取到MON、 OSD和MDS的信息,但不包括对象的存储位置。
-
client根据CRUSH算法计算出对象对应的PG和OSD。
-
client根据上步中计算得出主OSD的位置,然后和其进行通信,完成对象的读写。

在 ceph 中,客户端自行计算对象存储位置的速度要比通过和ceph组件交互来查询对象存储位置快很多,因此,在数据读写时,都是客户端根据CRUSH完成对象的位置计算。
Ceph 数据读取流程
- 客户端通过MON获取到cluster map。
- client通过cluster map获取到主OSD节点信息,并向其发送读取请求。
- 主OSD将client请求的数据返回给client。

Ceph 数据写入流程
- 客户端通过 MON 获取到 cluster map。
- 客户端通过cluster map获取到主OSD节点信息,并向其发送写入请求。
- 主OSD收到写入请求后,将数据写入,并向两个备OSD发起数据写入指令。
- 两个备OSD将数据写入后返回确认到主OSD。
- 主OSD收到所有备OSD写入完成后的确认后,向客户端返回写入完成的确认。

Ceph 采用数据强一致性来保证数据的同步。强一致性会导致数据写入有较大的延迟,因此ceph进行了优化,将数据的写入分两次进行:
-
第一次当所有数据都写入OSD节点的缓存后,向client发送一次确认, client就会认为数据写入完成,继续进行后面操作。
-
第二次当所有数据都从缓存写入到磁盘后,再向client发送一次确认, client就会认为数据彻底写入,从而根据需要删除对应的本地数据。
数据保护
Ceph 存储支持:复本池 和纠删码池。

-
replicated pool**(复本池**),通过将各个对象复本到多个 OSD 来发挥作用。此池类型会创建多个对象复本,需要较多存储空间,但其通过冗余提高了读取操作的可用性。
-
Erasure code pool**(纠删代码池)**,需要较少的存储空间和网络带宽,但因为要进行奇偶校验计算,所以会占用较多的 CPU处理时间。
注意:池一旦创建完成,池的类型便无法更改。
池类型选择:
-
对于不需要频繁访问且不需要低延迟的数据,推荐使用纠删代码池。
-
对于需要频繁访问并且要具备快速读取性能的数据,推荐使用复本池。
创建池
创建复本池
Ceph 为每个对象创建多个复本来保护复本池中的数据。Ceph 使用CRUSH 故障域来确定存储数据的操作集的主要 OSD。然后,主要 OSD 会查找池的当前复本数量,并计算要写入对象的次要 OSD。在主要OSD 收到写入确认并完成数据写入后,主要 OSD 会向 Ceph 客户端确认写入操作已成功。如果一个或多个 OSD 出现故障,这一过程可保护对象中的数据。
创建复本池语法:
bash
ceph osd pool create pool-name pg-num pgp-num replicated crush-rule-name
其中:
-
pool_name,指定新池的名称。
-
pg_num,指定池的放置组 (PG) 总数。
-
pgp_num,指定池的有效放置组数量。将它设置为与 pg_num 相等。该值可省略。
-
replicated ,指定池的类型为复本池;如果命令中未包含此参数,这是默认值。
-
crush-rule-name,指定池的 CRUSH 规则集的名称。
osd_pool_default_crush_replicated_ruleset 配置参数设置其默认值。
示例:
bash
[root@ceph1 ~ 16:16:38]# ceph osd pool create pool_web 32 32 replicated
pool 'pool_web' created
[root@ceph1 ~ 16:17:16]# ceph osd pool ls
device_health_metrics
pool_web
创建纠删代码池
纠删代码池使用纠删代码保护对象数据。 在纠删代码池中存储的对象分割为多个数据区块,这些数据区块存储在不同的 OSD 中。编码块的数量是根据数据块计算的,并存储在不同的 OSD 中。当 OSD 出现故障时,可利用编码块重构对象数据。主要 OSD 接收写入操作,然后将载荷编码为 K+M 块,并将它们发给纠删代码池中的次要OSD。
以下概括了纠删代码池的工作方式:
-
每个对象的数据分割为 k 个数据区块,计算出 m 个编码区块。
-
对象存储在总共 k + m 个 OSD 中。
-
编码区块大小与数据区块大小相同。

与复本相比,纠删代码使用存储容量的效率更高。复本池维护对象的 n 个复本,而纠删代码仅维护 k +m 个区块。
例如,具有 3 个复本的复本池要使用 3 倍存储空间。而 k=4 和 m=2 的纠删代码池仅要使用 1.5 倍存储空间。
支持以下 k+m 值,其对应的可用与原始比为:
-
4+2(比率为 1:1.5)
-
8+3(比率为 1:1.375)
-
8+4(比率为 1:1.5)
纠删代码池有效容量百分比:k / (k+m)。例如,如果用户有 64 个 OSD(每个 4 TB,总计 256 TB)并且k=8 和 m=4,那么公式为 8 / (8+4) * 64 * 4 = 170.67。然后,将原始存储容量除以开销就能得出该比率。256 TB/170.67 TB 等于 1.5 比率。
创建纠删代码池语法:
bash
ceph osd pool create pool-name pg-num pgp-num erasure erasure-code-profile crushrule-name
-
pool-name,指定新池的名称。
-
pg-num,指定池的放置组 (PG) 总数。
-
pgp-num,指定池的有效放置组数量。通常而言,这应当与 PG 总数相等。
-
erasure,指定池的类型是纠删代码池。
-
erasure-code-profile,指定池使用的纠删代码配置文件的名称。默认情况下,Ceph 使用 default配置文件。
-
crush-rule-name 是要用于这个池的 CRUSH 规则集的名称。如果不设置,Ceph 将使用纠删代码池配置文件中定义的规则集。
**纠删代码池无法使用对象映射功能。**对象映射是对象的一个索引,用于跟踪 rbd 对象的块会被分配到哪里,可用于提高大小调整、导出、扁平化和其他操作的性能。
示例:
bash
[root@ceph1 ~ 16:17:26]# ceph osd pool create pool_era 32 32 erasure
pool 'pool_era' created
[root@ceph1 ~ 16:17:53]# ceph osd pool ls
device_health_metrics
pool_web
pool_era
查看默认纠删代码配置
bash
[root@ceph1 ~ 09:30:36]# ceph osd pool ls
device_health_metrics
pool_web
pool_era
[root@ceph1 ~ 09:30:50]# ceph osd erasure-code-profile ls
default
[root@ceph1 ~ 09:31:10]# ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van
管理纠删代码配置文件
纠删代码配置文件可配置纠删代码池用于存储对象的数据区块和编码区块的数量,以及要使用的纠删代码插件和算法。
创建纠删代码配置文件语法如下:
bash
ceph osd erasure-code-profile set profile-name arguments
可用的参数如下:
-
k,在不同 OSD 之间拆分的数据区块数量。默认值为 2。
-
m,数据变得不可用之前可以出现故障的 OSD 数量。默认值为 1。
-
directory,此可选参数是插件库的位置。默认值为 /usr/lib64/ceph/erasure-code。
-
plugin,此可选参数定义要使用的纠删代码算法。
-
crush-failure-domain,此可选参数定义 CRUSH 故障域,它控制区块放置。默认设置为 host,这样可确保对象的区块放置到不同主机的 OSD 上。如果设置为 osd,则对象的区块可以放置到同一主机的 OSD 上。如果主机出现故障,则该主机上的所有 OSD 都会出现故障。故障域可用于确保将区块放置到不同数据中心机架或其他定制的主机上的 OSD 上。
-
crush-device-class,此可选参数选择仅将这一类别设备支持的 OSD 用于池。典型的类别可能包括 hdd、ssd 或nvme。
-
crush-root,此可选参数设置 CRUSH 规则集的根节点。
-
key=value,插件可以具有对该插件唯一的键值参数。
-
technique,每个插件提供一组不同的技术来实施不同的算法。
示例:
bash
[root@ceph1 ~ 09:31:22]# ceph osd erasure-code-profile set ceph k=4 m=2
列出现有的就删代码配置文件
bash
[root@ceph1 ~ 09:31:50]# ceph osd erasure-code-profile ls
ceph
default
Ceph 会在安装期间创建 default 配置文件。这个配置文件已配置为将对象分割为2个数据区块和2个编码区块。
查看现有配置文件的详细信息
bash
[root@ceph1 ~ 09:31:57]# ceph osd erasure-code-profile get ceph
crush-device-class=
crush-failure-domain=host
crush-root=default
jerasure-per-chunk-alignment=false
k=4
m=2
plugin=jerasure
technique=reed_sol_van
w=8
删除现有的配置文件
bash
[root@ceph1 ~ 09:32:05]# ceph osd erasure-code-profile rm ceph
[root@ceph1 ~ 09:32:21]# ceph osd erasure-code-profile ls
default
重要:现有纠删代码配置文件是无法修改或更改,只能创建新的配置文件。
查看 池 状态
使用 ceph osd pool ls 命令,可以列出池清单。
bash
[root@ceph1 ~ 09:58:39]# ceph osd pool ls
device_health_metrics
pool_web
pool_era
使用 ceph osd pool ls detail 命令,可以列出池清单和池的详细配置。
bash
[root@ceph1 ~ 09:58:49]# ceph osd pool ls detail
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 61 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool_web' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 48 flags hashpspool stripe_width 0
pool 3 'pool_era' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 52 flags hashpspool stripe_width 8192
使用 ceph osd lspools 命令,也可以列出池清单。
bash
[root@ceph1 ~ 09:58:58]# ceph osd lspools
1 device_health_metrics
2 pool_web
3 pool_era
使用 ceph osd pool stats 命令,可以列出池状态信息,池被哪些客户端使用。
bash
[root@ceph1 ~ 09:59:09]# ceph osd pool stats
pool device_health_metrics id 1
nothing is going on
pool pool_web id 2
nothing is going on
pool pool_era id 3
nothing is going on
使用 ceph df 命令,可以查看池容量使用信息。
bash
[root@ceph1 ~ 09:59:19]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 180 GiB 177 GiB 2.6 GiB 2.6 GiB 1.42
TOTAL 180 GiB 177 GiB 2.6 GiB 2.6 GiB 1.42
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 8.5 KiB 3 25 KiB 0 56 GiB
pool_web 2 32 0 B 0 0 B 0 56 GiB
pool_era 3 32 0 B 0 0 B 0 84 GiB
管理 池
管理 池 应用类型
使用 ceph osd pool application 命令,管理池 Ceph 应用类型。应用类型有cephfs(用于 Ceph 文件系统) 、rbd(Ceph 块设备)和 rgw(RADOS 网关)。
bash
[root@ceph1 ~ 09:59:31]# ceph osd pool application <tab><tab>
disable enable get rm set
# 启用池的类型为rbd
[root@ceph1 ~ 09:59:31]# ceph osd pool application enable pool_web rbd
enabled application 'rbd' on pool 'pool_web'
[root@ceph1 ~ 10:00:17]# ceph osd pool ls detail
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 61 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool_web' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 68 flags hashpspool stripe_width 0 `application rbd`
pool 3 'pool_era' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 52 flags hashpspool stripe_width 8192
[root@ceph1 ~ 10:00:30]# ceph osd pool ls detail|grep pool_web
pool 2 'pool_web' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 68 flags hashpspool stripe_width 0 `application rbd`
# 使用set子命令,设置池的应用类型详细配置
[root@ceph1 ~ 10:00:43]# ceph osd pool application set pool_web rbd app1 apache
set application 'rbd' key 'app1' to 'apache' on pool 'pool_web'
# 这里添加的设置,app1=apache仅供参考,没有实际意义。
# 使用get子命令,查看池的应用类型详细配置
[root@ceph1 ~ 10:01:16]# ceph osd pool application get pool_web
{
"rbd": {
"app1": "apache"
}
}
# 使用rm子命令,删除池的应用类型详细配置
[root@ceph1 ~ 10:01:34]# ceph osd pool application rm pool_web rbd app1
removed application 'rbd' key 'app1' on pool 'pool_web'
[root@ceph1 ~ 10:01:54]# ceph osd pool ls
device_health_metrics
pool_web
pool_era
[root@ceph1 ~ 10:02:02]# ceph osd pool ls detail
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 61 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
`pool 2 'pool_web' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 70 flags `hashpspool stripe_width 0 application rbd
pool 3 'pool_era' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 52 flags hashpspool stripe_width 8192
# 禁用池的类型
[root@ceph1 ~ 10:02:51]# ceph osd pool application disable pool_web rbd --yes-i-really-mean-it
disable application 'rbd' on pool 'pool_web'
[root@ceph1 ~ 10:03:08]# ceph osd pool ls detail
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 61 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool_web' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 71 flags hashpspool stripe_width 0
pool 3 'pool_era' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 52 flags hashpspool stripe_width 8192
管理 池 配额
使用 ceph osd pool get-quota 命令,获取池配额信息:池中能够存储的最大字节数或最大对象数量。
bash
[root@ceph1 ~ 19:26:26]# ceph osd pool get-quota images_pool
quotas for pool 'images_pool':
max objects: N/A
max bytes : N/A
使用 ceph osd pool set-quota 命令,可以设置池配额来限制池中能够存储的最大字节数或最大对象数量。
bash
[root@ceph1 ~ 19:30:05]# ceph osd pool set-quota images_pool max_objects 100000
set-quota max_objects = 100000 for pool images_pool
[root@ceph1 ~ 19:30:39]# ceph osd pool set-quota images_pool max_bytes 10G
set-quota max_bytes = 10737418240 for pool images_pool
[root@ceph1 ~ 19:30:59]# ceph osd pool get-quota images_pool
quotas for pool 'images_pool':
max objects: 100k objects (current num objects: 83 objects)
max bytes : 10 GiB (current num bytes: 64111841 bytes)
当池使用量达到池配额时,操作将被阻止。用户可通过将该值设置为 0 来删除配额。
bash
[root@ceph1 ~ 19:31:24]# ceph osd pool set-quota images_pool max_objects 0
set-quota max_objects = 0 for pool images_pool
[root@ceph1 ~ 19:31:33]# ceph osd pool set-quota images_pool max_bytes 0
set-quota max_bytes = 0 for pool images_pool
[root@ceph1 ~ 19:31:39]# ceph osd pool get-quota images_pool
quotas for pool 'images_pool':
max objects: N/A
max bytes : N/A
管理 池 配置
查看池配置
使用 ceph osd pool get 命令,查看池配置。
bash
[root@ceph1 ~ 10:43:37]# ceph osd pool set pool_web nodelete true
set pool 2 nodelete to true
# 查看池所有配置
[root@ceph1 ~ 10:42:20]# ceph osd pool get pool_web all
#副本数3
size: 3
min_size: 2
pg_num: 32
pgp_num: 32
crush_rule: replicated_rule
hashpspool: true
nodelete: false
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
bulk: false
# 查看池特定配置
[root@ceph1 ~ 10:44:43]# ceph osd pool get pool_web nodelete
nodelete: false
# 备用命令
[root@ceph1 ~ 10:44:48]# ceph osd pool get pool_web all | grep nodelete
nodelete: false
设置池配置
使用 ceph osd pool set 命令,可以修改池配置选项
bash
[root@ceph1 ~ 10:44:31]# ceph osd pool set pool_web nodelete false
set pool 2 nodelete to false
[root@ceph1 ~ 10:44:43]# ceph osd pool get pool_web nodelete
nodelete: false# 设置池不可删除
[root@ceph1 ~ 10:43:37]# ceph osd pool set pool_web nodelete true
set pool 2 nodelete to true
[root@ceph1 ~ 10:43:53]# ceph osd pool get pool_web nodelete
nodelete: true
# 将 nodelete 重新设置为 FALSE,即可允许删除池
[root@ceph1 ~ 10:44:31]# ceph osd pool set pool_web nodelete false
set pool 2 nodelete to false
[root@ceph1 ~ 10:44:43]# ceph osd pool get pool_web nodelete
nodelete: false
管理 池 复本数
使用以下命令,更改池的复本数量。
bash
[root@ceph1 ~ 10:44:50]# ceph osd pool set pool_web size 2
set pool 2 size to 2
[root@ceph1 ~ 10:45:05]# ceph osd pool get pool_web all
#这里确实从之前的3变成了2
size: 2
min_size: 1
pg_num: 32
pgp_num: 32
crush_rule: replicated_rule
hashpspool: true
nodelete: false
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
bulk: false
池的默认复本数量由 osd_pool_default_size 配置参数定义,默认值为 3。
bash
[root@ceph1 ~ 10:45:16]# ceph config get mon osd_pool_default_size
3
使用以下命令定义创建新池的默认复本数量。
bash
[root@ceph1 ~ 10:45:49]# ceph config set mon osd_pool_default_size 2
[root@ceph1 ~ 10:46:09]# ceph config get mon osd_pool_default_size
2
osd_pool_default_min_size 参数定义集群必须提供多少个对象复本才能接受 I/O 请求。复本数为3的池,该值为2;复本数为2的池,该值为1。
使用以下命令定义池的最小复本数量。
bash
#参数值为0是特殊设置,意味着集群将自动使用存储池的size值作为最小副本数,举例说明:如果某存储池size=3,那么min_size会自动设为2(即size/2+1取整)
[root@ceph1 ~ 10:46:14]# ceph config get mon osd_pool_default_min_size
0
[root@ceph1 ~ 10:46:41]# ceph config set mon osd_pool_default_min_size 1
[root@ceph1 ~ 10:47:02]# ceph config get mon osd_pool_default_min_size
1
管理 池 PG 数
使用以下命令,更改池 PG 数量。
bash
[root@ceph1 ~ 10:47:06]# ceph osd pool set pool_web pg_num 64
set pool 2 pg_num to 64
[root@ceph1 ~ 10:48:05]# ceph osd pool get pool_web all
size: 2
min_size: 1
#确实PG变为了64
`pg_num: 64`
pgp_num: 64
crush_rule: replicated_rule
hashpspool: true
nodelete: false
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
bulk: false
Ceph **存储默认在池上配置放置组自动扩展。**自动扩展允许集群计算放置组的数量,并且自动选择适当的pg_num 值。
集群中的每个池都有一个 pg_autoscale_mode 选项,其值可以是 on、off 或 warn。
-
on:启用自动调整池的 PG 数。
-
off:禁用池的 PG 自动扩展。
-
warn:在 PG 数需要调整时引发运行状况警报并将集群运行状况更改为 HEALTH_WARN。
集群配置放置组自动扩展,需要在 Ceph MGR 节点上启用 pg_autoscaler 模块,并将池的自动扩展模式
设置为 on:
bash
[root@ceph1 ~ 10:48:19]# ceph mgr module enable pg_autoscaler
module 'pg_autoscaler' is already enabled (always-on)
#pool_web池pb_autoscale_mode设置为off
[root@ceph1 ~ 10:48:44]# ceph osd pool set pool_web pg_autoscale_mode off
set pool 2 pg_autoscale_mode to off
[root@ceph1 ~ 10:49:09]# ceph osd pool autoscale-status
POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE BULK
device_health_metrics 8666 3.0 179.9G 0.0000 1.0 1 on False
pool_web 0 2.0 179.9G 0.0000 1.0 64 off False
pool_era 0 2.0 179.9G 0.0000 1.0 32 on False
[root@ceph1 ~ 10:49:25]# ceph osd pool set pool_web pg_autoscale_mode on
set pool 2 pg_autoscale_mode to on
[root@ceph1 ~ 10:49:51]# ceph osd pool autoscale-status
POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE BULK
device_health_metrics 8666 3.0 179.9G 0.0000 1.0 1 on False
pool_web 0 2.0 179.9G 0.0000 1.0 64 on False
pool_era 0 2.0 179.9G 0.0000 1.0 32 on False
可以在集群级别为新创建的池设置一些默认值:
-
osd_pool_default_flag_nodelete,为池设置 nodelete 标志的默认值。将值设置为 TRUE 可以防止删除池。
-
osd_pool_default_flag_nopgchange,为池设置 nopgchange 标志的默认值。将值设置为 TRUE可以防止更改 pg_num 和pgp_num。
-
osd_pool_default_flag_nosizechange,为池设置 nosizechange 标志的默认值。将值设置为TRUE 可以防止更改池大小。
以上这些参数需要配置在ceph集群配置ceph.conf的global块中。
管理 池 中对象
Ceph使用 rados 命令管理池的对象。
bash
[root@ceph1 ~ 11:20:39]# rados -h
usage: rados [options] [commands]
POOL COMMANDS
lspools list pools
cppool <pool-name> <dest-pool> copy content of a pool
purge <pool-name> --yes-i-really-really-mean-it
remove all objects from pool <pool-name> without removing it
df show per-pool and total usage
ls list objects in pool
POOL SNAP COMMANDS
lssnap list snaps
mksnap <snap-name> create snap <snap-name>
rmsnap <snap-name> remove snap <snap-name>
OBJECT COMMANDS
get <obj-name> <outfile> fetch object
put <obj-name> <infile> [--offset offset]
write object with start offset (default:0)
append <obj-name> <infile> append object
truncate <obj-name> length truncate object
create <obj-name> create object
rm <obj-name> ... [--force-full] remove object(s), --force-full forces remove when cluster is full
cp <obj-name> [target-obj] copy object
listxattr <obj-name>
getxattr <obj-name> attr
setxattr <obj-name> attr val
rmxattr <obj-name> attr
stat <obj-name> stat the named object
stat2 <obj-name> stat2 the named object (with high precision time)
touch <obj-name> [timestamp] change the named object modification time
mapext <obj-name>
rollback <obj-name> <snap-name> roll back object to snap <snap-name>
listsnaps <obj-name> list the snapshots of this object
bench <seconds> write|seq|rand [-t concurrent_operations] [--no-cleanup] [--run-name run_name] [--no-hints] [--reuse-bench]
default is 16 concurrent IOs and 4 MB ops
default is to clean up after write benchmark
default run-name is 'benchmark_last_metadata'
cleanup [--run-name run_name] [--prefix prefix]
clean up a previous benchmark operation
default run-name is 'benchmark_last_metadata'
load-gen [options] generate load on the cluster
listomapkeys <obj-name> list the keys in the object map
listomapvals <obj-name> list the keys and vals in the object map
getomapval <obj-name> <key> [file] show the value for the specified key
in the object's object map
setomapval <obj-name> <key> <val | --input-file file>
rmomapkey <obj-name> <key>
clearomap <obj-name> [obj-name2 obj-name3...] clear all the omap keys for the specified objects
getomapheader <obj-name> [file]
setomapheader <obj-name> <val>
watch <obj-name> add watcher on this object
notify <obj-name> <message> notify watcher of this object with message
listwatchers <obj-name> list the watchers of this object
set-alloc-hint <obj-name> <expected-object-size> <expected-write-size>
set allocation hint for an object
set-redirect <object A> --target-pool <caspool> <target object A> [--with-reference]
set redirect target
set-chunk <object A> <offset> <length> --target-pool <caspool> <target object A> <taget-offset> [--with-reference]
convert an object to chunked object
tier-promote <obj-name> promote the object to the base tier
unset-manifest <obj-name> unset redirect or chunked object
tier-flush <obj-name> flush the chunked object
tier-evict <obj-name> evict the chunked object
IMPORT AND EXPORT
export [filename]
Serialize pool contents to a file or standard out.
import [--dry-run] [--no-overwrite] < filename | - >
Load pool contents from a file or standard in
ADVISORY LOCKS
lock list <obj-name>
List all advisory locks on an object
lock get <obj-name> <lock-name> [--lock-cookie locker-cookie] [--lock-tag locker-tag] [--lock-description locker-desc] [--lock-duration locker-dur] [--lock-type locker-type]
Try to acquire a lock
lock break <obj-name> <lock-name> <locker-name> [--lock-cookie locker-cookie]
Try to break a lock acquired by another client
lock info <obj-name> <lock-name>
Show lock information
options:
--lock-tag Lock tag, all locks operation should use
the same tag
--lock-cookie Locker cookie
--lock-description Description of lock
--lock-duration Lock duration (in seconds)
--lock-type Lock type (shared, exclusive)
SCRUB AND REPAIR:
list-inconsistent-pg <pool> list inconsistent PGs in given pool
list-inconsistent-obj <pgid> list inconsistent objects in given PG
list-inconsistent-snapset <pgid> list inconsistent snapsets in the given PG
CACHE POOLS: (for testing/development only)
cache-flush <obj-name> flush cache pool object (blocking)
cache-try-flush <obj-name> flush cache pool object (non-blocking)
cache-evict <obj-name> evict cache pool object
cache-flush-evict-all flush+evict all objects
cache-try-flush-evict-all try-flush+evict all objects
GLOBAL OPTIONS:
--object-locator object_locator
set object_locator for operation
-p pool
--pool=pool
select given pool by name
--target-pool=pool
select target pool by name
--pgid PG id
select given PG id
-f [--format plain|json|json-pretty]
--format=[--format plain|json|json-pretty]
-b op_size
set the block size for put/get ops and for write benchmarking
-O object_size
set the object size for put/get ops and for write benchmarking
--max-objects
set the max number of objects for write benchmarking
--obj-name-file file
use the content of the specified file in place of <obj-name>
-s name
--snap name
select given snap name for (read) IO
--input-file file
use the content of the specified file in place of <val>
--create
create the pool or directory that was specified
-N namespace
--namespace=namespace
specify the namespace to use for the object
--all
Use with ls to list objects in all namespaces
Put in CEPH_ARGS environment variable to make this the default
--default
Use with ls to list objects in default namespace
Takes precedence over --all in case --all is in environment
--target-locator
Use with cp to specify the locator of the new object
--target-nspace
Use with cp to specify the namespace of the new object
--striper
Use radostriper interface rather than pure rados
Available for stat, get, put, truncate, rm, ls and
all xattr related operations
BENCH OPTIONS:
-t N
--concurrent-ios=N
Set number of concurrent I/O operations
--show-time
prefix output with date/time
--no-verify
do not verify contents of read objects
--write-object
write contents to the objects
--write-omap
write contents to the omap
--write-xattr
write contents to the extended attributes
LOAD GEN OPTIONS:
--num-objects total number of objects
--min-object-size min object size
--max-object-size max object size
--min-op-len min io size of operations
--max-op-len max io size of operations
--max-ops max number of operations
--max-backlog max backlog size
--read-percent percent of operations that are read
--target-throughput target throughput (in bytes)
--run-length total time (in seconds)
--offset-align at what boundary to align random op offsets
CACHE POOLS OPTIONS:
--with-clones include clones when doing flush or evict
OMAP OPTIONS:
--omap-key-file file read the omap key from a file
GENERIC OPTIONS:
--conf/-c FILE read configuration from the given configuration file
--id ID set ID portion of my name
--name/-n TYPE.ID set name
--cluster NAME set cluster name (default: ceph)
--setuser USER set uid to user or uid (and gid to user's gid)
--setgroup GROUP set gid to group or gid
--version show version and quit
这里我们主要讲解池中对象操作。
上传对象到池中
bash
[root@ceph1 ~ 11:20:58]# echo dyx1 > hosts1
[root@ceph1 ~ 11:21:11]# rados -p pool_web put hosts hosts1
[root@ceph1 ~ 11:21:28]# rados -p pool_web ls
hosts
查看池中对象状态
bash
[root@ceph1 ~ 11:21:48]# rados -p pool_web stat hosts
pool_web/hosts mtime 2025-11-28T11:21:28.000000+0800, size 5
检索对象到本地
bash
[root@ceph1 ~ 11:22:02]# rados -p pool_web get hosts newhosts
[root@ceph1 ~ 11:22:21]# cat newhosts
dyx1
追加池中对象
bash
[root@ceph1 ~ 11:22:25]# echo dyx2>>hosts2
[root@ceph1 ~ 11:22:38]# rados append -p pool_web hosts hosts2
[root@ceph1 ~ 11:22:57]# raods get hosts newhosts -p pool_web
-bash: raods: command not found
[root@ceph1 ~ 11:23:20]# rados get hosts newhosts -p pool_web
[root@ceph1 ~ 11:23:33]# cat newhosts
dyx1
dyx2
删除池中对象
bash
[root@ceph1 ~ 11:23:37]# rados put passwd /etc/passwd -p pool_web
[root@ceph1 ~ 11:24:11]# rados ls -p pool_web
passwd
hosts
[root@ceph1 ~ 11:24:19]# rados -p pool_web ls
passwd
hosts
[root@ceph1 ~ 11:24:31]# rados rm passwd -p pool_web
[root@ceph1 ~ 11:24:52]# rados -p pool_web ls
hosts
管理 池 快照
使用 ceph osd pool mksnap 命令,创建池快照。
bash
#给池pool_web创建快照snap1
[root@ceph1 ~ 11:38:22]# ceph osd pool mksnap pool_web snap1
created pool pool_web snap snap1
[root@ceph1 ~ 11:38:40]# ceph osd pool ls detail
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 61 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool_web' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode on last_change 86 lfor 0/0/78 flags hashpspool,pool_snaps stripe_width 0
`snap 1 'snap1' 2025-11-28T03:38:39.988333+0000`
pool 3 'pool_era' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 52 flags hashpspool stripe_width 8192
[root@ceph1 ~ 11:38:53]# rados -p pool_web lssnap
1 snap1 2025.11.28 11:38:39
1 snaps
使用 ceph osd pool rmsnap 命令,删除池快照。
bash
[root@ceph1 ~ 11:39:05]# ceph osd pool rmsnap pool_web snap1
removed pool pool_web snap snap1
[root@ceph1 ~ 11:39:25]# ceph osd pool ls detail
pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 1 pgp_num 1 autoscale_mode on last_change 61 flags hashpspool stripe_width 0 pg_num_max 32 pg_num_min 1 application mgr_devicehealth
pool 2 'pool_web' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode on last_change 87 lfor 0/0/78 flags hashpspool,pool_snaps stripe_width 0
pool 3 'pool_era' erasure profile default size 4 min_size 3 crush_rule 1 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 52 flags hashpspool stripe_width 8192
[root@ceph1 ~ 11:40:14]# rados -p pool_web lssnap
0 snaps
管理 池 快照中对象
对池某个快照中对象操作需要使用-s选项指定快照名称。
bash
#给池pool_web拍摄快照snap1
[root@ceph1 ~ 11:40:27]# ceph osd pool mksnap pool_web snap1
created pool pool_web snap snap1
[root@ceph1 ~ 11:40:44]# rados -p pool_web listsnaps hosts
hosts:
cloneid snaps size overlap
head - 10
#拍摄快照后,上传新的内容到hosts中
[root@ceph1 ~ 11:41:03]# echo dyx3 > hosts3
[root@ceph1 ~ 11:41:15]# ls
- anaconda-ks.cfg ceph.pub hosts1 hosts2 hosts3 newhosts
[root@ceph1 ~ 11:41:18]# rados -p pool_web put hosts hosts3
[root@ceph1 ~ 11:41:38]# rados -p pool_web get hosts newhosts
[root@ceph1 ~ 11:41:57]# cat newhosts
dyx3
# 查看快照中对象
[root@ceph1 ~ 11:42:03]# rados ls -p pool_web -s snap1
selected snap 3 'snap1'
hosts
# 获取快照中对象
[root@ceph1 ~ 11:42:16]# rados -p pool_web -s snap1 get hosts hosts-from-snap1
selected snap 3 'snap1'
#发现即使hosts文件拍摄快照后变了,从快照获取的依然没变
[root@ceph1 ~ 11:42:48]# cat hosts-from-snap1
dyx1
dyx2
# 恢复对象内容为指定快照时内容
[root@ceph1 ~ 11:42:55]# rados -p pool_web rollback hosts snap1
rolled back pool pool_web to snapshot snap1
[root@ceph1 ~ 11:43:14]# rados -p pool_web get hosts newhosts
[root@ceph1 ~ 11:43:31]# cat newhosts
dyx1
dyx2
快照是只读文件系统,无法上传和删除快照中对象。
bash
[root@ceph1 ~ 11:43:36]# rados put -p pool_web -s snap1 passwd /etc/passwd
selected snap 3 'snap1'
error putting pool_web/passwd: (30) Read-only file system
[root@ceph1 ~ 11:44:00]# rados ls -p pool_web -s snap1
selected snap 3 'snap1'
hosts
[root@ceph1 ~ 11:44:35]# rados rm -p pool_web -s snap1 hosts
selected snap 3 'snap1'
error removing pool_web>hosts: (30) Read-only file system
管理 池 命名空间
Ceph可以将整个池提供给特定应用。随着应用增加,池的数量也增加。
建议每个 OSD 关联的PG数量为100-200。由于集群中 OSD **数量是有限的,所以PG的数量也是有限的。**创建的池越多,导致池能够分配的PG数量越少,每个PG 将会为更多的对象映射到OSD磁盘,进而导致每个 PG 的计算开销更高(负载更高),从而降低 OSD 性能。
使用命名空间,可以对池中对象进行逻辑分组,还可以限制用户只能存储或检索池中特定命名空间内的对象。借助命名空间,可以让多个应用使用同一个池,而且不必将整个池专用于各个应用,从而确保池的数量不会太多。
命名空间目前仅支持直接使用 librados **的应用。**RBD 和 Ceph 对象网关客户端目前不支持此功能。
若要在命名空间内存储对象,客户端应用必须提供池和命名空间的名称。默认情况下,每个池包含一个具有空名称的命名空间,称为默认命名空间。
示例:
bash
[root@ceph1 ~ 13:55:57]# rados put -p pool_web -N myns1 hostname1 /etc/hostname
[root@ceph1 ~ 13:56:28]# rados ls -p pool_web
hosts
#上传的hsotname1在namespace
[root@ceph1 ~ 13:56:37]# rados ls -p pool_web -N myns1
hostname1
[root@ceph1 ~ 13:56:57]# rados put -p pool_web -N myns2 hostname2 /etc/hostname
[root@ceph1 ~ 13:57:28]# rados ls -p pool_web -N myns2
hostname2
[root@ceph1 ~ 13:57:43]# rados ls -p pool_web --all
myns1 hostname1
hosts
myns2 hostname2
[root@ceph1 ~ 13:57:53]# rados ls -p pool_web --all --format=json-pretty
[
{
"namespace": "myns1",
"name": "hostname1"
},
{
"namespace": "",
"name": "hosts"
},
{
"namespace": "myns2",
"name": "hostname2"
}
]
重命名池
使用 ceph osd pool rename 命令,重命名池。
bash
[root@ceph1 ~ 13:58:23]# ceph osd pool rename pool_web pool_apache
pool 'pool_web' renamed to 'pool_apache'
**重命名池不会影响池中存储的数据。**如果用户重命名池,则会影响池级别的用户权限,则必须使用新的池名称来更新该用户的能力。
删除池
使用 ceph osd pool delete 命令,删除池。
bash
#根据提示需要将pool name输入两次,跟上参数--yes-i-really-really-mean-it
[root@ceph1 ~ 13:58:44]# ceph osd pool rm pool_apache
Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool pool_apache. If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it.
[root@ceph1 ~ 13:58:56]# ceph osd pool rm pool_apache pool_apache --yes-i-really-really-mean-it
pool 'pool_apache' removed
将集群级别 mon_allow_pool_delete 设置为 TRUE 才能删除池。
bash
#子集如是true,则可以删除
[root@ceph1 ~ 13:59:32]# ceph config get mon mon_allow_pool_delete
false
[root@ceph1 ~ 14:00:34]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete
true
重要:删除池会删除池中的所有数据,而且不可逆转。
还可以通过设置池 nodelete 属性为 yes ,防止池被误删除。
bash
# ceph osd pool set pool_apache nodelete true
rados -p pool_web put hosts hosts3
root@ceph1 \~ 11:41:38\]# rados -p pool_web get hosts newhosts \[root@ceph1 \~ 11:41:57\]# cat newhosts dyx3 ## 查看快照中对象 \[root@ceph1 \~ 11:42:03\]# rados ls -p pool_web -s snap1 selected snap 3 'snap1' hosts ## 获取快照中对象 \[root@ceph1 \~ 11:42:16\]# rados -p pool_web -s snap1 get hosts hosts-from-snap1 selected snap 3 'snap1' #发现即使hosts文件拍摄快照后变了,从快照获取的依然没变 \[root@ceph1 \~ 11:42:48\]# cat hosts-from-snap1 dyx1 dyx2 ## 恢复对象内容为指定快照时内容 \[root@ceph1 \~ 11:42:55\]# rados -p pool_web rollback hosts snap1 rolled back pool pool_web to snapshot snap1 \[root@ceph1 \~ 11:43:14\]# rados -p pool_web get hosts newhosts \[root@ceph1 \~ 11:43:31\]# cat newhosts dyx1 dyx2 **快照是只读文件系统**,无法上传和删除快照中对象。 ```bash [root@ceph1 ~ 11:43:36]# rados put -p pool_web -s snap1 passwd /etc/passwd selected snap 3 'snap1' error putting pool_web/passwd: (30) Read-only file system [root@ceph1 ~ 11:44:00]# rados ls -p pool_web -s snap1 selected snap 3 'snap1' hosts [root@ceph1 ~ 11:44:35]# rados rm -p pool_web -s snap1 hosts selected snap 3 'snap1' error removing pool_web>hosts: (30) Read-only file system #### **管理 池 命名空间** Ceph可以将整个池提供给特定应用。随着应用增加,池的数量也增加。 **建议每个** **OSD** **关联的PG数量为100-200。由于集群中** **OSD** \*\*数量是有限的,所以PG的数量也是有限的。\*\*创建的池越多,导致池能够分配的PG数量越少,每个PG 将会为更多的对象映射到OSD磁盘,进而导致每个 PG 的计算开销更高(负载更高),从而降低 OSD 性能。 使用命名空间,可以对池中对象进行逻辑分组,还可以限制用户只能存储或检索池中特定命名空间内的对象。**借助命名空间,可以让多个应用使用同一个池,而且不必将整个池专用于各个应用**,从而确保池的数量不会太多。 > **命名空间目前仅支持直接使用** **librados** \*\*的应用。\*\*RBD 和 Ceph 对象网关客户端目前不支持此功能。 若要在命名空间内存储对象,客户端应用必须提供池和命名空间的名称。默认情况下,**每个池包含一个具有空名称的命名空间,称为默认命名空间。** 示例: ```bash [root@ceph1 ~ 13:55:57]# rados put -p pool_web -N myns1 hostname1 /etc/hostname [root@ceph1 ~ 13:56:28]# rados ls -p pool_web hosts #上传的hsotname1在namespace [root@ceph1 ~ 13:56:37]# rados ls -p pool_web -N myns1 hostname1 [root@ceph1 ~ 13:56:57]# rados put -p pool_web -N myns2 hostname2 /etc/hostname [root@ceph1 ~ 13:57:28]# rados ls -p pool_web -N myns2 hostname2 [root@ceph1 ~ 13:57:43]# rados ls -p pool_web --all myns1 hostname1 hosts myns2 hostname2 [root@ceph1 ~ 13:57:53]# rados ls -p pool_web --all --format=json-pretty [ { "namespace": "myns1", "name": "hostname1" }, { "namespace": "", "name": "hosts" }, { "namespace": "myns2", "name": "hostname2" } ] ``` #### **重命名池** 使用 **ceph osd pool rename** 命令,重命名池。 ```bash [root@ceph1 ~ 13:58:23]# ceph osd pool rename pool_web pool_apache pool 'pool_web' renamed to 'pool_apache' ``` \*\*重命名池不会影响池中存储的数据。\*\*如果用户重命名池,则会影响池级别的用户权限,则必须使用新的池名称来更新该用户的能力。 #### **删除池** 使用 **ceph osd pool delete** 命令,删除池。 ```bash #根据提示需要将pool name输入两次,跟上参数--yes-i-really-really-mean-it [root@ceph1 ~ 13:58:44]# ceph osd pool rm pool_apache Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool pool_apache. If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it. [root@ceph1 ~ 13:58:56]# ceph osd pool rm pool_apache pool_apache --yes-i-really-really-mean-it pool 'pool_apache' removed ``` 将集群级别 **mon_allow_pool_delete** 设置为 TRUE 才能删除池。 ```bash #子集如是true,则可以删除 [root@ceph1 ~ 13:59:32]# ceph config get mon mon_allow_pool_delete false [root@ceph1 ~ 14:00:34]# ceph config get mon.ceph1.dyx.cloud mon_allow_pool_delete true ``` **重要:删除池会删除池中的所有数据,而且不可逆转。** 还可以通过设置池 nodelete 属性为 yes ,防止池被误删除。 ```bash # ceph osd pool set pool_apache nodelete true ```