私家 homelab 篇三:Ceph 存储集群的七年实践
从混合容量、业务高可用到性能与维护,回顾 Ceph 在 homelab 中的长期应用

早年搭建 Ceph 集群时,我就计划整理一篇应用经验文章。后来考虑到家庭环境中的长期稳定性还需要时间验证,便决定运行更长一段时间后,再来回顾实际使用情况。如今集群已经运行了大约七年,其间也经历了硬盘和节点的陆续轮换。

本文分享我在 homelab 存储方案上的取舍,以及使用 Ceph 过程中的性能、稳定性和维护经验。文中的故障经历与性能感受来自我自己的使用经历,供有类似需求的读者参考。

存储方案选择

NAS 首先是一种通过网络提供文件服务的使用方式,并不限定底层如何存储数据。成品 NAS 可以使用传统 RAID,也可以提供自己的混合容量方案。自行搭建的 NAS 则可以选择 Linux 软件 RAID、ZFS 或 Unraid。Ceph 也可以作为文件服务的底层,但它本身是一套分布式存储系统。

早年的存储方案

在使用 Ceph 之前,我在 2015 年采用的是硬件 RAID 卡 + JBOD 的方案。长期使用中,主要遇到了三个问题:

  • 不同容量硬盘带来的空间浪费
    阵列按较小成员盘的容量组织,后续加入更大容量的硬盘时,多出的空间无法充分利用。

  • 故障恢复重建较慢
    更换故障盘后,阵列重建耗时较长,期间还会影响日常读写性能。

  • 重建期间的多盘故障风险
    阵列在降级状态下等待重建完成,如果其他成员盘再发生故障,超过冗余能力就可能丢失数据。

常见存储方案对比

家庭存储中常见的几个选择,处在不同的产品和技术层面:

  • RAID 是磁盘组织技术,可以由硬件阵列卡或操作系统实现,常作为 NAS 的底层存储。

  • 群晖 提供集成存储管理、文件共享和应用服务的成品 NAS,本文以其 SHR-2 存储池为对比对象。

  • ZFS 将文件系统与卷管理结合,是自建 NAS 常见的底层选择。

  • Unraid 是面向自建存储的操作系统,提供主阵列及独立存储池的管理。

  • Ceph 是分布式存储系统,可为上层业务提供块、文件和对象存储接口。

单机存储在主机内部实现磁盘冗余,Ceph 可将副本分布到不同主机

图中的容量柱表示汇总占比,不是真实分区,未计入元数据和恢复预留。Ceph 副本的不同颜色仅用于区分容量开销,不表示主从关系。

单盘冗余方案在一块盘故障后便失去冗余,重建期间若再发生磁盘故障,就可能丢失数据。对于长期运行、硬盘逐步老化的家庭存储,单盘冗余的可靠性风险较高,本文直接以至少容忍两块硬盘故障的方案为基准讨论。

对比配置:RAID 6、群晖 SHR-2、ZFS RAIDZ2、Unraid 双校验、Ceph 三副本。

维度 RAID 群晖 ZFS Unraid Ceph

部署

单机

单机

单机

单机

分布式

配置

RAID 6

SHR-2

RAIDZ2

双校验盘

跨主机三副本

原理

条带 + 双重校验

容量分区组合 + 双盘冗余

写时复制 + 双重校验

独立数据盘 + 双校验盘

分布式对象副本

块存储

△
本地块设备,网络导出需另配服务

✓
通过 SAN Manager 提供 iSCSI LUN

✓
提供 zvol,网络导出需另配服务

△
需额外配置 iSCSI 等服务

✓
通过 RBD 提供分布式块设备

对象存储

△
需额外部署对象存储服务

△
需额外应用,取决于机型支持

△
需额外部署对象存储服务

△
需额外部署对象存储应用

✓
通过 RGW 提供兼容 S3 的接口

混合容量

△
通常按最小盘组织

✓
受容量组合约束

△
同一 vdev 按最小盘组织

✓
两块校验盘均不小于最大数据盘

✓
按权重分布,受故障域约束

扩容

△
取决于阵列实现

△
受盘型与容量约束

△
取决于布局与版本

✓
可增加数据盘

✓
可增加 OSD

双盘容错

✓
同一阵列容忍两盘故障

✓
存储池容忍两盘故障

✓
每个 vdev 容忍两盘故障

✓
主阵列容忍两盘故障

✓
健康三副本前提下仍有副本

故障域

△
磁盘级

△
磁盘级

△
磁盘级

△
磁盘级

✓
可定制:节点、机架、PDU、IDC 等

节点维护

✗

✗

✗

✗

✓
需满足副本、仲裁及入口 HA 条件

跨机扩容

✗

✗

✗

✗

✓

设备轮换

△
逐盘重建,整机迁移依赖阵列兼容性

△
逐盘重建,整机迁移受机型限制

✓
逐盘替换,整机可迁移原池

✓
逐盘重建,整机可迁移原盘

✓
逐盘、逐节点替换,仅重分布相关数据

恢复方式

阵列重建

阵列重建

resilver 恢复冗余

利用剩余盘与校验重建

从其他副本恢复

重建影响

阵列成员盘承担读写

存储池相关成员盘承担读写

受影响 vdev 承担读写

剩余成员盘与校验盘参与恢复

相关 OSD、节点与网络承担恢复负载

维护范围

主机、阵列卡与磁盘

NAS 主机与存储池

主机、存储池与 vdev

主机、阵列与校验盘

多节点、网络与集群服务

容量开销

相当于两块成员盘

双盘冗余,另受容量组合影响

每个 vdev 相当于两块盘

两块校验盘

可配置
双副本为 1/2,三副本为 2/3

图例:✓ 支持,△ 有条件或需额外设计,✗ 该部署本身不提供。

  • 健康的三副本在两块数据盘故障后仍保留数据,但持续读写还受最小副本数和 MON 仲裁约束。例如 min_size=2 时,相关 PG 只剩一份副本就会停止 I/O,详见 存储池说明。

  • 容量开销取决于冗余策略,节点数不决定副本数。三节点也可以配置双副本,冗余占原始容量的 1/2,但不提供双盘容错。三副本的冗余占 2/3,纠删码可以更低。实际容量还需扣除元数据和恢复预留。

对于照片、影音、文件共享和备份等常规家用存储需求,单机方案通常已经够用。相比多节点集群,单机方案的硬件、用电和维护成本更低,管理也更简单。

为什么最终选择 Ceph

Ceph 是一个开源分布式存储项目,起源于 Sage Weil 的研究工作,后来由 Inktank 推动商业化,2014 年 Inktank 被 Red Hat 收购。2022 年,Red Hat 的 Ceph 团队转入 IBM,项目持续由社区和多家厂商共同参与。

Ceph 底层以 RADOS 分布式对象存储为基础,将数据组织成对象,经 PG(归置组)和 CRUSH 规则分布到不同 OSD(管理磁盘的存储进程),并按配置保存副本。上层通过 RBD、CephFS 和 RGW 分别提供块、文件和对象存储,具体见 Ceph 架构说明。下图以跨主机三副本为例。

Ceph 对象通过 PG 和 CRUSH 映射到不同主机上的三个副本

最终选择 Ceph 方案,我主要考虑以下几点:

  • 混合容量与自然轮换。支持混合容量是必要条件,硬盘可以按各自的生命周期逐块替换,新旧容量继续混用,并按权重利用空间,不必整组更换。

  • 设备更新与局部迁移。硬盘和节点更新轮换时,可以逐步替换,由集群完成相关数据的恢复和重平衡,尽可能减少数据搬运,避免为了更新设备而把整套存储的数据全量搬到另一套系统。

  • 高可用与容量取舍。关键业务需要在单节点维护时继续访问存储,我愿意为此承担容量损耗和维护成本。实际使用中,我按数据级别设置不同冗余度,分别权衡容量与可靠性。

冗余带来的容量损失,对我来说可以接受。家里的数据体量没有那么庞大,HDD 的存储成本相对便宜,即使到了 2026 年,我手上仍有一批 Chia 企业级矿盘。

早期我也评估过 GlusterFS。它以分布式文件系统为核心,我当时更倾向于将它用于以文件存储为主的场景。我的 homelab 需要同时兼顾虚拟机块存储、文件共享和对象存储,因此最终选择了 Ceph。

Ceph 性能实践

早期我尝试过两种利用 NVMe 加速 HDD 的思路:在块设备层使用 bcache,以及将 BlueStore 元数据拆分到快速设备。两种方案各有作用,也带来了不同的故障依赖。

尝试:bcache 的应用

bcache 位于 Ceph OSD 使用的块设备下方,用 NVMe 为 HDD 提供缓存,希望兼顾机械硬盘的容量成本和闪存性能。

bcache 在 OSD 下方管理 NVMe 缓存与 HDD 后端

缓存命中时读取 NVMe,未命中时读取 HDD,并按策略填充缓存。写回模式先写 NVMe,再由 bcache 回写 HDD,直写模式则需等待 HDD 写入完成。

缓存收益取决于访问模式和命中率。我的 NAS 中有大量不经常访问的文件,冷数据首次读取仍然需要访问 HDD,缓存无法直接改善这部分体验。

实际使用中,我遇到了潜在的稳定性问题,也需要考虑缓存设备失效的影响。尤其是写回模式,NVMe 可能承载尚未写回 HDD 的数据,不能当成随时可以移除的读缓存。共享缓存设备还可能同时影响多个后端设备,增加排查和恢复的复杂度。

尝试:bluestore元数据加速

另一种思路是保留 HDD 存放数据,将 BlueStore 的 block.db 放到 NVMe 上,减少元数据访问对 HDD 的依赖。block.db 保存 RocksDB 元数据,block.wal 用于日志,配置独立 DB 后,WAL 默认也会放到 DB 设备上。具体见 BlueStore 配置说明。

BlueStore 将 HDD 上的数据与 NVMe 上的 DB 和 WAL 分开存放

同一块 NVMe 可以划出多个独立的 DB/WAL 空间,分别对应各个 HDD OSD。读写由 OSD 协调:通过元数据定位 HDD 上的数据块,写入时管理数据落盘及元数据、日志更新,内存命中的元数据无需再从 NVMe 读取。

早期的 FileStore 依赖 XFS 等本地文件系统,并使用额外日志处理写入。BlueStore 直接管理块设备,减少中间文件系统层的开销,并支持数据与元数据校验、压缩,以及将元数据放到快速设备上。两者的设计差异见 Ceph 存储后端说明。

元数据拆分不等于给文件内容加缓存。读取冷数据时,HDD 的寻道和介质延迟仍然存在。

最大的风险是共享 NVMe 故障导致关联 OSD 的数据丢失。
如果 NVMe 上尚未回写的数据或 BlueStore DB/WAL 丢失,即使 HDD 本身完好,相关 OSD 的数据也可能无法恢复。一块 NVMe 关联多个 OSD 时,故障会集中影响这些 OSD,能否恢复数据取决于集群中是否还有完整副本。

两种加速思路在我的环境中都增加了稳定性顾虑和维护复杂度,而对冷数据读取的改善有限。我最终没有继续沿用。具体经历不足以归结为某个方案的普遍缺陷,但足以影响我自己的选择。

最终选择:按介质分池

最终,我将 HDD 与 NVMe 拆分成独立存储池,通过设备类别和 CRUSH 规则限定数据落点。需要较高 IOPS、吞吐和较低延迟的业务直接使用 NVMe,容量型负载使用 HDD,数据放置和迁移在业务侧安排。

按业务将虚拟机和数据库放入 NVMe 池,将文件及备份放入 HDD 池

我的存储网络使用 10GbE。实际性能测试和长期使用下来,HDD 池足以满足我的 NAS 文件存储、虚拟机镜像备份和容量型对象存储需求。小文件、随机访问、并发量以及恢复期间的负载仍会影响体验,不能据此推断所有场景都能跑满 10G。

下面是早期一次 CephFS 文件读写测试的记录。

早期 dd 文件写入显示 854 MB/s,随后读取显示 2.8 GB/s,测试受缓存影响

测试在 CephFS 挂载目录中进行,文件约 2.46 GB,写入显示 854 MB/s,读取显示 2.8 GB/s。结果包含缓存影响,不等同于 HDD 持续落盘速度或网络吞吐。结合长期使用体验,文件访问性能符合我的 NAS 文件存储需求。

2025 年年中,在随后那轮 SSD 大面积涨价之前,我轮换了一台节点,采用 U.2 NVMe 全闪方案替换,继续推进存储的闪存化改造。

25G 选型与渐进升级
节点轮换时,我选择了 25GbE SFP28 网卡,为后续升级预留空间。SFP28 与 SFP+ 的接口外形兼容,支持 10G 模式的 25G 网卡可以先连接现有的 SFP+ 10G 交换机,不必一次更换整套网络设备。接口形态可参考 NVIDIA 的接口说明。

我使用的 DAC 直连线也是 25G 规格,目前配合 10G 交换机以 10G 运行,后续更换交换机时可以继续利用网卡和线缆,逐步升级到 25G。实际兼容性仍需确认网卡的速率支持,以及交换机对所选 DAC 的支持。目前这里的性能体验基于 10G 组网。

稳定性实践

过去七年,家里的 Ceph 集群一直承担着日常存储任务。期间经历过硬盘和节点轮换、硬件故障,以及几次整柜掉电,没有遇到已写入数据丢失的问题。下面分享这段长期运行中与掉电恢复、硬件故障有关的实际经历。

配电稳定性

早期我也纠结过是否要引入 UPS(不间断电源),主要担心突然掉电造成数据丢失。但 UPS 本身也有需要权衡的问题:

  • 锂电池的安全风险。热失控可能引发火灾,具体风险与电池化学体系、电池管理和产品设计有关。

  • 铅酸电池的重量。铅酸方案较重,搬运和安装都需要考虑。

  • 长期容量衰减。两类电池都会老化,后备供电时间会随容量衰减而缩短,需要定期检查和更换。

电池安全性与寿命的差异可参考 Eaton 的 UPS 电池说明。

实际测试没有遇到数据丢失,多年使用中机柜发生过大约三到四次掉电,也没有出现已写入数据丢失的问题。经过实践验证,我对自己这套环境的掉电恢复也就放心了。

我的需求边界是:可以接受掉电瞬间尚未完成的写入失败,重点是已经确认持久化的数据应当保留。我没有要求找回所有写入中的数据。对于虚拟机和数据库,应用是否完成事务提交、是否正确执行同步写入,以及设备是否兑现 flush 请求,仍然影响这个边界。

掉电测试和实际故障经历没有覆盖所有故障组合。Ceph 的副本不能替代设备掉电保护、正确的持久化语义、UPS 和独立备份,同机柜副本也无法隔离整柜供电故障。

常见故障

  • HBA 卡故障。我用过二手拆机件,家用环境中为了平衡噪音,散热也不够充分,这可能是故障原因之一。服务器配件原本依赖的风道,在家用机箱里需要重新考虑。

  • 硬盘背板故障。因为采购了小厂机箱,前面板盘架的背板出现过故障。排查硬盘离线时,除了盘本身,还需要检查背板、线缆、控制器和供电链路。

  • HDD 寿命到期后的轮换。部分机械硬盘的重映射扇区达到预警状态后,我按计划更换。这是长期运行中的正常维护,不必等到硬盘完全无法读取才处理。

Ceph Dashboard 中 osd.8 显示为 out 和 down,其他列出的 OSD 为 in 和 up
图 1. OSD 离线记录:pve-03 上的 osd.8 为 out/down,其余列出的 OSD 为 in/up

跨节点副本的价值,就体现在这些局部故障发生时,仍有其他节点上的数据可用。但同一块 HBA 或背板可能同时影响多块盘,所以故障域不能只按「坏一块硬盘」来理解。维护时也需要确认其他节点健康,避免故障叠加。

Ceph 在 homelab 的最佳实践

划分独立存储网络

将 PVE 网络与 Ceph 网络分开,让存储通信使用独立网络。PVE 网络承载计算侧的管理与业务通信,Ceph 网络用于存储访问,以及 OSD 之间的副本同步、心跳和故障恢复流量。

三台节点分别接入 PVE 网络与 Ceph 网络,存储访问及副本恢复使用 Ceph 网络

独立网络的价值在恢复期间尤其明显。硬盘故障、节点重新上线或数据重新平衡时,Ceph 会产生额外的数据传输。将这些流量与 PVE 侧通信分开,可以减少带宽争用,也便于分别观察存储链路与计算侧网络的负载。

我的划分只有 PVE 和 Ceph 两类,Ceph 的客户端访问与 OSD 间通信共用存储网络,没有进一步拆分 public_network 和 cluster_network。家庭环境下,我选择先控制网络复杂度,网络模型可参考 Ceph 网络说明。

网络隔离的实际效果还取决于底层链路。VLAN 可以划分逻辑网络,但如果共用同一条物理上联,仍然会争用带宽。容量规划需要同时考虑日常访问与故障恢复,不能只看网卡标称速率。

分池与副本策略

实际应用中,我按存储介质和数据级别划分存储池,分别设置冗余度。分池时主要考虑以下几点:

  • 介质与负载。需要低延迟和较高 I/O 性能的业务使用 NVMe 池,容量型业务使用 HDD 池,通过 CRUSH 规则限定介质落点。

  • 数据级别与容量成本。副本数按池设置,不必所有数据采用相同策略。三副本保留更多冗余余量,双副本可以提高容量利用率,但故障后的冗余余量更小,需要结合数据重要程度、恢复成本和独立备份来取舍。

  • 副本与故障域。需要容忍整台节点离线时,应让副本跨主机放置。同一节点上的多份副本无法隔离整机故障,仅创建不同存储池也不会自动隔离底层设备。

HDD 与 NVMe 存储池可分别选择双副本或三副本,按业务需要组合介质与冗余策略

每个池对应的设备都需要留出恢复和重平衡空间,不能只按原始容量除以副本数来规划可用容量。不同池如果共用 OSD,仍会共享磁盘容量和 I/O 资源。

副本数 size 与最小 I/O 副本数 min_size 需要一起考虑。例如,三副本配合 min_size=2,在仲裁等条件正常时,可以在损失一份副本后继续读写。双副本若同样设置 min_size=2,损失一份副本就会停止相关 I/O。减少副本不仅改变容量开销,也会影响维护期间的可用性,参数含义见 Ceph 存储池说明。

OSD noout 的应用

对于能够持续接收告警并及时处理的家用集群,我倾向于配置 noout。家里会遇到各种预期外的小故障,例如临时断网、节点重启或接触问题。设备明明可以很快恢复,却因为超时被自动标记为 out,触发一轮数据迁移,恢复后又需要重新平衡,会给整个集群增加额外负载。

noout 的作用是阻止 down 的 OSD 因超时而被自动标记为 out,不是让 OSD 保持在线,也不是禁止所有恢复或数据移动。官方在 OSD 故障排查说明中介绍了维护时使用和解除该标志的方法。

# 集群级 noout,会影响整个集群的自动 out 行为
ceph osd set noout

# 若仅用于临时维护,维护结束并确认状态后解除
ceph osd unset noout

计划内维护可以按实际版本能力,将 noout 的范围缩小到相关 OSD 或主机。长期保留集群级 noout 则意味着主动承担故障处理责任,不能把它当成一条设置完就可以忘记的优化参数。

尤其要关注 OSD down、PG degraded/undersized、磁盘健康和容量告警。短暂故障可以等待设备回来,永久故障就需要及时更换或移出故障 OSD,让集群重新补足副本。不能因为业务还能访问,就把降级状态长期留在那里。

如果第一块故障盘一直不处理,之后再损失其他副本所在的介质,冗余就可能逐步耗尽,最终导致数据不可用甚至丢失。无法保证及时响应告警时,我不建议长期保留全局 noout,应保留自动恢复能力,并为恢复预留容量。

关键数据独立备份

Ceph 的副本解决介质和节点故障,并不能恢复误删除、应用错误覆盖或者被入侵后同步删除的数据。我采用冷数据静态备份,加上部分关键数据备份到云上对象存储的方案。

冷数据保留独立副本,使恢复不必完全依赖这套 Ceph 集群。云上对象存储则提供另一个位置的恢复来源,避免同一个机柜的问题影响所有数据。

Ceph 业务数据另存独立冷备份,部分关键数据备份到云上对象存储

3-2-1 备份原则
关键数据保留至少三份,使用至少两种不同类型的存储介质,其中至少一份存放在异地。三份包含一份原始数据和两份备份,同一 Ceph 集群内的多个副本不能代替独立备份。可参考 CISA 的备份说明。

云端备份使用对象存储保存部分关键数据。对象存储 key 的权限需要限制,日常备份使用的凭据与管理凭据隔离,按所需桶和前缀授予最小权限,尤其避免让日常写入凭据拥有删除历史版本或修改版本控制配置的权限。同时启用版本控制,保留错误覆盖或误删除之前的版本。

版本控制仍然需要配合权限和保留策略使用,不能当作不可删除的备份。备份是否成功、历史版本是否仍在,以及能否实际恢复文件,都需要定期检查。

有条件还可以自建异地备份
Ceph 本身也提供跨集群同步能力,包括 RBD 镜像、CephFS 快照镜像和 RGW 多站点同步。如果有条件在异地再部署一套集群,并打通足够带宽的链路,就可以建立跨数据中心的异地副本。家里的存储也能安排上「两地三中心」的想象空间了 😝

跨集群同步仍需配合快照或历史版本保留策略,才能应对误删除和错误覆盖。

关于未来

经过七年 24×7 的持续使用,经历各种故障的洗礼、硬盘寿命到期后的轮换,以及节点的淘汰替换,Ceph 在我的实际应用中证明了其设计上的长期可靠性。短期内,我还没有看到更优秀且符合自身需求的替代方案,目前依然打算继续长期使用下去。


最后修改于 2026-07-26