Save products you love by clicking the heart icon.
Download the free DevOps Career Roadmap PDF - A complete 8-month learning path from Linux fundamentals to AI infrastructure, with certification checklists and production stack recommendations.
Access all 4 free DevOps lead magnets: Career Roadmap, Linux Cheat Sheet, Infrastructure Checklist, and Certification Study Plan. No email required for instant downloads.
Teaser: Ceph is the storage backbone behind OpenStack, the Sovereign Cloud Stack, and thousands of self-hosted clusters — yet most engineers treat it as a black box. This deep dive unpacks the RADOS object store, BlueStore's on-disk design, and CRUSH placement so you can design, deploy, and debug a cluster with confidence — including what Squid 19.2 and the upcoming Tentacle 20.2 change for production.
Ceph turns a pile of commodity disks into one elastic storage pool with three protocols: RBD (block), RGW (S3-compatible object), and CephFS (POSIX file). The trick is that all three are just thin frontends over the same distributed object store, RADOS. If you understand RADOS, you understand Ceph — and 90% of production failures become predictable.
RADOS (Reliable Autonomic Distributed Object Store) is a self-healing, self-managing key-value object store. Each object is identified by a 128-bit name, and objects live in pools that define replication, erasure coding, and placement rules.
The critical design decision: clients compute data placement themselves. There is no central metadata server on the I/O path. A client takes an object name, hashes it into a Placement Group (PG), and asks the CRUSH algorithm which OSDs should hold that PG. This is why Ceph scales linearly — the OSDs are the only thing that moves data, and the cluster map is the only shared state.
Every client and daemon holds a copy of the cluster map, versioned like a distributed database. It contains:
When any of these change, the map epoch bumps and the change is gossiped out. Stale maps are the root cause of most "misdirected I/O" and "slow requests" incidents — which is why monitor tuning and ceph osd pool application hygiene matter more than raw throughput.
A pool is where the policies live:
size=3, min_size=2. Simple, low CPU cost, higher space cost.CRUSH (Controlled Replication Under Scalable Hashing) is what makes Ceph different from every system with a metadata broker. It's a deterministic pseudo-random function over:
CRUSH(object, PG, cluster_map, rule) → ordered list of OSDs
The rule encodes your failure-domain policy. A common rule: "pick 3 different hosts, then 1 OSD per host" — guaranteeing that a host failure never takes out all replicas of any object.
The bucketing hierarchy is the physical reality you encode: root → datacenter → room → row → rack → host → OSD. Each bucket has a weight; OSD weights are proportional to disk capacity (a 4 TB OSD weighs 4× a 1 TB OSD).
Here's where production clusters burn people: CRUSH weights describe the target distribution, not current usage. When you add a new OSD, CRUSH rebalances a portion of PGs onto it, but the amount depends on weight and PG count — and it's bounded per PG movement. The balancer module (enabled by default since Pacific) periodically re-weights and optimizes, but on big clusters you still want to:
ceph pg dump → check pg_num per pool is a power of two)osd_crush_update_on_start: true and tune osd_recovery_max_active for controlled backfillrecovery_rate and throttle recovery during business hoursSince Luminous, BlueStore owns the data path. It replaces the old FileStore (a POSIX filesystem on top of a filesystem) with a direct block-device layout:
This "fast device for metadata, big HDDs for data" split is why Ceph HDD clusters perform far better than anyone expects: the metadata hot path lives on SSD/NVMe, while bulk data streams to the disks.
Released 26 September 2024, Squid (v19.2.x) is the current long-term stable series. The release notes highlight:
rbd-wnbd multiplexing — one daemon per Windows host instead of one per imageceph tell --daemon-output-file — stream large command output to a daemon-local file, avoiding monitor memory spikesSince Octopus, cephadm (containerized, systemd-managed, SSH-orchestrated) is the supported deployment path. Manual ceph-deploy clusters are legacy. Key operations:
# Bootstrap a single-node cluster (detects the host, deploys MON+MGR+OSD)
cephadm bootstrap --mon-ip 192.168.42.10
# Add an OSD on a specific device
ceph orch device zap <host> /dev/sdb --force
ceph orch daemon add osd <host>:/dev/sdb
# Deploy RGW with a realm+zone (needed for multisite later)
ceph orch apply rgw rgw.site1 --placement "3 host1 host2 host3" --port 7480
# Deploy MDS for CephFS
ceph fs volume create cephfs --placement="2 host1 host2"
# NVMe/TCP gateway for high-performance RBD
ceph orch apply nvmeof nvmeof.gw1 --placement "2 host1 host2"
The ceph orch layer manages daemon placement as a desired state, which is the single biggest quality-of-life improvement in Ceph history: no more hand-edited systemd units or manual config distribution.
Ceph requires upgrading one daemon type at a time, in order: MONs first, then MGR, then OSDs (by default), then MDS/RGW/clients. ceph orch upgrade start --image quay.io/ceph/ceph:v19.2.5 handles it, but verify:
ceph versions — all daemons on the same version before proceedingceph health detail — no PG_AVAILABILITY or OSD_* warningsceph.conf, client keys, and the MON store before startingThe MGR hosts the Prometheus endpoint (<mgr-ip>:9283/metrics). The alerts that actually catch real incidents:
| Metric | Threshold | What it means |
|---|---|---|
ceph_osd_down | > 0 for > 5 min | OSD crash or network partition |
ceph_pg_inactive | > 0 | PGs stuck — data unavailable |
ceph_pg_degraded | > 0 persistent | Replicas missing, recovery stuck |
ceph_osd_apply_latency | > 1s | Slow OSD — often disk or network issue |
ceph_osd_commit_latency | > 1s | fsync path saturated |
ceph_cluster_total_used_bytes | > 85% | Full cluster — recovery/backfill stalls |
ceph_mon_quorum | < 3 | Quorum loss = cluster unavailable |
The "full" cliff is non-linear. Ceph blocks writes at mon_osd_full_ratio (default 0.95) but degrades much earlier: recovery and rebalancing slow down as free space shrinks, and nearfull warnings (0.85) should trigger a capacity plan, not a "wait and see".
The bread and butter for OpenStack/K8s. Key concepts: image (thin-provisioned block device), snapshot (instant, copy-on-write), clone (snapshot-based COW image), and rbd-mirror (async replication to a second cluster — the standard DR pattern, with a journal or snapshot-based sync).
Squid's diff-iterate improvement makes QEMU live disk sync dramatically faster — this is what powers consistent VM backups without agent-in-VM.
The S3 gateway runs as a stateless frontend over RADOS. For production:
RGWBucketFullSyncCR infinite loop (source bucket deleted mid-sync) matters if you do active bucket deletions across sitesssl_ciphersuites) for the Beast frontendMDS is the metadata service; one active MDS per filesystem is the normal mode, with standbys for failover. Squid's quiesce API is the notable new tool: pause I/O on a subtree so distributed apps get crash-consistent snapshots — think databases or job queues on CephFS.
Tentacle is the 20th stable release (v20.2.2, June 16, 2026). The headline features for operators:
smb MGR module deploys Samba-backed SMB shares on CephFS, with CTDB clustering and a cephfs-proxy daemon for scale. This finally makes Ceph a credible replacement for Windows file servers and NAS appliances.For the digital-sovereignty crowd this matters: Ceph + OSISM remains the reference backend for the Sovereign Cloud Stack, and the SMB/NVMeoF work widens the "leave the hyperscaler" envelope considerably.
crush rule with rack as failure domain) or accept host-level only. Never put 3 replicas on one host.(OSDs × 100) / replication_factor, spread across pools as powers of two. pg_autoscaler (default on) helps, but set target_size_ratio per pool.block.db/block.wal if you can't afford all-flash — it's the highest-ROI upgrade for HDD clusters.mon_clock_drift warnings mean NTP is broken.ceph osd reweight-by-utilization are your friends.mon caps, osd caps, mgr caps).rbd export or mirroring; RGW → bucket replication or s3 sync to another cluster; CephFS → snapshots + cephfs-mirror (since Pacific).# The three commands that answer 90% of questions
ceph health detail
ceph pg dump_stuck inactive,unclean,undersized
ceph osd tree # + ceph osd perf for per-OSD latency
# Slow requests — where is the time going?
ceph daemon osd.<id> dump_historic_ops
ceph daemon osd.<id> dump_ops_in_flight
# Is the balancer doing its job?
ceph balancer status
ceph osd df tree
# CRUSH map inspection
ceph osd crush rule dump
ceph osd crush tree
When an OSD is slow, check in order: disk health (smartctl), BlueStore compaction (ceph daemon osd.N compact), RocksDB WAL device saturation, and finally the cluster network — ceph osd perf plus dump_ops_in_flight will separate a dying disk from a saturated NIC.
Ceph rewards the engineer who understands its one big idea: placement without coordination. Master the cluster map, the CRUSH rule, and BlueStore's device layout, and the rest is operational hygiene — monitor the right metrics, keep recovery throttled, respect the full-ratio cliff. With Squid stable and Tentacle adding SMB and NVMeoF polish, there has never been a better time to run your storage in your own data centre.