
查看日志
# 查看参数来源(谁覆盖了谁)
ceph config log
这是一个非常专业、非常“运维工程化”的问题,已经不只是“会用 Ceph”,而是 如何做集群级配置对比与审计。
我会给你一套可落地、可自动化、可对比的方法,而不是零散命令。
核心结论先给出
在 cephadm 管理的集群中:
- ❌ 不存在一个“完整配置文件”可以直接拷走对比
- ✅ 必须从 4 个维度导出配置快照,组合后才是“集群真实配置”
这 4 个维度分别是:
1️⃣ 集群级配置(ceph config DB)
2️⃣ 服务部署规格(orchestrator spec)
3️⃣ MON / OSD 拓扑与元数据
4️⃣ 主机与设备映射信息
下面我按 “导出什么 → 怎么导出 → 如何对比” 的逻辑讲。
如果你想对比 两个集群 A / B 的 OSD、MON 等配置,合理的对比对象是:
| 对比项 | 命令来源 |
|---|---|
| MON 数量 / IP / quorum | ceph mon dump |
| OSD 数量 / 分布 / 权重 | ceph osd tree |
| OSD 磁盘映射 | ceph osd metadata |
| 生效配置参数 | ceph config dump |
| cephadm 部署规则 | ceph orch ls |
| 主机与磁盘 | ceph orch device ls |
👉 不是对比 /etc/ceph/ceph.conf
在 每个集群上分别执行:
mkdir -p ceph-config-export/{mon,osd,orch,config,host}
cd ceph-config-export
这样导出的内容可以直接 diff -r。
ceph mon dump > mon/mon_dump.txt
ceph mon stat > mon/mon_stat.txt
用于对比:
ceph config dump | grep '^mon\.' > mon/mon_config_dump.txt
或者更全面:
ceph config show mon > mon/mon_config_show.txt
ceph osd tree > osd/osd_tree.txt
用于对比:
ceph osd metadata > osd/osd_metadata_all.json
这是 对比 OSD 的“黄金文件”,包含:
for id in $(ceph osd ls); do
ceph config show osd.$id > osd/osd_${id}_config.txt
done
用于发现:
ceph config dump > config/config_dump.txt
这是 最终生效配置的权威来源。
📌 对比时重点看:
who = globalwho = osdwho = monceph config log > config/config_log.txt
用于审计:
ceph orch ls --format json > orch/orch_ls.json
重点关注:
ceph orch ps --format json > orch/orch_ps.json
ceph orch device ls --format json > host/device_ls.json
用于对比:
ceph orch host ls --format json > host/host_ls.json
假设你有:
clusterA/ceph-config-export
clusterB/ceph-config-export
diff -ruN clusterA clusterB | less
jq -S . osd_metadata_all.json > a.json
jq -S . osd_metadata_all.json > b.json
diff a.json b.json
| 类别 | 影响 |
|---|---|
| OSD 数量 / 权重 | 数据均衡 |
| public / cluster network | 网络性能 |
| osd_memory_target | 内存占用 |
| mon_allow_pool_delete | 安全性 |
| OSD 设备类型 | 性能 |
Ceph 的“配置”是分散的、动态的、声明式的
真正可对比的不是一个文件,而是:
“状态 + 拓扑 + 生效参数 + 部署规则”的组合快照
你下一步可以直接让我做这些事之一:
你可以直接说:
“帮我写一个导出脚本” 或
“我有两份导出结果,帮我分析差异”
这两个问题问得非常好,而且是“真正理解 Ceph 数据路径”必须要想清楚的问题。
我会严格区分概念、给你因果链条,避免“似是而非”的理解。
下面我按问题分别讲,并在最后给你一个统一的数据路径认知模型。
不是一定会进行“多对象条带化”
但:
逻辑上的 striping 机制一定存在,只是可能退化为“单对象”
这是一个非常关键的区分点。
在 Ceph 中,条带化发生在 RADOS 层,对象(object)是最小存储单元:
这个过程叫 object striping。
object_size = 4MB
stripe_unit = 4MB
stripe_count = 1
这意味着:
📌 结果:
逻辑上有 striping 机制,但实际 I/O 路径只有一个对象
这在表现上就像“没有条带化”。
只要满足任意一个条件:
rbd create img --size 100G \
--stripe-unit 4M \
--stripe-count 8
这时:
一定会发生的是:
- 对象化(objectization)
- PG 映射
- CRUSH 分布
但不一定发生的是:
- 并行多对象 I/O
“Ceph 是不是像 RAID 0 一样,写一次一定拆成多份?”
不是。
这是一个架构层面的设计问题,不是“性能孰优孰劣”这么简单。
kernel rbd 追求的是:
- 稳定
- 低延迟
- 标准块设备语义
librbd 追求的是:
- 灵活
- 可扩展
- 云 / 容器 / 用户态集成能力
👉 它们不是“替代关系”,而是 定位不同。
App
↓
VFS
↓
rbd kernel driver
↓
RADOS
📌 优势:低延迟、小 I/O
App
↓
librbd (user space)
↓
librados
↓
kernel TCP
📌 理论上延迟更高
内核 rbd:
而 Ceph 是一个 快速演进的分布式系统。
例如:
| 功能 | kernel rbd | librbd |
|---|---|---|
| 快照链高级管理 | ❌ | ✅ |
| 镜像迁移 | ❌ | ✅ |
| 动态 QoS | ❌ | ✅ |
| 异步 I/O | 部分 | 完整 |
| RBD mirroring | ❌ | ✅ |
| 云平台集成 | ❌ | ✅ |
典型场景:
它们:
👉 只能用 librbd
librbd 支持:
这在云平台是 刚需。
在 大 I/O、并发、高队列深度 场景下:
librbd 不一定比 kernel rbd 慢
原因:
Block I/O
↓
Object mapping (striping optional)
↓
PG
↓
CRUSH
↓
OSD
而:
你可以接着问我:
这些问题,已经是 Ceph 内核级理解 了。
可以,而且这是 RBD 性能调优中非常核心、但也最容易被误用的一组参数。
我会按 “能不能设 → 怎么设 → 什么时候该设 → 设错会怎样” 四个层次给你讲清楚。
✅ 这三个参数都是“可以设置的”
❌ 但 只能在 RBD 镜像创建时设置
❌ 创建后不能修改
也就是说:
object_size
stripe_unit
stripe_count
属于 RBD 镜像的不可变布局参数(immutable layout)。
object_sizestripe_unitobject_sizestripe_count在创建 RBD 镜像时:
rbd create testimg \
--size 100G \
--object-size 8M \
--stripe-unit 1M \
--stripe-count 8
或者显式写成字节:
--object-size 8388608
❗ 这三个参数不是“随便配”的
必须满足:
stripe_unit × stripe_count ≤ object_size
否则:
rbd: error: invalid stripe parameters
| object_size | stripe_unit | stripe_count | 合法 |
|---|---|---|---|
| 4MB | 4MB | 1 | ✅ |
| 8MB | 1MB | 8 | ✅ |
| 4MB | 1MB | 8 | ❌ |
| 8MB | 4MB | 4 | ❌ |
rbd info pool/image
输出示例:
stripe unit: 4194304 B
stripe count: 1
object size: 4194304 B
这是最容易踩坑的地方,我给你明确建议。
👉 不要改,默认就是最优解
object_size = 4MB
stripe_unit = 4MB
stripe_count = 1
原因:
👉 可以增大并行 striping
示例:
object_size = 8MB
stripe_unit = 1MB
stripe_count = 8
效果:
👉 只建议在 专用大盘池 使用
因为:
所以 Ceph 干脆禁止。
rbd create newimg --object-size ...
rbd export oldimg old.img
rbd import old.img newimg
或者用:
rbd deep copy
RBD striping ≠ 性能一定更好
错误配置会导致:
小 I/O 用默认,大吞吐才条带化
改参数之前,先想清楚 I/O 模型
你可以接着问我:
这些已经是 Ceph 性能调优的核心区。
