前 17 篇把 Ceph RADOS 内核拆到可排障的精度,并对照了三条替代路径的机制分歧。选型若再写成「各有优劣看场景」,等于把机制丢掉。
本文是终章:用机制排除树收束选型判断,钉死 Crimson 在 Squid v19.2.5 的 preview 边界,用 Tentacle+ 标签隔离未稳定特性,划清 Rook/CSI 续作分工,并给出可证伪的开放问题。不做跨方案延迟排行榜。
本文是「Ceph / RADOS 存储内核」系列第 18 篇(共 18 篇 · 终章)。→ 系列目录
篇目 核心内容 第 17 篇 · 对照替代路径 MinIO / 云块 / 本机 NVMe+SPDK 第 18 篇 · 选型收束(终章) 排除树、Crimson、Tentacle+、开放问题
版本锚定:机制结论基于 Ceph Squid v19.2.5。Tentacle(20.x)特性须显式标注「Tentacle+」,本文默认不跟。
一、先排除,再选择(机制判据)
排除树每一叶必须回答一个可证伪的机制问题,而不是「看场景」。
flowchart TD
need{"数据是否必须跨节点冗余\n或被多节点并发权威访问?"}
need -->|"否"| local{"应用 P99 是否硬要求\n低于约 1ms?"}
local -->|"是"| spdk["本机 NVMe + SPDK\n付得起轮询核税?"]
local -->|"否"| kernel["内核 NVMe / 云块"]
need -->|"是"| prep{"编制上能否维护\nCRUSH/PG/五轴排障?"}
prep -->|"否"| hosted["托管块/对象\n或更简单自管"]
prep -->|"是"| iface{"主接口语义?"}
iface -->|"纯 S3"| s3tax{"能否接受 bucket index\nOMAP + LIST 归并税?"}
s3tax -->|"否,且规模中小"| minio["MinIO"]
s3tax -->|"是,或已有 RADOS"| rgw["Ceph RGW"]
iface -->|"块"| cloud{"是否跑在公有云\n且底层已是云盘?"}
cloud -->|"是"| ebs["直接用云块\n勿叠 Ceph"]
cloud -->|"否"| lat{"副本 RTT+WAL 后\nP99 是否仍进 SLO?"}
lat -->|"否"| nvmelocal["本机/NVMe-oF\n非 Ceph"]
lat -->|"是"| rbd["Ceph RBD"]
iface -->|"POSIX"| sync{"是否频繁 fsync\n或强同步写?"}
sync -->|"是"| notfs["别用 CephFS\n本机或其它"]
sync -->|"否"| cephfs["CephFS\n接受 caps/MDS 税"]
| 机制判据(问句) | 若「否」 | 倾向 |
|---|---|---|
| 需要跨节点冗余或多节点权威并发? | 分布式税无对象 | 本机 NVMe / 云块 |
| 付得起 CRUSH/PG/五轴排障编制? | 机制再强也运维不起 | 托管或 MinIO |
| 纯 S3 且接受 index OMAP/LIST 归并? | RADOS 元数据路径过重 | MinIO |
| 公有云上是否避免「云盘再做 OSD」? | 双层延迟 | 云块直用 |
| 块接口 P99 是否容忍副本+WAL? | Ceph RBD 越界 | 本机/NVMe-oF |
| POSIX 是否避免频繁 fsync? | MDS journal 串在关键路径 | 本机 FS / 其它 |
甜区:私有云/裸机,需要 RBD±CephFS±RGW 统一 RADOS,数十 TB–PB,有编制,P99 大约在数毫秒到数十毫秒可接受。
苦区:中小纯 S3、公有云叠 Ceph、OLTP 亚毫秒硬 SLO、CephFS 跑强同步库、无人排障。
二、系列阅读路径回收
| 路径 | 篇目 | 回收什么 |
|---|---|---|
| 必读核心 | 01 → 02 → 05 → 06 → 08 → 10 → 16 | 坐标系 + Map + PG + 写路径 + BlueStore + recovery + 排障 |
| 本地落盘 | 07 → 08 → 09 | BlueStore |
| 接入层 | 12 → 13 → 14 | RBD / CephFS / RGW |
| 对照选型 | 01 → 17 → 18 | 机制差 + 排除树 |
| 完整通读 | 01 → … → 18 | 系统掌握 |
五个关键问题到终章仍然够用:争议要么落在「RADOS 税是否值得付」,要么落在「编制是否匹配」,很少落在营销口号。
三、Crimson OSD:Squid v19.2.5 边界
动机
Crimson(crimson-osd)用
SeaStar reactor 替换 ClassicOSD
线程池,长期目标含原生 SeaStore;并继续可挂
BlueStore。设计上瞄准高速网卡/NVMe,并可结合 DPDK/SPDK
一类用户态路径(社区表述;见 ceph.io Crimson 项目页)。
Squid 上的准确状态(preview 边界)
依据 Squid v19.2.0 release notes 与
Crimson 项目现状(A/B 级:ceph.io 发布说明 +
项目页;docs.ceph.com 上 Crimson 专章以
latest 为完整,Squid 树未必同步镜像):
| 断言 | Squid v19.2.x |
|---|---|
| 定位 | 首个 Crimson tech preview 随 Squid 发布 |
| 生产 | 不适合生产;需显式实验旗标才允许启动 |
| 工作负载口径 | 项目页叙述含 RBD on replicated pools 等;EC、RGW、mClock、完整 scrub 调度等仍在 WIP |
| 对象存储后端 | BlueStore(经 alien 线程)可用;SeaStore 作为 Crimson 原生存储的 tech preview 在 Tentacle 叙述中强调——勿把 SeaStore 写成「Squid 已生产默认」 |
| 部署闸门 | enable_experimental_unrecoverable_data_corrupting_features
含
crimson、osd set-allow-crimson、池
crimson 标志、crimson_cpu_num
等(见 latest Crimson
文档;操作前核对本集群文档版本) |
工程间隙:Classic 线程模型的
MON/MGR/librados 与 SeaStar OSD 之间有适配层;BlueStore
路径要单独配 crimson_bluestore_* CPU 集并与
reactor 集互斥;第 15–16 篇的 Classic 排障坐标系不能原样套到
Crimson。
四、Tentacle(20.x):Tentacle+ 标签
Tentacle 是 Squid 之后的主版本线。下文凡未进 Squid 稳定承诺的,一律标 Tentacle+(该版本或之后才跟踪,以正式 release notes 为准;B 级:社区 roadmap / 项目页)。
- Crimson / SeaStore(Tentacle+):向可测、可反馈的预览深化;生产就绪不是 Squid 承诺,也不是本文可担保的日期。
- RGW active-active 强一致(Tentacle+):相对今日 bi-log 最终一致,强一致跨 WAN 的 RTT 税是否可接受仍开放。
- CephFS bal / 大目录(Tentacle+):subtree thrashing 与 fragment 可观测性继续迭代。
- MGR / cephadm 体验(Tentacle+):编排便利不等于 RADOS 内核语义变化。
正文默认机制仍钉在 Squid v19.2.5;看见 Tentacle 特性时先查是否标了 Tentacle+。
五、Rook / CSI:续作边界(本系列停在此)
Rook(K8s operator)与 CSI 解决的是编排:StorageClass、PVC、快照类、升级钩子。本系列 01–18 停在 RADOS 内核:PVC 一旦挂上,I/O 仍是 librados/krbd → PG → BlueStore。
明确不写进本系列的:
- Rook 的 CRD/Helm 操作全书、多租户 StorageClass 菜谱。
- CSI 与每个 K8s 小版本的兼容矩阵。
- 「在 K8s 上点一下就有 Ceph」的安装叙事。
已知摩擦(只点名,留给续作):CSI RBD features 与节点内核 krbd 能力不一致;Rook 自动升级若跳过 Ceph「一次一个主版本」约束会炸;CephFS 目录级 snap 与 VolumeSnapshot 卷级语义不对齐。这些是 K8s 存储续作 的题目,不是本篇能关闭的开放问题。
六、系列级开放问题(可证伪)
6.1 Classic ↔︎ Crimson 混跑与 peering
问题:Tentacle+ 若宣称混跑,跨引擎 PG 的
last_epoch_started / incomplete 处理是否与双
Classic 一致?
检验:同池一 PG 的 acting set 含 Classic 与
Crimson 各一,注入短网裂再愈合;对比仅 Classic 对照簇的
peering 时长与是否出现仅混跑才有的
incomplete。
入口:Crimson
项目页;dev/osd_internals peering 文档。
6.2 OSD 用户态轮询与 recovery 的 CPU 隔离
回收 SPDK
§4.3 与 本系列第
17 篇 实验表。
关闭条件:隔离核集上无 recovery
同峰、IRQ/softirq 不泄漏;否则「SPDK 与 Ceph OSD
共置」在排除树上判负。
6.3 RGW 双活冲突可计量性
问题:active-active 下同 key
双写,冲突是否能被 sync status / bilog
指标稳定计数?
检验:固定两 zone、同 key 并发 PUT \(N\) 次,读两边 ETag
分叉次数是否贴近预期冲突模型,而非「有时丢、有时静默」。
现状:Squid 主路径仍是 last-write-wins
最终一致。
6.4 CephFS bal thrashing
问题:给定 inode 创建速率,是否存在
mds_bal_* 使 10 分钟内同 dirino export 次数趋近
0?
检验:见第 13 篇开放问题;失败则「多 active
治热点」在该负载下证伪。
七、给读完本系列的人三条收束
- 排除树进 ADR:写清卡在哪一叶机制判据,以及复盘触发条件(迁云、SLO 收紧、编制变化、Crimson 是否仍 preview)。
- 若选了 Ceph:第 16 篇五轴进发布门禁;nearfull 有人负责扩容。
- 若没选:用第 17 篇机制表做代际复盘,禁止无口径跑分截图重开争论。
终章立场:Ceph 值得写 18 篇,是因为失败可命名——CRUSH 域、peering、BlueStore deferred、mClock、RBD COW、MDS caps、RGW OMAP。选型若离开这些名字,讨论退回品牌口号。记住一个动作:先排除,再实验,再迁移——实验自带口径,迁移自带回滚与排障坐标。
写进架构决策记录时建议附一句否证条件,例如:若主业务尾延迟目标从二十毫秒收到两毫秒,或存储值班编制从两人减到零,排除树必须重跑,而不是靠口头「我们一直用 Ceph」。
排除树与第十七篇机制表是同一判决的两面:第十七篇回答「四条路径的不变量差在哪」,本篇回答「差在哪一叶时该停」。两者都拒绝无口径跑分截图。
把 Crimson 读成一句决策语言:Squid 可以让你实验下一代对象存储守护进程,但不能让你把生产排障手册换成预览方言。第十五到十六篇坐标系默认经典实现;混用两套假设会制造假关闭。SeaStore 在触手版本叙述中作为原生存储预览出现,不等于乌贼稳定版已经把它设成默认后端。
触手版本标签的纪律是:凡未写进乌贼正式发布说明的能力,正文只允许以「触手及以上」出现,并指向正式发布说明作为关闭条件。把预览特性写进生产决策记录而不标版本边界,是本系列明确反对的做法。
编排层续作边界再强调一次:洛克与容器存储接口解决的是声明式挂载与生命周期,不改写归置组对等、蓝店写路径或桶索引对象映射表。读者若只做编排、不读内核篇,会在「挂载成功但延迟怪」时缺少排障轴语言。已知摩擦包括镜像特性集与节点内核能力不一致、自动升级跳过主版本约束、目录级快照与卷级快照语义不对齐——这些留给后续专题,本篇只负责停损线。
开放问题的关闭条件必须是测量或正式文档变更,而不是社区幻灯片。混跑对等、处理器隔离、双活冲突计数、元数据均衡震荡,四条都可以在实验室用对照实验证伪;证伪后应回写排除树对应叶,而不是在正文里用「未来会好」抹平。
若时间只够三篇,读第一、十六、十八篇也能带着排除树与排障坐标离开;缺的是接入层细节,不是选型语言。全量通读的价值在于把接入税与恢复税说成可命名机制,便于事故复盘时对上号。
系列收束检查
本系列不替代洛克编排专题,也不替代绯红专篇;它只把分布式对象内核的失败说成可命名机制,并把何时不该付税写进排除树。
终章交付前用三条自检代替口号:排除树每一叶是否对应可观察机制;乌贼版本上的绯红预览边界是否写清「不可生产」;触手及以上特性是否都带标签。若三条任一失败,正文还不能当选型依据,只能当问题清单。
与站内用户态存储栈终章对齐的纪律是:先排除,再实验,再迁移。实验必须写出硬件、负载、副本策略与采样窗口;迁移必须写出回滚与排障坐标归属。缺任一项,就把讨论降级为意向,而不是架构决策。
参考资料
官方文档 / 项目页(A/B)
- Ceph Squid v19.2.0 发布说明 — Crimson first tech preview、RBD replicated 叙述(ceph.io news)
- Crimson Project — 支持面 / WIP(EC、RGW、mClock…);Tentacle 与 SeaStore preview 叙述
- Crimson 部署与 CPU 旗标 — docs.ceph.com/en/latest/crimson/(核对本集群文档版本;实验旗标名以当时文档为准)
- 源码对照(Classic,本系列主线):
src/osd/、src/os/bluestore/、src/librbd/、src/rgw/@ v19.2.5;Crimson 树在src/crimson/(预览路径,勿与 Classic 排障坐标系混用) - Weil et al. OSDI 2006 — subtree 奠基
论文谱系
- Weil et al. OSDI 2006;Weil et al. SC 2006(CRUSH);Weil PhD UCSC 2007
站内分工
→ 上一篇:对照替代路径 · 系列目录
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【Ceph RADOS】RADOS 内核全景:五轴坐标系与 18 篇路线
补齐站内 distributed/38 之上的 RADOS 内核层缺口;定义 Map 传播、通信、一致性、本地存储、接入代价五条坐标系,给出 18 篇阅读路线与系列边界。
【Ceph RADOS】MON/MGR 与 Map:quorum、epoch 传播与客户端可见性
拆解 Ceph MON Paxos quorum、OSDMap/PGMap 结构与 epoch 传播机制;说明 MGR 主备模型与模块框架;分析客户端 epoch 缓存与可见性窗口的边界条件。
【Ceph RADOS】OSD 与 Messenger:daemon 结构、msgr2 协议与 Op 入队路径
拆解 ceph-osd daemon 内部结构、msgr2 Frame 格式与握手阶段,追踪 Op 从 TCP socket 经 AsyncMessenger、OSD::dispatch_context 到 ShardedOpWQ 的完整入队路径。
【Ceph RADOS】CRUSH 加深:rule/bucket/weight 机制与失败域语义
相对 distributed/38 的 CRUSH 算法概览,深入 bucket 类型的算法复杂度差异、rule step 语义、weight 体系与 primary_affinity,分析 chooseleaf 与失败域的精确定义及 CRUSH 与一致性哈希的本质区别。