Ceph系列第三期:Ceph 集群核心配置与管理
本期目标
- 理解 Ceph 的配置体系(配置文件 vs 集中配置数据库)
- 掌握
ceph config系列命令的使用 - 学会运行时动态调整配置(
ceph tell) - 配置 Public 网络和 Cluster 网络
- 管理 Monitor(MON)节点和集群映射
- 掌握 Cephx 认证与授权机制,管理用户账户
前置要求:已完成第二期的集群部署,拥有一个健康的三节点 Ceph 集群(ceph1~ceph3)。
1. Ceph 配置体系概述
Ceph 守护进程(MON、OSD、MDS、MGR)和客户端可以从多个来源获取配置,优先级从低到高:
- 编译内置默认值
- 中央配置数据库(Monitor 维护,优先级高于本地配置文件)
- 本地配置文件 (
/etc/ceph/ceph.conf) - 环境变量 (如
CEPH_ARGS) - 命令行参数 (如
--id)
重要变化 :较新版本的 Ceph 推荐使用集中配置数据库 进行配置管理,
ceph.conf仅保留最小必要选项(如mon_host)。cephadm部署的集群默认只生成非常精简的ceph.conf,大部分配置通过ceph config set管理。
1.1 配置文件格式
Ceph 使用 INI 格式,以 [section] 划分:
ini
[global] # 全局配置,适用于所有守护进程和客户端
fsid = 2faf683a-7cbf-11f0-b5ba-000c29e0ad0e
mon_host = [v2:192.168.108.11:3300/0,v1:192.168.108.11:6789/0]
[mon] # 适用于所有 mon 守护进程
mon_allow_pool_delete = false
[mon.ceph1] # 仅适用于 ceph1 上的 mon 实例
mon_allow_pool_delete = true
[osd] # 适用于所有 osd
osd_memory_target = 4294967296
[client] # 适用于所有 Ceph 客户端(如 rbd、rados 命令)
rbd_cache = true
1.2 元变量(Metavariables)
可以在配置值中使用的动态变量:
| 元变量 | 含义 | 示例展开 |
|---|---|---|
$cluster |
集群名称,默认为 ceph |
/etc/ceph/$cluster.keyring → /etc/ceph/ceph.keyring |
$type |
守护进程类型(mon, osd, mds, mgr, client) | /var/lib/ceph/$type |
$id |
实例 ID(如 osd.0 的 id 为 0) | |
$name |
$type.$id 的简写 |
|
$host |
运行守护进程的主机名 |
2. 集中配置数据库管理
配置数据库存储在 MON 节点的 /var/lib/ceph/$fsid/mon.$host/store.db 中,使用 RocksDB 存储。所有 MON 节点通过 Paxos 保持配置一致。
2.1 常用 ceph config 命令
列出所有可配置项
bash
ceph config ls
输出包含所有可设置参数及其类型、是否可运行时修改等。
查看帮助信息
bash
ceph config help <key>
示例:
bash
ceph config help mon_allow_pool_delete
查看当前生效的配置(仅显示被显式设置过的)
bash
ceph config dump
注意:不显示纯默认值。
查看特定守护进程的所有配置(包括默认值)
bash
ceph config show-with-defaults mon.ceph1.whisky.cloud
查看特定守护进程的某个配置项
bash
ceph config get mon.ceph1.whisky.cloud mon_allow_pool_delete
设置配置项(永久,存储在数据库中)
bash
# 对所有 mon 实例设置
ceph config set mon mon_allow_pool_delete true
# 对特定 mon 实例设置
ceph config set mon.ceph1.whisky.cloud mon_allow_pool_delete false
# 对全局所有守护进程设置
ceph config set global osd_memory_target 4294967296
删除配置项(恢复默认值)
bash
ceph config rm mon.ceph1.whisky.cloud mon_allow_pool_delete
查看配置变更历史(类似 history)
bash
ceph config log
ceph config log 10 # 显示最近 10 条变更
回滚配置到某个历史版本(根据 log 中的序号)
bash
ceph config reset 15
reset会撤销该版本之后的所有变更。
3. 运行时动态调整(临时覆盖)
ceph config set 的变更需要守护进程自动拉取(通常几秒内生效),但某些参数必须重启才能生效。如果只想临时测试配置而不永久保存,可以使用 ceph tell 命令。
3.1 ceph tell 命令
ceph tell 直接向指定守护进程发送命令,支持临时修改配置(守护进程重启后失效)。
语法 :ceph tell <daemon_name> config set <key> <value>
bash
# 临时将 mon.ceph1 的 mon_allow_pool_delete 改为 true
ceph tell mon.ceph1.whisky.cloud config set mon_allow_pool_delete true
# 查看临时设置后的值
ceph tell mon.ceph1.whisky.cloud config get mon_allow_pool_delete
# 同时查看所有 mon 的该配置项
ceph tell mon.* config get mon_allow_pool_delete
临时修改的特性:
- 立即生效,无需重启。
- 守护进程重启后会恢复为配置数据库中的值。
- 适合紧急排错或临时调试。
3.2 ceph daemon 命令(本地)
如果 MON 集群不可用,可以在守护进程所在节点上使用 ceph daemon 命令,通过 admin socket 直接与本机守护进程通信。
bash
# 进入 cephadm shell(或直接在物理机执行,需安装 ceph-common)
cephadm shell
# 在 shell 内执行
ceph daemon mon.ceph1.whisky.cloud config show
ceph daemon mon.ceph1.whisky.cloud config get mon_allow_pool_delete
ceph daemon mon.ceph1.whisky.cloud config set mon_allow_pool_delete false
该命令同样临时生效,重启丢失。适合 MON 宕机时的故障排查。
3.3 ceph config set vs ceph tell 对比
| 特性 | ceph config set |
ceph tell ... config set |
|---|---|---|
| 存储位置 | MON 配置数据库 | 仅内存(守护进程内) |
| 持久化 | 是,重启后仍有效 | 否,重启后恢复数据库值 |
| 生效范围 | 所有匹配的守护进程(如所有 osd) | 仅指定的单个守护进程 |
| 是否批量 | 是(如 set osd 对所有 osd 生效) |
否,必须指定实例 |
| 推荐用途 | 长期配置、运维策略 | 紧急调试、临时测试 |
4. 网络配置
Ceph 集群通常涉及两种网络:
- Public 网络:客户端与 MON、OSD 之间的通信,也用于 OSD 之间的数据复制(如果未单独设置 Cluster 网络)。
- Cluster 网络:专用于 OSD 之间的心跳、数据复制和恢复,与 Public 网络隔离,可提高性能和安全性。
4.1 查看当前网络配置
bash
ceph config get mon public_network
ceph config get mon cluster_network
4.2 设置网络(在引导时或后期修改)
引导时指定:
bash
cephadm bootstrap --mon-ip 192.168.108.11 --cluster-network 192.168.101.0/24
后期修改(需要重启相关守护进程):
bash
ceph config set global public_network 192.168.108.0/24
ceph config set global cluster_network 192.168.101.0/24
修改
cluster_network后需要重启所有 OSD 才能生效。
4.3 为单个守护进程绑定特定 IP
MON 需要绑定到特定 IP,而 OSD 和 MDS 可以绑定到任何符合条件的 IP。
bash
ceph config set mon.ceph1.whisky.cloud public_addr 192.168.108.11
4.4 IPv6 配置
默认 IPv6 是禁用的(ms_bind_ipv6 = false)。启用步骤:
bash
ceph config set global ms_bind_ipv6 true
ceph config set global ms_bind_ipv4 false # 可选,若只用 IPv6
ceph config set global public_network 2001:db8::/64
网络中所有节点和设备必须同时支持并配置一致的 IPv6 网段。
4.5 防火墙端口
| 服务 | 端口 | 协议 | 说明 |
|---|---|---|---|
| MON (msgr2) | 3300 | TCP | Ceph 新协议 |
| MON (msgr1) | 6789 | TCP | 旧协议 |
| OSD / MDS | 6800-7300 | TCP | 每个 OSD 占用三个端口 |
| MGR Dashboard | 8443 | TCP | HTTPS |
| RGW 默认 | 80 | TCP | HTTP |
firewalld 示例:
bash
firewall-cmd --zone=public --add-service=ceph-mon --permanent
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
firewall-cmd --reload
5. 管理 Monitor(MON)
5.1 查看 MON 状态
bash
ceph status | grep mon
# 输出示例:mon: 3 daemons, quorum ceph1,ceph2,ceph3
ceph mon stat
ceph quorum_status -f json-pretty
5.2 分析 MON 映射
bash
ceph mon dump
输出内容:
epoch:映射版本fsid:集群唯一标识- 各个 MON 的 IP、端口、排名
5.3 添加和删除 MON
在 cephadm 环境下,通过服务放置管理:
bash
# 增加 MON 数量(在标签为 _admin 的节点上部署)
ceph orch apply mon --placement="label:_admin"
# 减少 MON 数量(直接停止并移除 daemon)
ceph orch daemon rm mon.ceph3 --force
生产环境 MON 数量应为奇数(3、5、7),以便 Paxos 选举。
5.4 MON 数据库维护
MON 数据库(store.db)随时间增长,可以压缩:
bash
# 在线压缩
ceph tell mon.ceph1.whisky.cloud compact
# 设置每次启动时自动压缩
ceph config set mon mon_compact_on_start true
设置告警阈值:
bash
ceph config set mon mon_data_size_warn 15G # 超过 15GB 告警 WARN
ceph config set mon mon_data_avail_warn 30 # 空闲容量低于 30% 告警 WARN
ceph config set mon mon_data_avail_crit 5 # 空闲容量低于 5% 告警 ERR
6. Cephx 认证与授权
Cephx 是 Ceph 默认的身份验证协议,使用共享密钥加密通信。默认开启。
6.1 认证相关配置
bash
ceph config get mon auth_service_required # 服务间认证,默认 cephx
ceph config get mon auth_cluster_required # 集群内守护进程间认证,默认 cephx
ceph config get mon auth_client_required # 客户端认证,默认 cephx
关闭认证会严重降低安全性,仅测试环境使用。需将以上三个参数设为
none。
6.2 用户账户类型
- 守护进程内部账户:如
osd.0、mon.ceph1,由 Ceph 内部使用。 - 客户端账户:以
client.为前缀,如client.admin、client.rbd。 - 特殊引导账户:
client.bootstrap-osd等,用于 OSD 引导。
6.3 查看用户账户
bash
# 列出所有用户
ceph auth list
# 查看特定用户详情
ceph auth get client.admin
ceph auth get osd.0
6.4 创建和管理用户
创建用户并同时赋予权限:
bash
# 添加用户(仅创建,无权限)
ceph auth add client.app1
# 创建用户并立即赋予权限
ceph auth get-or-create client.app2 mon 'allow r' osd 'allow rw pool=mypool'
# 仅生成密钥(不存储到集群)
ceph auth get-or-create-key client.app3
修改用户权限:
bash
ceph auth caps client.app2 mon 'allow rw' osd 'allow rw pool=mypool'
删除用户:
bash
ceph auth del client.app2
导出和导入用户密钥环:
bash
# 导出到文件
ceph auth export client.app1 -o client.app1.keyring
# 导入(合并或新增)
ceph auth import -i client.app1.keyring
6.5 权限(Capabilities)详解
权限格式:<daemon-type> 'allow <permissions>' [pool=<poolname>] [namespace=<namespace>]
| 权限 | 含义 | 适用对象 |
|---|---|---|
r |
读取 | mon、osd、mds |
w |
写入 | osd、mds |
x |
执行类方法(如 rados lock) | osd |
class-read |
调用类读取方法 | osd |
class-write |
调用类写入方法 | osd |
* |
全部权限(含管理命令) | mon、osd、mds |
profile osd |
预定义 OSD 权限 | mon、mgr |
profile rbd |
预定义 RBD 客户端权限 | mon、osd |
profile bootstrap-osd |
OSD 引导权限 | mon |
预定义 profile 简化授权:
bash
# RBD 客户端典型权限
ceph auth get-or-create client.myrbd mon 'profile rbd' osd 'profile rbd'
限制到特定池和命名空间:
bash
# 仅允许访问 pool=mydata 中的所有对象
ceph auth get-or-create client.myapp mon 'allow r' osd 'allow rw pool=mydata'
# 仅允许访问 pool=mydata 中 namespace=images 的对象
ceph auth get-or-create client.myapp2 mon 'allow r' osd 'allow rw pool=mydata namespace=images'
# 仅允许访问对象名前缀为 "prefix_" 的对象
ceph auth get-or-create client.myapp3 mon 'allow r' osd 'allow rw object_prefix prefix_'
6.6 密钥环文件位置
默认查找路径:/etc/ceph/$cluster.$name.keyring
例如:/etc/ceph/ceph.client.admin.keyring、/etc/ceph/ceph.client.rbd.keyring
使用 --keyring 或 -k 选项可指定其他位置。
6.7 指定用户身份运行命令
bash
# 使用 --id 或 -n
ceph --id rbd osd ls
ceph -n client.rbd osd ls
# 通过环境变量
export CEPH_ARGS='--id rbd'
ceph osd ls
7. 实践:创建受限用户并测试
7.1 创建仅能访问特定池的用户
bash
# 创建池
ceph osd pool create testpool 32 32
rbd pool init testpool
# 创建用户,仅允许读写 testpool
ceph auth get-or-create client.tester mon 'allow r' osd 'allow rw pool=testpool' -o /etc/ceph/ceph.client.tester.keyring
# 验证
ceph --id tester osd pool ls
# 应该看到 testpool(以及其他池名称,但实际读写会被限制)
# 尝试写入 testpool
echo "test" > /tmp/testfile
rados --id tester -p testpool put obj1 /tmp/testfile # 应成功
# 尝试写入其他池(如 images_pool)
rados --id tester -p images_pool put obj1 /tmp/testfile # 应报错权限不足
7.2 在客户端节点使用
bash
# 将密钥环和配置复制到客户端
scp /etc/ceph/ceph.client.tester.keyring client:/etc/ceph/
scp /etc/ceph/ceph.conf client:/etc/ceph/
# 在客户端测试
rbd --id tester --pool testpool create demo --size 1G
rbd --id tester map testpool/demo # 映射成功
8. 配置修改最佳实践
- 优先使用集中配置数据库 (
ceph config set),而非直接编辑ceph.conf。 - 对于需要立即生效的临时调整 ,使用
ceph tell。 - 修改
ceph config set后,无需重启大部分守护进程(某些参数如public_network需要重启)。 - 修改重要配置前,先使用
ceph config get备份当前值。 - 使用
ceph config log审计配置变更历史。
9. 本期小结与速查表
9.1 核心命令速查
| 操作 | 命令 |
|---|---|
| 查看所有可配置参数 | ceph config ls |
| 查看某个参数的帮助 | ceph config help <key> |
| 查看显式配置的项 | ceph config dump |
| 查看特定守护进程的所有配置(含默认值) | ceph config show-with-defaults <daemon> |
| 永久设置配置 | ceph config set <who> <key> <value> |
| 永久删除配置(恢复默认) | ceph config rm <who> <key> |
| 临时设置(重启丢失) | ceph tell <daemon> config set <key> <value> |
| 查看配置历史 | ceph config log |
| 回滚配置 | ceph config reset <version> |
| 列出用户 | ceph auth list |
| 获取用户详情 | ceph auth get <entity> |
| 创建用户并授权 | ceph auth get-or-create <entity> <caps> |
| 修改用户权限 | ceph auth caps <entity> <caps> |
| 删除用户 | ceph auth del <entity> |
| 导出密钥环 | ceph auth export <entity> -o <file> |
| 导入密钥环 | ceph auth import -i <file> |
9.2 关键配置参数示例
| 参数 | 作用 | 示例值 |
|---|---|---|
public_network |
客户端/集群通信网络 | 192.168.108.0/24 |
cluster_network |
OSD 后端复制网络 | 192.168.101.0/24 |
mon_allow_pool_delete |
是否允许删除存储池 | true / false |
osd_pool_default_size |
新建池默认副本数 | 3 |
osd_pool_default_min_size |
最小可用副本数 | 2 |
rbd_default_features |
新建 RBD 镜像默认功能 | layering,exclusive-lock,... |
auth_service_required |
服务间认证模式 | cephx / none |
mon_data_size_warn |
MON 数据库告警阈值 | 15G |
下一期预告:Ceph 块存储(RBD)完全指南,包括镜像管理、快照、克隆、导出导入及跨集群 Mirror。