Skip to main content
RunBook Academy

CephCXXIV · Production Reference ArchitectureProduction Reference Architecture

The network the design assumes

Advanced⏱ ~18 mincephiperf3ping

What you'll learn

  • Size the network from drive throughput rather than client demand
  • Split public and cluster traffic where it pays
  • Configure a bond whose hash actually spreads OSD traffic
  • Recognise the failure modes MTU and network splits introduce

Prerequisites

None — start here.

Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18

Not yet marked complete on this device.

Why this matters in production

Ceph fails softly when the network is marginal — slow ops, flapping OSDs, recoveries that never finish — and each of those looks like a storage problem to everyone except the person holding the switch counters.

What each network carries

NetworkTrafficVolume per 1 GiB of client write
Publicclient IO, mon and mgr sessions1 GiB in
Clusterreplication at size=32 GiB
Clustererasure coding at 4+21.25 GiB
Clusterbackfill, recovery, scrub reads, OSD heartbeatsunbounded by client rate
ceph config set global public_network 10.20.0.0/24
ceph config set global cluster_network 10.30.0.0/24
ceph config get osd cluster_network

Both settings are read at daemon start. Changing them on a running cluster requires restarting the OSDs, one failure domain at a time.

Sizing from the drives

12 HDDs x 190 MB/s sequential = 2.3 GB/s = about 18 Gbit/s per node.
That is the rate a node can absorb during backfill, and the reason
10 GbE is the bottleneck on an HDD node rather than a comfortable fit.
Node typeAggregate drive throughputNetwork
12 HDD~18 Gbit/s2 x 25 GbE
24 SATA SSD~100 Gbit/s2 x 100 GbE
10 NVMe~200 Gbit/s2 x 100 GbE, and the CPU binds first

Rebuilding one 216 TB host across a 20 Gbit/s path is 24 hours of wire time. The defaults will not deliver that: the mclock scheduler deliberately protects client IO.

ceph config set osd osd_mclock_profile high_recovery_ops
ceph config get osd osd_mclock_profile
# return to the default once the rebuild completes
ceph config set osd osd_mclock_profile balanced

The bond

# /etc/netplan/60-ceph.yaml
network:
  bonds:
    bond0:
      interfaces: [ens1f0, ens1f1]
      mtu: 9000
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        mii-monitor-interval: 100
        transmit-hash-policy: layer3+4
  vlans:
    bond0.20: {id: 20, link: bond0, mtu: 9000, addresses: [10.20.0.11/24]}
    bond0.30: {id: 30, link: bond0, mtu: 9000, addresses: [10.30.0.11/24]}
cat /sys/class/net/bond0/bonding/xmit_hash_policy
cat /proc/net/bonding/bond0 | grep -E 'MII Status|Aggregator ID'
iperf3 -c 10.30.0.12 -P 8 -t 30

If eight parallel streams cap at 25 Gbit/s on a 2 x 25 bond, the hash policy is wrong on one side. Both the host and the switch must hash on layer3+4.

MTU

# 9000 minus 28 bytes of IP and ICMP header, with fragmentation forbidden
ping -M do -s 8972 -c 3 10.30.0.12
ip -br link show bond0.30
SymptomCause
Small IO fine, large IO hangsMTU mismatch somewhere on the path
Monitors healthy, OSDs flappingthe mismatch is on the cluster VLAN only
Works host to host, fails through a routeran intermediate hop at 1500

Set 9000 on the bond, on every VLAN interface, and on every switch port including the inter-switch links. One port left at 1500 produces intermittent failures that survive every reboot.

Quiz

Knowledge check · 4 questions

  1. Q1. A 2 x 25 GbE LACP bond delivers only 25 Gbit/s between two OSD nodes even with many parallel flows. What is the most likely cause?

  2. Q2. Adding a separate cluster network reduces the number of ways the cluster can lose OSDs.

  3. Q3. Diagnose intermittent OSD flapping on a new cluster.

    A freshly built six-node cluster reports OSDs going down and coming back several times an hour. Small IO works, large sequential writes stall. The monitors have never lost quorum.

  4. Q4. What sets the required network speed for a storage node?

Passing score: 75%. Answers are checked in this browser.

Production discipline

Size the network from what the drives can move during a rebuild, not from what clients ask for at steady state — recovery is the case that decides whether the cluster returns to full redundancy in a day or a week. Verify MTU with a do-not-fragment ping across every pair before the cluster carries data, and verify the LACP hash with parallel streams rather than a single one.

Cross-course references

  • Kubernetes: CNI MTU mismatches produce the same small-works, large-hangs signature
  • Linux: bonding never splits a single flow, so aggregate bandwidth and pairwise bandwidth are different numbers