文章目录
- [第 3 章 Ceph 分布式存储 集群配置](#第 3 章 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)
- 配置集群网络-了解即可
- [第 4 章 Ceph 分布式存储 池管理](#第 4 章 Ceph 分布式存储 池管理)
- [第 5 章 Ceph 分布式存储 认证和授权管理](#第 5 章 Ceph 分布式存储 认证和授权管理)
第 3 章 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] 标头定义的名称,以及一个或多个键值对参数。
ini
[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]。
ini
[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 ~]# ceph config ls
host
fsid
public_addr
public_addrv
public_bind_addr
cluster_addr
public_network
public_network_interface
cluster_network
cluster_network_interface
......
ceph config help <key>
查看集群数据库中特定配置帮助信息。 是 ceph config ls 命令列出的条目。
bash
[root@ceph1 ~]# 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 ~]# 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 ~]# ceph config dump

ceph config show t y p e . type. type.id [<key>]
显示特定守护进程当前生效的设置,包含部分默认设置。
bash
[root@ceph1 ~]# ceph config show mon.ceph1.laogao.cloud
[root@ceph1 ~]# ceph config show mon.ceph1.laogao.cloud public_network
192.168.108.0/24

ceph config show-with-defaults t y p e . type. type.id
显示特定守护进程当前生效的设置,包含默认设置。
bash
[root@ceph1 ~]# ceph config show-with-defaults mon.ceph1.laogao.cloud
NAME VALUE
admin_socket $run_dir/$cluster-$name.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_global_id_reclaim true
auth_mon_ticket_ttl 259200.000000
auth_service_required cephx
auth_service_ticket_ttl 3600.000000
auth_supported
bdev_aio true
......
ceph config get t y p e . type. type.id [<key>]
获得集群数据库中特定配置设置。永久值
bash
[root@ceph1 ~]# ceph config get mon.ceph1.laogao.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 ~]# ceph config get mon.ceph1.laogao.cloud public_network
192.168.108.0/24
ceph config set t y p e . type. type.id <key> <value>
设置集群数据库中特定配置选项。
bash
# 设置特定类型所有实例
[root@ceph1 ~]# ceph config set mon mon_allow_pool_delete false
# 设置特定类型特定实例
[root@ceph1 ~]# ceph config set mon.ceph1.laogao.cloud mon_allow_pool_delete true
[root@ceph1 ~]# ceph config get mon.ceph1.laogao.cloud mon_allow_pool_delete
true
ceph config rm t y p e . type. type.id [<key>]
清除集群数据库中特定配置选项。--删除该参数还原默认配置的意思
bash
[root@ceph1 ~]# ceph config rm mon.ceph1.laogao.cloud mon_allow_pool_delete
[root@ceph1 ~]# ceph config get mon.ceph1.laogao.cloud mon_allow_pool_delete
false
ceph config log [<num:int>]
显示集群最近配置历史记录,默认显示10条,类似于linux中history命令。
bash
[root@ceph1 ~]# ceph config log
--- 16 --- 2025-08-19T08:08:00.450868+0000 ---
- mon.ceph1.laogao.cloud/mon_allow_pool_delete = true
--- 15 --- 2025-08-19T08:07:01.547157+0000 ---
+ mon.ceph1.laogao.cloud/mon_allow_pool_delete = true
--- 14 --- 2025-08-19T08:05:20.097053+0000 ---
+ mon/mon_allow_pool_delete = false
......
# 只显示最近更改的两条记录
[root@ceph1 ~]# ceph config log 2
--- 16 --- 2025-08-19T08:08:00.450868+0000 ---
- mon.ceph1.laogao.cloud/mon_allow_pool_delete = true
--- 15 --- 2025-08-19T08:07:01.547157+0000 ---
+ mon.ceph1.laogao.cloud/mon_allow_pool_delete = true
ceph config reset [<num:int>]
回滚集群数据中特定配置为 num 指定的历史版本。
准备实验环境:
bash
[root@ceph1 ~]# ceph config set mon.ceph1.laogao.cloud mon_allow_pool_delete true #产生log 20记录
[root@ceph1 ~]# ceph config set mon.ceph1.laogao.cloud mon_allow_pool_delete false #产生log 21记录
[root@ceph1 ~]# ceph config get mon.ceph1.laogao.cloud mon_allow_pool_delete
false #此刻为false
[root@ceph1 ~]# ceph config log 2
--- 21 --- 2025-08-19T08:23:11.722223+0000 ---
- mon.ceph1.laogao.cloud/mon_allow_pool_delete = true
+ mon.ceph1.laogao.cloud/mon_allow_pool_delete = false
--- 20 --- 2025-08-19T08:23:07.709101+0000 ---
- mon.ceph1.laogao.cloud/mon_allow_pool_delete = false
+ mon.ceph1.laogao.cloud/mon_allow_pool_delete = true
回滚配置到log 20的版本
bash
[root@ceph1 ~]# ceph config reset 20
[root@ceph1 ~]# ceph config get mon.ceph1.laogao.cloud mon_allow_pool_delete #验证回到log 20的true
true
[root@ceph1 ~]# ceph config log 1
--- 22 --- 2025-08-19T08:25:27.045753+0000 --- reset to 20 --- #从22回滚到20
- mon.ceph1.laogao.cloud/mon_allow_pool_delete = false
+ mon.ceph1.laogao.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 ~]# ceph tell mon.ceph1.laogao.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
[root@ceph1 ~]# ceph tell mon.ceph1.laogao.cloud config set mon_allow_pool_delete false
{
"success": "mon_allow_pool_delete = 'false' "
}
# 临时更改的值已生效
[root@ceph1 ~]# ceph tell mon.ceph1.laogao.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "false"
}
# 集群数据库中值仍然为true
[root@ceph1 ~]# ceph config get mon.ceph1.laogao.cloud mon_allow_pool_delete
true
# 重启守护进程,生效的值恢复为数据库中设置的值
[root@ceph1 ~]# ceph orch daemon restart mon.ceph1.laogao.cloud
Scheduled to restart mon.ceph1.laogao.cloud on host 'ceph1.laogao.cloud'
[root@ceph1 ~]# ceph tell mon.ceph1.laogao.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
注意:使用此命令更改的设置在守护进程重启后会恢复为原始设置。
ceph tell $type.$id config 命令接受通配符,以获取或设置同一类型的所有守护进程的值。
bash
[root@ceph1 ~]# ceph tell mon.* config get mon_allow_pool_delete
mon.ceph1.laogao.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 ~]# cephadm shell [ceph: root@ceph1 /]# ceph daemon mon.ceph1.laogao.cloud config show { "name": "mon.ceph1.laogao.cloud", "cluster": "ceph", "admin_socket": "/var/run/ceph/ceph-mon.ceph1.laogao.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_global_id_reclaim": "true", "auth_mon_ticket_ttl": "259200.000000", "auth_service_required": "cephx", ...... -
ceph daemon $type.$id config get,获得守护进程运行时特定设置。bash[ceph: root@ceph1 /]# ceph daemon mon.ceph1.laogao.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.laogao.cloud config set mon_allow_pool_delete false { "success": "mon_allow_pool_delete = 'false' " } [ceph: root@ceph1 /]# ceph daemon mon.ceph1.laogao.cloud config get mon_allow_pool_delete { "mon_allow_pool_delete": "false" }
注意:使用此命令更改的设置在守护进程重启后会恢复为原始设置。
bash
[ceph: root@ceph1 /]# ceph orch daemon restart mon.ceph1.laogao.cloud
Scheduled to restart mon.ceph1.laogao.cloud on host 'ceph1.laogao.cloud'
[ceph: root@ceph1 /]# ceph daemon mon.ceph1.laogao.cloud config get mon_allow_pool_delete
{
"mon_allow_pool_delete": "true"
}
Web UI 更改
-
打开 Web 浏览器并导航到 https://ceph1.laogao.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,让集群配置文件在集群节点之间保持同步的策略。
ini
[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 ~]# ceph status | grep mon mon: 3 daemons, quorum ceph1.laogao.cloud,ceph2,ceph3 (age 11m) -
ceph mon stat命令,检查 MON 仲裁状态。bash[root@ceph1 ceph]# ceph mon stat e3: 3 mons at {ceph1.laogao.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 16, leader 0 ceph1.laogao.cloud, quorum 0,1,2 ceph1.laogao.cloud,ceph2,ceph3 -
ceph quorum_status -f json-pretty命令,友好的 json 格式输出 MON 仲裁状态。bash[root@ceph1 ~]# ceph quorum_status -f json-prettyjson{ "election_epoch": 16, "quorum": [ 0, 1, 2 ], "quorum_names": [ "ceph1.laogao.cloud", "ceph2", "ceph3" ], "quorum_leader_name": "ceph1.laogao.cloud", "quorum_age": 869, "features": { "quorum_con": "4540138314316775423", "quorum_mon": [ "kraken", "luminous", "mimic", "osdmap-prune", "nautilus", "octopus", "pacific", "elector-pinging" ] }, "monmap": { "epoch": 3, "fsid": "2faf683a-7cbf-11f0-b5ba-000c29e0ad0e", "modified": "2025-08-19T05:51:46.573105Z", "created": "2025-08-19T05:41:50.650957Z", "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.laogao.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 ~]# ceph mon dump
epoch 3
fsid 2faf683a-7cbf-11f0-b5ba-000c29e0ad0e #集群fsid
last_changed 2025-08-19T05:51:46.573105+0000
created 2025-08-19T05:41:50.650957+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.laogao.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 ~]# ceph tell mon.ceph1.laogao.cloud compact -
将
mon_compact_on_start配置选项为 TRUE ,以便在每次守护进程启动时压缩数据库。bash[root@ceph1 ~]# ceph config set 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 ~]# ceph config get mon auth_service_required
cephx
[root@ceph1 ~]# ceph config get mon auth_cluster_required
cephx
[root@ceph1 ~]# 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
cephxornone.
cephadm 工具创建 client.admin 用户,让用户能够运行管理命令并创建其他 Ceph 客户端用户帐户,用户密钥环存储在 /etc/ceph 目录中。
bash
[root@ceph1 ~]# 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 ~]# ls /var/lib/ceph/2faf683a-7cbf-11f0-b5ba-000c29e0ad0e/mon.ceph1.laogao.cloud/keyring
/var/lib/ceph/2faf683a-7cbf-11f0-b5ba-000c29e0ad0e/mon.ceph1.laogao.cloud/keyring
**密钥环文件以纯文本形式存储机密密钥。**务必使用合适的 Linux 文件权限来保护它们的安全。
使用ceph auth命令创建、查看和管理集群
使用 ceph-authtool 命令创建密钥环文件。
示例:为 MON 节点创建一个密钥环文件。
bash
[root@ceph1 ~]# 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 操作的完全权限(如访问集群状态、修改配置等)。
cephadm 工具还会在**/etc/ceph目录中创建client.admin**用户,让您能够运行管理命令并创建其他Ceph客户端用户帐户。
配置集群网络-了解即可
配置公共网络和集群网络
public 网络是所有Ceph集群通信的默认网络。cephadm 工具假定第一个MON守护进程IP地址的网络是public 网络。新的MON守护进程部署在public网络中,除非您明确定义了不同的网络。
Ceph客户端通过集群的public 网络直接向OSD发送请求。OSD复制和恢复流量会使用public 网络,除非您为此配置了单独的cluster网络。
配置单独的cluster 网络可能会减少public网络的流量负载并与后端OSD运维流量进行客户端分流,从而提高集群的性能。

通过执行以下步骤,配置独立 cluster 网络的节点。
-
在每个集群节点上配置一个额外的网络接口。
-
在每个节点的新网络接口上配置适当的 cluster 网络 IP 地址。
-
cephadm bootstrap命令使用--cluster-network选项,在集群引导时定义 cluster网络。
Ceph 支持使用集群配置文件来设置 Public 网络和 Cluster 网络,还可以为每个网络配置多个子网,用逗号分隔。使用 CIDR 表示法表示子网,例如172.25.250.0/24。
ini
[global]
public_network = 192.168.108.0/24,192.168.109.0/24
cluster_network = 192.168.101.0/24
!IMPORTANT
如果为一个网络配置多个子网,这些子网必须能够互相路由。
还可以使用 ceph config set 命令设置 Public 和 cluster 网络。
配置单个守护进程
MON 守护进程需绑定到特定的 IP 地址,但 MGR、OSD 和 MDS 守护进程可绑定至任何可用的 IP 地址。在Ceph 存储 5 中,cephadm 使用 Public 网络执行大部分服务。若要处理 cephadm 部署新守护进程的位置,需先定义服务要使用的特定子网。只有在同一子网中有 IP 地址的主机可用于部署该服务。
将 192.168.108.0/24 子网设置为 MON 守护进程公共网络:
bash
# ceph config set mon public_network 192.168.108.0/24
以上命令相当于在集群配置文件中做如下设置:
ini
[mon]
public_network = 192.168.108.0/24
使用 ceph orch daemon add 命令可将守护进程手动部署到特定子网或 IP 地址。
bash
# ceph orch daemon add mon cluster-host02:192.168.108.0/24
# ceph orch daemon rm mon.cluster-host01
!TIP
建议使用服务规范文件来管理 Ceph 集群,不建议使用运行时
ceph orch daemon命令更改配置。
运行 IPv6
默认情况下,集群 ms_bind_ipv4 设置的值是 TRUE ,而 ms_bind_ipv6 设置的值是FALSE。
bash
# ceph config get mon.ceph1.laogao.cloud ms_bind_ipv4
true
# ceph config get mon.ceph1.laogao.cloud ms_bind_ipv6
false
要将 Ceph 守护进程绑定至 IPv6 地址,需要:
-
将 ms_bind_ipv6 设置为 TRUE
-
将 ms_bind_ipv4 设置为 FALSE
同时绑定 public_network 和 cluster_network 为IPv6网络。
ini
[global]
public_network = <IPv6 public-network/netmask>
cluster_network = <IPv6 cluster-network/netmask>
启用巨型帧
配置网络 MTU 来支持巨型帧是存储网络中的推荐做法,可以提升性能。在 cluster 网络接口上配置 MTU 值 9000,以支持巨型帧。
!IMPORTANT
通信路径中的所有节点和网络设备必须具有相同的MTU值。对于绑定网络接口,在绑定接口上设置MTU值,基础接口将继承相同的MTU值。
配置网络安全
配置独立的 cluster 网络可以提高集群的安全性和可用性:
- 防止数据在 Public 网络上泄露。
- 减少 Public 网络上的攻击面。
- 防止针对集群某些类型的拒绝服务 (DoS) 攻击。
- 防止 OSD 之间的流量中断。当 OSD 之间的流量中断时,客户端会无法读取和写入数据。
确保流量不在 cluster 和 Public 网络之间路由,以保护后端 cluster 网络。
配置防火墙规则
Ceph OSD 和 MDS 守护进程默认绑定到 6800 到 7300 之间的 TCP 端口。若要配置不同的范围,需更改 ms_bind_port_min 和 ms_bind_port_max 设置。
下表列出了Ceph 存储 5 的默认端口。

若要使用防火墙保护 MON 节点,需使用 Public 接口和 Public 网络 IP 地址来配置规则。
bash
# firewall-cmd --zone=Public --add-port=6789/tcp --add-port=3300/tcp
# firewall-cmd --zone=Public --add-port=6789/tcp --add-port=3300/tcp --permanent
还可通过添加 ceph-mon 服务至防火墙规则来保护 MON 节点。
bash
# firewall-cmd --zone=Public --add-service=ceph-mon
# firewall-cmd --zone=Public --add-service=ceph-mon --permanent
若要配置 cluster 网络,防火墙需要配置 Public 和 cluster 网络规则。客户端通过使用公共网络连接到 OSD,OSD 通过集群网络互相通信。
若要使用防火墙规则保护 OSD 节点,执行以下命令:
bash
# firewall-cmd --zone=<public-or-cluster> --add-port=6800-7300/tcp
# firewall-cmd --zone=<public-or-cluster> --add-port=6800-7300/tcp --permanent
还可通过添加 ceph 服务至防火墙规则来保护 OSD 节点。
bash
# firewall-cmd --zone=<public-or-cluster> --add-service=ceph
# firewall-cmd --zone=<public-or-cluster> --add-service=ceph --permanent
第 4 章 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 ~]# ceph osd pool create pool_web 32 32 replicated
pool 'pool_web' created
[root@ceph1 ~]# 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 crush-rule-name
- pool-name,指定新池的名称。
- pg-num,指定池的放置组 (PG) 总数。
- pgp-num,指定池的有效放置组数量。通常而言,这应当与 PG 总数相等。
- erasure,指定池的类型是纠删代码池。
- erasure-code-profile,指定池使用的纠删代码配置文件的名称。默认情况下,Ceph 使用 default 配置文件。
- crush-rule-name 是要用于这个池的 CRUSH 规则集的名称。如果不设置,Ceph 将使用纠删代码池配置文件中定义的规则集。
**纠删代码池无法使用对象映射功能。**对象映射是对象的一个索引,用于跟踪 rbd 对象的块会被分配到哪里,可用于提高大小调整、导出、扁平化和其他操作的性能。
示例:
bash
[root@ceph1 ~]# ceph osd pool create pool_era 32 32 erasure
pool 'pool_era' created
[root@ceph1 ~]# ceph osd pool ls
device_health_metrics
pool_web
pool_era
查看默认纠删代码配置
bash
[root@ceph1 ~]# ceph osd erasure-code-profile ls
default
[root@ceph1 ~]# 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 ~]# ceph osd erasure-code-profile set ceph k=4 m=2
列出现有的就删代码配置文件
bash
[root@ceph1 ~]# ceph osd erasure-code-profile ls
ceph
default
Ceph 会在安装期间创建 default 配置文件。这个配置文件已配置为将对象分割为2个数据区块和2个编码区块。
查看现有配置文件的详细信息
bash
[root@ceph1 ~]# 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 ~]# ceph osd erasure-code-profile rm ceph
[root@ceph1 ~]# ceph osd erasure-code-profile ls
default
重要:现有纠删代码配置文件是无法修改或更改,只能创建新的配置文件。
查看 池 状态
使用 ceph osd pool ls 命令,可以列出池清单。
bash
[root@ceph1 ~]# ceph osd pool ls
device_health_metrics
pool_web
pool_era
使用 ceph osd pool ls detail 命令,可以列出池清单和池的详细配置。
bash
[root@ceph1 ~]# 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 31 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 34 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 41 flags hashpspool stripe_width 8192
使用 ceph osd lspools 命令,也可以列出池清单。
bash
[root@ceph1 ~]# ceph osd lspools
1 device_health_metrics
2 pool_web
3 pool_era
使用 ceph osd pool stats 命令,可以列出池状态信息,池被哪些客户端使用。
bash
[root@ceph1 ~]# 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 ~]# 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 0 B 0 0 B 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
[root@ceph1 ~]#
管理 池
管理 池 应用类型
使用 ceph osd pool application 命令,管理池 Ceph 应用类型。应用类型有cephfs(用于 Ceph 文件系统) 、rbd(Ceph 块设备)和 rgw(RADOS 网关)。
bash
[root@ceph1 ~]# ceph osd pool application <tab><tab>
disable enable get rm set
# 启用池的类型为rbd
[root@ceph1 ~]# ceph osd pool application enable pool_web rbd
enabled application 'rbd' on pool 'pool_web'
[root@ceph1 ~]# 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 44 flags hashpspool stripe_width 0 `application rbd` <------ #看这的变化
# 使用set子命令,设置池的应用类型详细配置
[root@ceph1 ~]# 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 ~]# ceph osd pool application get pool_web
{
"rbd": {
"app1": "apache"
}
}
# 使用rm子命令,删除池的应用类型详细配置
[root@ceph1 ~]# ceph osd pool application rm pool_web rbd app1
removed application 'rbd' key 'app1' on pool 'pool_web'
[root@ceph1 ~]# ceph osd pool application get pool_web
{
"rbd": {}
}
# 禁用池的类型
[root@ceph1 ~]# ceph osd pool application disable pool_web rbd --yes-i-really-mean-it
disable application 'rbd' on pool 'pool_web'
[root@ceph1 ~]# 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 47 flags hashpspool stripe_width 0
管理 池 配额
使用 ceph osd pool get-quota 命令,获取池配额信息:池中能够存储的最大字节数或最大对象数量。
bash
[root@ceph1 ~]# ceph osd pool get-quota pool_web
quotas for pool 'pool_web':
max objects: N/A
max bytes : N/A
使用 ceph osd pool set-quota 命令,可以设置池配额来限制池中能够存储的最大字节数或最大对象数量。
bash
[root@ceph1 ~]# ceph osd pool set-quota pool_web max_objects 100000
set-quota max_objects = 100000 for pool pool_web
[root@ceph1 ~]# ceph osd pool set-quota pool_web max_bytes 10G
set-quota max_bytes = 10737418240 for pool pool_web
[root@ceph1 ~]# ceph osd pool get-quota pool_web
quotas for pool 'pool_web':
max objects: 100k objects (current num objects: 0 objects)
max bytes : 10 GiB (current num bytes: 0 bytes)
当池使用量达到池配额时,操作将被阻止。用户可通过将该值设置为 0 来删除配额。
bash
[root@ceph1 ~]# ceph osd pool set-quota pool_web max_objects 0
set-quota max_objects = 0 for pool pool_web
[root@ceph1 ~]# ceph osd pool set-quota pool_web max_bytes 0
set-quota max_bytes = 0 for pool pool_web
[root@ceph1 ~]# ceph osd pool get-quota pool_web
quotas for pool 'pool_web':
max objects: N/A
max bytes : N/A
管理 池 配置
查看池配置
使用 ceph osd pool get 命令,查看池配置。
bash
# 查看池所有配置
[root@ceph1 ~]# ceph osd pool get pool_web all
size: 3 #副本数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 ~]# ceph osd pool get pool_web nodelete
nodelete: false
# 备用命令
[root@ceph1 ~]# ceph osd pool get pool_web all | grep nodelete
nodelete: false
设置池配置
使用 ceph osd pool set 命令,可以修改池配置选项。
bash
# 设置池不可删除
[root@ceph1 ~]# ceph osd pool set pool_web nodelete true
set pool 2 nodelete to true
[root@ceph1 ~]# ceph osd pool get pool_web nodelete
nodelete: true
# 将 nodelete 重新设置为 FALSE,即可允许删除池
root@ceph1 ~]# ceph osd pool set pool_web nodelete false
set pool 2 nodelete to false
[root@ceph1 ~]# ceph osd pool get pool_web nodelete
nodelete: false
管理 池 复本数
使用以下命令,更改池的复本数量。
bash
[root@ceph1 ~]# ceph osd pool set pool_web size 2
set pool 2 size to 2 #2 size to 2???没变,别闹这里说的时pool2 的size 变成2,pool2是谁??
[root@ceph1 ~]# ceph osd pool get pool_web all
size: 2 #这里确实从之前的3变成了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 ~]# ceph config get mon osd_pool_default_size
3
使用以下命令定义创建新池的默认复本数量。
bash
[root@ceph1 ~]# ceph config set mon osd_pool_default_size 2
[root@ceph1 ~]# ceph config get mon osd_pool_default_size
2
osd_pool_default_min_size 参数定义集群必须提供多少个对象复本才能接受 I/O 请求。复本数为3的池,该值为2;复本数为2的池,该值为1。
使用以下命令定义池的最小复本数量。
bash
[root@ceph1 ~]# ceph config get mon osd_pool_default_min_size
0 #参数值为0是特殊设置,意味着集群将自动使用存储池的size值作为最小副本数,举例说明:如果某存储池size=3,那么min_size会自动设为2(即size/2+1取整)
[root@ceph1 ~]# ceph config set mon osd_pool_default_min_size 1
[root@ceph1 ~]# ceph config get mon osd_pool_default_min_size
1
管理 池 PG 数
使用以下命令,更改池 PG 数量。
bash
[root@ceph1 ~]# ceph osd pool set pool_web pg_num 64 #思考PG设置多少合适???
set pool 2 pg_num to 64
[root@ceph1 ~]# ceph osd pool get pool_web all
size: 2
min_size: 1
pg_num: 64 #确实PG变为了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 ~]# ceph mgr module enable pg_autoscaler
module 'pg_autoscaler' is already enabled (always-on)
[root@ceph1 ~]# ceph osd pool set pool_web pg_autoscale_mode off #pool_web池pb_autoscale_mode设置为off
set pool 2 pg_autoscale_mode to off
[root@ceph1 ~]# 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 0 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 ~]# ceph osd pool set pool_web pg_autoscale_mode on
set pool 2 pg_autoscale_mode to on
[root@ceph1 ~]# 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 0 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 ~]# 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 ~]# echo laogao1 > hosts1
[root@ceph1 ~]# rados -p pool_web put hosts hosts1 #将host1文件上传到webapp池取名为hosts
[root@ceph1 ~]# rados -p pool_web ls
hosts
查看池中对象状态
bash
[root@ceph1 ~]# rados -p pool_web stat hosts
pool_web/hosts mtime 2025-08-21T09:52:43.000000+0800, size 8
检索对象到本地
bash
[root@ceph1 ~]# rados -p pool_web get hosts newhosts
[root@ceph1 ~]# cat newhosts
laogao1
追加池中对象
bash
[root@ceph1 ~]# echo laogao2 >> hosts2
[root@ceph1 ~]# rados append -p pool_web hosts hosts2
[root@ceph1 ~]# rados get hosts newhosts -p pool_web
[root@ceph1 ~]# cat newhosts
laogao1
laogao2
删除池中对象
bash
[root@ceph1 ~]# rados put passwd /etc/passwd -p pool_web
[root@ceph1 ~]# rados ls -p pool_web
passwd
hosts
[root@ceph1 ~]# rados rm passwd -p pool_web
[root@ceph1 ~]# rados ls -p pool_web
hosts
管理 池 快照
使用 ceph osd pool mksnap 命令,创建池快照。
bash
[root@ceph1 ~]# ceph osd pool mksnap pool_web snap1 #给池pool_web创建快照snap1
created pool pool_web snap snap1
[root@ceph1 ~]# ceph osd pool ls detail
pool 2 'pool_web' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode off last_change 68 lfor 0/0/60 flags hashpspool,pool_snaps stripe_width 0
snap 1 'snap1' 2025-08-21T02:05:02.662386+0000 #多了snap1
[root@ceph1 ~]# rados -p pool_web lssnap
1 snap1 2025.09.29 14:38:50
1 snaps
使用 ceph osd pool rmsnap 命令,删除池快照。
bash
[root@ceph1 ~]# ceph osd pool rmsnap pool_web snap1
removed pool pool_web snap snap1
[root@ceph1 ~]# ceph osd pool ls detail
pool 2 'pool_web' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode off last_change 69 lfor 0/0/60 flags hashpspool,pool_snaps stripe_width 0
[root@ceph1 ~]# rados -p pool_web lssnap
0 snaps
管理 池 快照中对象
对池某个快照中对象操作需要使用-s选项指定快照名称。
bash
[root@ceph1 ~]# ceph osd pool mksnap pool_web snap1 #给池pool_web拍摄快照snap1
created pool pool_web snap snap1
[root@ceph1 ~]# rados -p pool_web listsnaps hosts
hosts:
cloneid snaps size overlap
head - 16
#拍摄快照后,上传新的内容到hosts中
[root@ceph1 ~]# echo laogao3 > hosts3
[root@ceph1 ~]# rados -p pool_web put hosts hosts3
[root@ceph1 ~]# rados -p pool_web get hosts newhosts
[root@ceph1 ~]# cat newhosts
laogao3
bash
# 查看快照中对象
[root@ceph1 ~]# rados ls -p pool_web -s snap1
selected snap 3 'snap1'
hosts
# 获取快照中对象
[root@ceph1 ~]# rados -p pool_web -s snap1 get hosts hosts-from-snap1
selected snap 3 'snap1'
[root@ceph1 ~]# cat hosts-from-snap1 #发现即使hosts文件拍摄快照后变了,从快照获取的依然没变
laogao1
laogao2
# 恢复对象内容为指定快照时内容
[root@ceph1 ~]# rados -p pool_web rollback hosts snap1
rolled back pool pool_web to snapshot snap1
[root@ceph1 ~]# rados -p pool_web get hosts newhosts
[root@ceph1 ~]# cat newhosts
laogao1
laogao2
快照是只读文件系统,无法上传和删除快照中对象。
bash
[root@ceph1 ~]# 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 ~]# rados ls -p pool_web -s snap1
selected snap 3 'snap1'
hosts
[root@ceph1 ~]# 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 ~]# rados put -p pool_web -N myns1 hostname1 /etc/hostname
[root@ceph1 ~]# rados ls -p pool_web
hosts
[root@ceph1 ~]# rados ls -p pool_web -N myns1 #上传的hsotname1在namespace myns1中
hostname1
[root@ceph1 ~]# rados put -p pool_web -N myns2 hostname2 /etc/hostname
[root@ceph1 ~]# rados ls -p pool_web -N myns2
hostname2
[root@ceph1 ~]# rados ls -p pool_web --all
myns1 hostname1
hosts
myns2 hostname2
[root@ceph1 ~]# 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 ~]# ceph osd pool rename pool_web pool_apache
pool 'pool_web' renamed to 'pool_apache'
**重命名池不会影响池中存储的数据。**如果用户重命名池,则会影响池级别的用户权限,则必须使用新的池名称来更新该用户的能力。
删除池
使用 ceph osd pool delete 命令,删除池。
bash
[root@ceph1 ~]# 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. #根据提示需要将pool name输入两次,跟上参数--yes-i-really-really-mean-it
[root@ceph1 ~]# ceph osd pool rm pool_apache pool_apache --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool #提示需要先将mon_allow_pool_delete选项配置为true才能删除pool
必须将集群级别 mon_allow_pool_delete 设置为 TRUE 才能删除池。
bash
[root@ceph1 ~]# ceph config set mon mon_allow_pool_delete true
[root@ceph1 ~]# ceph config get mon mon_allow_pool_delete
true
[root@ceph1 ~]# ceph osd pool rm pool_apache pool_apache --yes-i-really-really-mean-it
pool 'pool_apache' removed
重要:删除池会删除池中的所有数据,而且不可逆转。
还可以通过设置池 nodelete 属性为 yes,防止池被误删除。
bash
# ceph osd pool set pool_apache nodelete true
第 5 章 Ceph 分布式存储 认证和授权管理
Ceph 集群身份验证
cephx 协议
Ceph 存储使用 cephx 协议管理集群认证。
Ceph 中用户帐户用途:
- Ceph 守护进程之间的内部通信。
- 客户通通过 librados 库访问集群。
- 集群管理。
账户名称
-
Ceph 守护进程使用的帐户与守护进程名称相匹配,例如 osd.1 或 mgr.ceph1,并在安装期间创建。
-
**使用 librados 的客户端应用所用帐户的名称具有 client. 前缀。**例如:
-
将 OpenStack 与 Ceph 集成时,常常会创建专用的 client.openstack 用户帐户。
-
对于 Ceph 对象网关,安装过程会创建专用的 client.rgw.hostname 用户帐户。
-
-
**安装程序会创建超级用户帐户 client.admin,该帐户具有访问所有内容及修改集群配置的能力。**运行ceph相关命令时,Ceph 默认使用 client.admin 帐户,除非用户通过 --name 或 --id 选项明确指定了其他用户名。
可以设置 CEPH_ARGS 环境变量来定义用户名称或用户 ID 等参数。
示例:
bash
# export CEPH_ARGS="--id laogao"
**应用的最终用户不在 Ceph 集群中拥有帐户。**最终用户访问应用,然后由应用代表他们访问 Ceph。从 Ceph 角度来看,应用就是客户端。应用可能会通过其他机制提供自己的用户身份验证。

Ceph 对象网关有自己的用户数据库来验证 Amazon S3 或 Swift 用户的身份,Ceph 对象网关使用client.rgw.hostname 帐户来访问集群。
密钥环文件
Ceph 创建用户帐户时,为每个用户帐户生成密钥环文件,通过密钥环文件验证用户身份,必须将此文件复制到客户端系统或应用服务器上。
Ceph 根据 /etc/ceph/ceph.conf 配置文件中的 keyring 参数查找密钥环文件,默认值为/etc/ceph/ c l u s t e r . cluster. cluster.name.keyring。例如,对于 client.openstack 帐户,其密钥环文件为 /etc/ceph/ceph.client.openstack.keyring。
**密钥环文件以纯文本形式存储机密密钥,**因此需要使用适当的 Linux 文件权限来保护文件,仅允许授权的Linux 用户访问。仅将 Ceph 用户的密钥环文件部署到需要用它进行身份验证的系统上。
指定用户身份
ceph、rados 和 rbd 等命令行工具,通过 --id 和 --keyring 选项指定要使用的用户帐户和密钥环文件。未指定时,命令会以 client.admin 用户进行身份验证。
示例:ceph 命令会以 client.operator3 进行身份验证并列出可用池。
bash
# ceph --id operator3 osd lspools
- 使用 --id 选项,不要添加 client. 前缀。
- 使用 --name 选项,需要 client. 前缀。
- 如果密钥环文件存储在默认的位置,则用户不需要 --keyring 选项。cephadm shell 会自动从 /etc/ceph/ 目录挂载密钥环。
Cephx 协议通信原理
**Cephx 协议使用共享机密密钥加密通信。**简要通信过程如下:
- 客户端向监控器请求会话密钥,同时传递共享秘钥给监视器。
- 监视器使用客户端的共享机密密钥加密会话密钥,再将会话密钥提供给客户端。
- 由客户端解密会话密钥,然后再从监控器请求票据,以便对集群守护进程进行身份验证。
Cephx 使用共享密钥进行身份验证, 客户端和MON群集都保存着共享秘钥副本。
Cephx 协议的认证流程:
-
client 向 MON 请求会话秘钥。
-
MON 创建会话秘钥,同时将产生的会话秘钥分享给 MDS 和 OSD。
-
MON 使用共享密钥加密会话密钥,并返回给 client。client 使用共享秘钥解密数据,获得会话密钥。
后续通信都使用会话秘钥进行加密和解密。
-
client 然后使用会话密钥加密会话,向 MON 请求票据数据。MON 使用会话密钥解密客户端请求,并创建 ticket,使用会话密钥加密返回给 client。client 使用会话密钥解密数据收到ticket。
-
client 使用ticket与MDS和OSD进行交互。由于client、MDS和OSD都拥有MON产生的秘钥,因此它们之间可以验证ticket是否合法。

管理用户账户
查看用户账户
要列出现有用户帐户,可运行 ceph auth ls 或者 ceph auth list 命令。
bash
[root@ceph1 ~]# ceph auth list
osd.0
key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
......
要获取特定帐户的详细信息,可使用 ceph auth get 命令。
bash
[root@ceph1 ~]# ceph auth get osd.0
[osd.0]
key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
exported keyring for osd.0
要获取特定帐户的key内容,可使用命令:
- ceph auth get-key
- ceph auth print-key
- ceph auth print_key
bash
[root@ceph1 ~]# ceph auth get-key osd.0
AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
[root@ceph1 ~]# ceph auth print-key osd.0
AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
[root@ceph1 ~]# ceph auth print_key osd.0
AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
创建用户账户
要创建用户帐户,可使用命令:
- ceph auth add
- ceph auth get-or-create
- ceph auth get-or-create-key
bash
[root@ceph1 ~]# ceph auth add client.app1
added key for client.app1
[root@ceph1 ~]# ceph auth get-or-create client.app2
[client.app2]
key = AQC2vKZoZQzOCRAAWn6PfXhyMxh3/i4KTTvKQg==
[root@ceph1 ~]# ceph auth get-or-create-key client.app3
AQDFvKZoF8/iDxAAV7gMq2lnCQcLs9NAQGH5Kg==
还可以在创建用户账户的时候,赋予用户账户权限。
赋予用户账户权限,稍后讲解。
bash
[root@ceph1 ~]# ceph auth add client.app4 mon 'allow r'
added key for client.app4
删除用户账户
要创建用户帐户,可使用命令:
- ceph auth del
- ceph auth rm
bash
[root@ceph1 ~]# ceph auth del client.app3
updated
[root@ceph1 ~]# ceph auth rm client.app2
updated
[root@ceph1 ~]# ceph auth ls | grep client.app
installed auth entries:
client.app1
client.app4
导出和导入用户账户
要导出特定帐户的详细信息,可使用命令:
- ceph auth export -o
- ceph auth get -o
bash
[root@ceph1 ~]# ceph auth export osd.0 -o ceph.osd.0.keyring.1
export auth(key=AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==)
[root@ceph1 ~]# cat ceph.osd.0.keyring.1
[osd.0]
key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
[root@ceph1 ~]# ceph auth get osd.0 -o ceph.osd.0.keyring.2
exported keyring for osd.0
[root@ceph1 ~]# cat ceph.osd.0.keyring.2
[osd.0]
key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
要导入特定帐户的详细信息,可使用 ceph auth import -i 命令。
bash
# 先导出client.app4然后删除client.app4
[root@ceph1 ~]# ceph auth export client.app4 -o ceph.client.app4.keyring
export auth(key=AQDnvKZoY7irCRAA5ap2HQ1nQ2ADHSJRJWtczw==)
[root@ceph1 ~]# ceph auth rm client.app4
updated
[root@ceph1 ~]# ceph auth get client.app4
Error ENOENT: failed to find client.app4 in keyring
# 将刚才删除的client.app4导入观察现象
[root@ceph1 ~]# ceph auth import -i ceph.client.app4.keyring
imported keyring
[root@ceph1 ~]# ceph auth get client.app4
[client.app4]
key = AQDnvKZoY7irCRAA5ap2HQ1nQ2ADHSJRJWtczw==
caps mon = "allow r"
exported keyring for client.app4
配置用户账户功能
用户账户功能
cephx 中的权限称为功能,使用功能来限制或提供对池中数据、池的命名空间或一组池的访问权限。功能还允许集群中的守护进程之间互相交互。通过守护进程类型(mon、osd、mgr 或 mds)来授予它们。
在 cephx 内,对于每个守护进程类型来说,都有多项功能可用:
- allow,在守护进程的访问权限之前设置。
- **r,授予读取访问权限。**每一用户帐户至少应在监控器上具有读取访问权限,以便能够检索 CRUSH 映射。
- **w,授予写入访问权限。**客户端需要写入访问权限以在 OSD 上存储和修改对象。对于管理器 (MGR),w 授予启用或禁用模块的权限。
- **x,授予执行扩展对象类的权限。**让用户能够调用类方法(即读取和写入)并对监控器执行身份验证操作。这使得客户端能够在对象上执行额外的操作,如使用 rados lock get 设置锁定或使用 rbd list 列出 RBD 镜像。
- **class-read ,让用户能够调用类读取方法。**x 的子集。通常用在 RBD 池中。
- **class-write,让用户能够调用类写入方法。**x 的子集。通常用在 RBD 池中。
- ***,授予完整访问权限。**授予用户对特定守护进程或池的读取、写入和执行权限,并允许用户执行管 理命令。
要赋予用户帐户功能,可运行 ceph auth caps 命令,运行该命令前确保用户账户已创建。
示例:
bash
[root@ceph1 ~]# ceph auth add client.laogao
added key for client.laogao
[root@ceph1 ~]# ceph auth caps client.laogao mon 'allow r' osd 'allow rw'
updated caps for client.laogao
在创建用户账户时,直接赋予权限。
bash
[root@ceph1 ~]# ceph auth add client.laogao mon 'allow r' osd 'allow rw'
用户账户功能配置文件
创建用户帐户时,可使用cephx 预定义的功能配置文件:
- 简化用户访问权限配置。
- 实现守护进程之间的内部通信。
- Ceph 会在内部定义这些文件,用户无法自行创建配置文件。
cephx 预定义的部分功能配置文件如下:
-
osd,授予用户作为 OSD 连接其他 OSD 或监控器的权限, 以便 OSD 能够 处理复制心跳流量和状态报告。
bash[root@ceph1 ~]# ceph auth get osd.1 [osd.1] key = AQA8EqRoxyM2OBAAQuVUxOvvVZL7Ydg4niwLPQ== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" exported keyring for osd.1 -
bootstrap-osd,授予用户引导 OSD 的权限,以便他们在引导 OSD 时具有添加密钥的权限。
bash[root@ceph1 ~]# ceph auth get client.bootstrap-osd [client.bootstrap-osd] key = AQCgDqRoAD+sABAAP2icy5PAW2sgh8sU/An5Pw== caps mon = "allow profile bootstrap-osd" exported keyring for client.bootstrap-osd -
rbd,授予用户读写访问 Ceph 块设备的权限。
-
rbd-read-only,授予用户只读访问 Ceph 块设备的权限。
示例:
bash
[root@ceph1 ~]# ceph auth add client.forrbd mon 'profile rbd' osd 'profile rbd'
added key for client.forrbd
[root@ceph1 ~]# ceph auth get client.forrbd
[client.forrbd]
key = AQDLwqZo4W28KxAA8onfLsxAxUvYt2cKq+comQ==
caps mon = "profile rbd"
caps osd = "profile rbd"
exported keyring for client.forrbd
限制访问范围
-
池,限制用户只能访问他们需要的池。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.formyapp1 mon 'allow r' osd 'allow rw pool=myapp' [client.formyapp1] key = AQAMxqZodL12BhAA0IyPEV6SqT+9cLpr+k1DPw==如果在配置功能时不指定池,则 Ceph 会将它们设置到所有现有的池。
-
命名空间,限制用户帐户仅访问从属于特定命名空间中对象。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.formyapp2 mon 'allow r' osd 'allow rw namespace=photos' [client.formyapp2] key = AQA6xqZolcVtBxAAMGJtK4hes9LLfuwaoTnMFA== -
池和命名空间,限制用户帐户仅访问特定池中特定命名空间中对象。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.formyapp3 mon 'allow r' osd 'allow rw pool=myapp namespace=photos' [client.formyapp3] key = AQBmxqZo9uExExAAePkx63ERHvgGmMiEJd4GEg== -
对象名称前缀,限制用户帐户仅访问特定名称前缀的对象。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.formyapp4 mon 'allow r' osd 'allow rw object_prefix pref' [client.formyapp4] key = AQCYxqZorsmOHxAAlQMGO+Ouv719SN1/BLpy8w== -
文件路径,限制用户帐户仅访问 Ceph 文件系统 (CephFS) 中特定目录。
示例:
bash# ceph fs authorize cephfs client.webdesigner /webcontent rw -
monitor 命令,限制用户帐户只能使用一组特定的命令。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.operator1 mon 'allow r, allow command "auth get-or-create", allow command "auth list"' [client.operator1] key = AQDdxqZotZpCFRAAI1DFw519uGF/EbAF2KB6GQ==
实践1:创建一个可执行ceph auth list的用户,并使用该用户执行该命令
bash
[root@ceph1 ~]# ceph auth get-or-create client.gaoqiaodong mon 'allow r,allow command "auth list"'
[client.gaoqiaodong]
key = AQCn56Zo8hxHFxAA1GnGWHE9RRGe6TnglJIoVg==
[root@ceph1 ~]# ceph auth get client.gaoqiaodong -o /etc/ceph/ceph.client.gaoqiaodong.keyring
exported keyring for client.gaoqiaodong
[root@ceph1 ~]# ceph auth ls --id gaoqiaodong #执行等同于auth list的auth ls都不行
Error EACCES: access denied
[root@ceph1 ~]# ceph auth list --id gaoqiaodong
osd.0
key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
......
实践2:通过client管理ceph
client:
bash
[root@client ~]# mkdir /etc/ceph
[root@client ~]# dnf install -y ceph-common
ceph1:
bash
# 将/etc/ceph/ceph.client.admin.keyring拷贝到client
[root@ceph1 ~]# scp /etc/ceph/ceph.client.admin.keyring root@client:/etc/ceph/
# 将/etc/ceph.conf拷贝到cleint
[root@ceph1 ~]# scp /etc/ceph/ceph.conf root@client:/etc/ceph/
client:
bash
[root@client ~]# ceph -s
cluster:
id: 2faf683a-7cbf-11f0-b5ba-000c29e0ad0e
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1.laogao.cloud,ceph2,ceph3 (age 3h)
mgr: ceph2.oetbal(active, since 3h), standbys: ceph1.laogao.cloud.zoqmbt, ceph3.npaxvt
osd: 9 osds: 9 up (since 3h), 9 in (since 2d)
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
示例:
bash
[root@ceph1 ~]# ceph auth get-or-create client.formyapp3 mon 'allow r' osd 'allow rw pool=myapp namespace=photos'
[client.formyapp3]
key = AQBmxqZo9uExExAAePkx63ERHvgGmMiEJd4GEg==
-
对象名称前缀,限制用户帐户仅访问特定名称前缀的对象。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.formyapp4 mon 'allow r' osd 'allow rw object_prefix pref' [client.formyapp4] key = AQCYxqZorsmOHxAAlQMGO+Ouv719SN1/BLpy8w== -
文件路径,限制用户帐户仅访问 Ceph 文件系统 (CephFS) 中特定目录。
示例:
bash# ceph fs authorize cephfs client.webdesigner /webcontent rw -
monitor 命令,限制用户帐户只能使用一组特定的命令。
示例:
bash[root@ceph1 ~]# ceph auth get-or-create client.operator1 mon 'allow r, allow command "auth get-or-create", allow command "auth list"' [client.operator1] key = AQDdxqZotZpCFRAAI1DFw519uGF/EbAF2KB6GQ==
实践1:创建一个可执行ceph auth list的用户,并使用该用户执行该命令
bash
[root@ceph1 ~]# ceph auth get-or-create client.gaoqiaodong mon 'allow r,allow command "auth list"'
[client.gaoqiaodong]
key = AQCn56Zo8hxHFxAA1GnGWHE9RRGe6TnglJIoVg==
[root@ceph1 ~]# ceph auth get client.gaoqiaodong -o /etc/ceph/ceph.client.gaoqiaodong.keyring
exported keyring for client.gaoqiaodong
[root@ceph1 ~]# ceph auth ls --id gaoqiaodong #执行等同于auth list的auth ls都不行
Error EACCES: access denied
[root@ceph1 ~]# ceph auth list --id gaoqiaodong
osd.0
key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
......
实践2:通过client管理ceph
client:
bash
[root@client ~]# mkdir /etc/ceph
[root@client ~]# dnf install -y ceph-common
ceph1:
bash
# 将/etc/ceph/ceph.client.admin.keyring拷贝到client
[root@ceph1 ~]# scp /etc/ceph/ceph.client.admin.keyring root@client:/etc/ceph/
# 将/etc/ceph.conf拷贝到cleint
[root@ceph1 ~]# scp /etc/ceph/ceph.conf root@client:/etc/ceph/
client:
bash
[root@client ~]# ceph -s
cluster:
id: 2faf683a-7cbf-11f0-b5ba-000c29e0ad0e
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1.laogao.cloud,ceph2,ceph3 (age 3h)
mgr: ceph2.oetbal(active, since 3h), standbys: ceph1.laogao.cloud.zoqmbt, ceph3.npaxvt
osd: 9 osds: 9 up (since 3h), 9 in (since 2d)
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