土法炼钢 · 系统与基础设施

【Ceph RADOS】选型收束:排除树、Crimson 边界与系列开放问题

文章导航

分类入口
storagedistributed
标签入口
#ceph#selection#crimson#tentacle#rook#csi#open-questions#squid#v19.2.5

目录

前 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_featurescrimsonosd 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 / 项目页)。

正文默认机制仍钉在 Squid v19.2.5;看见 Tentacle 特性时先查是否标了 Tentacle+。


五、Rook / CSI:续作边界(本系列停在此)

Rook(K8s operator)与 CSI 解决的是编排:StorageClass、PVC、快照类、升级钩子。本系列 01–18 停在 RADOS 内核:PVC 一旦挂上,I/O 仍是 librados/krbd → PG → BlueStore。

明确不写进本系列的

已知摩擦(只点名,留给续作):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 治热点」在该负载下证伪。


七、给读完本系列的人三条收束

  1. 排除树进 ADR:写清卡在哪一叶机制判据,以及复盘触发条件(迁云、SLO 收紧、编制变化、Crimson 是否仍 preview)。
  2. 若选了 Ceph:第 16 篇五轴进发布门禁;nearfull 有人负责扩容。
  3. 若没选:用第 17 篇机制表做代际复盘,禁止无口径跑分截图重开争论。

终章立场:Ceph 值得写 18 篇,是因为失败可命名——CRUSH 域、peering、BlueStore deferred、mClock、RBD COW、MDS caps、RGW OMAP。选型若离开这些名字,讨论退回品牌口号。记住一个动作:先排除,再实验,再迁移——实验自带口径,迁移自带回滚与排障坐标。


写进架构决策记录时建议附一句否证条件,例如:若主业务尾延迟目标从二十毫秒收到两毫秒,或存储值班编制从两人减到零,排除树必须重跑,而不是靠口头「我们一直用 Ceph」。

排除树与第十七篇机制表是同一判决的两面:第十七篇回答「四条路径的不变量差在哪」,本篇回答「差在哪一叶时该停」。两者都拒绝无口径跑分截图。

把 Crimson 读成一句决策语言:Squid 可以让你实验下一代对象存储守护进程,但不能让你把生产排障手册换成预览方言。第十五到十六篇坐标系默认经典实现;混用两套假设会制造假关闭。SeaStore 在触手版本叙述中作为原生存储预览出现,不等于乌贼稳定版已经把它设成默认后端。

触手版本标签的纪律是:凡未写进乌贼正式发布说明的能力,正文只允许以「触手及以上」出现,并指向正式发布说明作为关闭条件。把预览特性写进生产决策记录而不标版本边界,是本系列明确反对的做法。

编排层续作边界再强调一次:洛克与容器存储接口解决的是声明式挂载与生命周期,不改写归置组对等、蓝店写路径或桶索引对象映射表。读者若只做编排、不读内核篇,会在「挂载成功但延迟怪」时缺少排障轴语言。已知摩擦包括镜像特性集与节点内核能力不一致、自动升级跳过主版本约束、目录级快照与卷级快照语义不对齐——这些留给后续专题,本篇只负责停损线。

开放问题的关闭条件必须是测量或正式文档变更,而不是社区幻灯片。混跑对等、处理器隔离、双活冲突计数、元数据均衡震荡,四条都可以在实验室用对照实验证伪;证伪后应回写排除树对应叶,而不是在正文里用「未来会好」抹平。

若时间只够三篇,读第一、十六、十八篇也能带着排除树与排障坐标离开;缺的是接入层细节,不是选型语言。全量通读的价值在于把接入税与恢复税说成可命名机制,便于事故复盘时对上号。

系列收束检查

本系列不替代洛克编排专题,也不替代绯红专篇;它只把分布式对象内核的失败说成可命名机制,并把何时不该付税写进排除树。

终章交付前用三条自检代替口号:排除树每一叶是否对应可观察机制;乌贼版本上的绯红预览边界是否写清「不可生产」;触手及以上特性是否都带标签。若三条任一失败,正文还不能当选型依据,只能当问题清单。

与站内用户态存储栈终章对齐的纪律是:先排除,再实验,再迁移。实验必须写出硬件、负载、副本策略与采样窗口;迁移必须写出回滚与排障坐标归属。缺任一项,就把讨论降级为意向,而不是架构决策。

参考资料

官方文档 / 项目页(A/B)

论文谱系

站内分工

上一篇:对照替代路径 · 系列目录

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。


By .