โ† Back to list

๐Ÿš€ Zero to Hero: Deploy a Ceph RAID 6 Cluster on AWS in 90 Minutes

A complete, battle-tested guide โ€” from spinning up EC2 instances to a fully operational distributed storage cluster with live monitoringโ€ฆ

Sharaz Sony ยท 2026-04-23 11:59 ยท 0 claps ยท 8.0 min read
#ceph #aws #raid #cloud-infrastructure #distributed-storage
Open on Medium โ†—
Wiki topics: RAG ยท RAG & Retrieval โ˜๏ธ ยท DevOps & Cloud

๐Ÿš€ Zero to Hero: Deploy a Ceph RAID 6 Cluster on AWS in 90 Minutes

A complete, battle-tested guide โ€” from spinning up EC2 instances to a fully operational distributed storage cluster with live monitoring dashboards.

By Sharaz Soni ยท April 23, 2026 ยท 15 min read

If youโ€™ve ever wanted to understand how enterprise-grade distributed storage actually works โ€” and get your hands dirty building one โ€” this is your guide.

Weโ€™re going to build a 6-node Ceph cluster on AWS with RAID 6 erasure coding, Grafana dashboards, and Prometheus metrics. By the end, youโ€™ll have a system that can survive two simultaneous disk failures without losing a single byte of data.

What Weโ€™re Building

Detailed of Ceph

A production-grade Ceph cluster with Monitor, OSD, and monitoring nodes

Hereโ€™s the full architecture at a glance:

ComponentCountRoleMonitor Node (vm1)1Cluster brain โ€” tracks stateOSD Nodes (vm2โ€“vm4)3Object Storage Daemons โ€” hold dataSpare Nodes (vm5โ€“vm6)2Standby / failoverEBS Volumes3ร—30GBDedicated Ceph data disks

Total resources: ~10 vCPU ยท 18GB RAM ยท ~200GB storage Estimated cost: $15โ€“25 for a 3-hour deployment Time: 60โ€“90 minutes

Prerequisites

Before you type a single command, make sure you have:

  • โœ… An AWS account with EC2 access in us-east-1
  • โœ… A .pem key file downloaded locally
  • โœ… SSH installed (PowerShell on Windows, Terminal on Mac/Linux)
  • โœ… 90 uninterrupted minutes
  • โœ… ~$20 to spend on AWS resources

โŒ Donโ€™t start if your internet is unstable or youโ€™re likely to get interrupted mid-setup. The bootstrap phase is not resumable.

Phase 1 โ€” AWS Infrastructure Setup

Launch the Monitor VM (vm1)

Head to EC2 Console โ†’ Launch Instances and configure:

Operating System

Ubuntu Server 22.04 LTS  โœ…  (the only correct choice here)

โš ๏ธ Common mistake: Using Ubuntu 24.04 or 18.04. Stick with 22.04 โ€” itโ€™s the production-tested sweet spot for Ceph Quincy.

Instance Type

t3.medium  โ†’  2 vCPU / 4GB RAM  โœ…

โŒ t3.micro is too slow for the monitor. โŒ t3.small lacks RAM for Ceph daemons.

Networking

Auto-assign Public IP: ENABLED  โ†  (critical โ€” you can't SSH in without this)

Storage for Monitor (vm1)

Root disk: 20GB gp2

Storage for OSD Nodes (vm2, vm3, vm4) This is where most people get tripped up:

Root disk:   20GB gp2   (OS)
Data disk:   30GB gp2   (Ceph OSD โ€” add as a second EBS volume!)

OSD nodes need two EBS volumes โ€” a root disk and a dedicated 30GB data disk

Security Group Configuration

Create a new security group called ceph-cluster with all 8 of these rules:

PortProtocolPurpose22TCPSSH access6789TCPCeph Monitor3300TCPCeph Monitor protocol6800โ€“7300TCPCeph OSD communication8080TCPCeph Dashboard443TCPHTTPS3000TCPGrafana9095TCPPrometheus

โš ๏ธ Missing any of these ports = hours of debugging. Add all 8 upfront.

VM Inventory

Once all 6 VMs are running, record their public IPs:

vm1  (ceph-mon)   โ†’  _______________
vm2  (ceph-osd1)  โ†’  _______________
vm3  (ceph-osd2)  โ†’  _______________
vm4  (ceph-osd3)  โ†’  _______________
vm5  (spare)      โ†’  _______________
vm6  (spare)      โ†’  _______________

Phase 2 โ€” Initial VM Configuration

Connect to the Monitor

# Mac/Linux
ssh -i ~/cloud-ass3.pem ubuntu@<VM1_IP>
# Windows PowerShell
ssh -i C:\Users\You\Downloads\cloud-ass3.pem ubuntu@<VM1_IP>

Update All Packages

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y curl wget git net-tools vim htop python3-pip lsb-release gnupg

โ˜• This takes 3โ€“5 minutes. Perfect time for coffee.

Set Hostnames

Run this on each VM (adjust the hostname per node):

# On vm1:
sudo hostnamectl set-hostname ceph-mon
# On vm2:
sudo hostnamectl set-hostname ceph-osd1
# On vm3:
sudo hostnamectl set-hostname ceph-osd2
# On vm4:
sudo hostnamectl set-hostname ceph-osd3

Update /etc/hosts on the Monitor

sudo nano /etc/hosts

Add these lines at the bottom (swap in your actual IPs):

<VM1_IP>  ceph-mon
<VM2_IP>  ceph-osd1
<VM3_IP>  ceph-osd2
<VM4_IP>  ceph-osd3

Verify Network Connectivity

ping -c 1 <VM2_IP>
ping -c 1 <VM3_IP>
ping -c 1 <VM4_IP>
# Each should report: 1 packets transmitted, 1 received

Phase 3 โ€” Ceph Installation

Install cephadm on the Monitor

# Add the Ceph repo key
curl -fsSL https://download.ceph.com/keys/release.asc | sudo apt-key add -
# Add the Ceph repository
echo "deb https://download.ceph.com/debian-$(lsb_release -cs) $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/ceph.list
# Install cephadm
sudo apt-get update
sudo apt-get install -y cephadm
# Verify
cephadm --version
# โ†’ 17.2.x (Quincy) or 18.2.x

Which version to use? Quincy (v17) is recommended โ€” stable, widely deployed, well-documented. Avoid Pacific (EOL) and Nautilus (ancient).

Bootstrap the Cluster

โš ๏ธ This step takes 5โ€“10 minutes. Do NOT close your terminal or interrupt the process.

sudo mkdir -p /etc/ceph
sudo cephadm bootstrap \
  --mon-ip 0.0.0.0 \
  --skip-firewall \
  --skip-dashboard \
  --allow-fqdn-hostname

When it completes youโ€™ll see:

Bootstrap complete.

Verify it worked:

sudo cephadm shell -- ceph -s
# Should show: health: HEALTH_OK or HEALTH_WARN

Distribute Config Files to OSD Nodes

# On the monitor โ€” copy to local, then push to OSD nodes
sudo cp /etc/ceph/ceph.client.admin.keyring ~/
sudo cp /etc/ceph/ceph.conf ~/
sudo chown ubuntu:ubuntu ~/ceph*
# From your local machine, push to each OSD:
scp -i cloud-ass3.pem ubuntu@<VM1_IP>:~/ceph.conf .
scp -i cloud-ass3.pem ubuntu@<VM1_IP>:~/ceph.client.admin.keyring .
for IP in <VM2_IP> <VM3_IP> <VM4_IP>; do
  scp -i cloud-ass3.pem ceph.conf ubuntu@$IP:~/
  scp -i cloud-ass3.pem ceph.client.admin.keyring ubuntu@$IP:~/
done

Install cephadm on Each OSD Node

SSH into each OSD node (vm2, vm3, vm4) and run:

curl -fsSL https://download.ceph.com/keys/release.asc | sudo apt-key add -
echo "deb https://download.ceph.com/debian-$(lsb_release -cs) $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt-get update && sudo apt-get install -y cephadm
mkdir -p ~/.ceph
mv ~/ceph.conf ~/.ceph/
mv ~/ceph.client.admin.keyring ~/.ceph/

Phase 4 โ€” OSD & RAID 6 Setup

This is the heart of the guide. Letโ€™s configure erasure coding and bring RAID 6 to life.

Add OSD Hosts to the Cluster

Back on the monitor (vm1):

sudo cephadm shell -- ceph orch host add ceph-osd1 <VM2_IP>
sudo cephadm shell -- ceph orch host add ceph-osd2 <VM3_IP>
sudo cephadm shell -- ceph orch host add ceph-osd3 <VM4_IP>
# Verify
sudo cephadm shell -- ceph orch host ls

Check Your 30GB Disks Are Visible

sudo cephadm shell -- ceph orch device ls

Expected:

HOST       PATH      TYPE  SIZE  VENDOR
ceph-osd1  /dev/sdf  ssd   30GB  Amazon
ceph-osd2  /dev/sdf  ssd   30GB  Amazon
ceph-osd3  /dev/sdf  ssd   30GB  Amazon

โŒ Nothing showing? Go to AWS Console โ†’ EC2 โ†’ Instance โ†’ Storage tab, attach a new 30GB gp2 EBS volume with device name /dev/sdf. Then run sudo partprobe /dev/sdf on the VM.

Create OSDs Automatically

sudo cephadm shell -- ceph orch apply osd --all-available-devices
# Watch progress (Ctrl+C when done)
watch -n 2 'sudo cephadm shell -- ceph osd tree'

After 2โ€“3 minutes you should see 5 OSDs all showing up in.

Configure RAID 6 Erasure Coding

<img width=โ€818" height=โ€396" alt=โ€imageโ€ src=โ€https://github.com/user-attachments/assets/4f8ad539-a8ad-4d5b-a760-40b7e7aa39fa" />

RAID 6: 4 data chunks + 2 parity chunks = survives any 2 simultaneous failures

sudo cephadm shell -- ceph osd erasure-code-profile set raid6-profile \
  k=4 \
  m=2 \
  plugin=jerasure \
  technique=reed_sol_van \
  crush-failure-domain=host \
  crush-root=default

What do these parameters mean?

ParameterValueMeaningk4Data chunks โ€” actual contentm2Parity chunks โ€” redundancypluginjerasureErasure coding librarytechniquereed_sol_vanReed-Solomon algorithmcrush-failure-domainhostSpread chunks across different hosts

*k=4, m=2 means: data is split into 6 chunks total. You can lose any 2 of them and still recover everything. That's RAID 6.*

Verify the profile was created:

sudo cephadm shell -- ceph osd erasure-code-profile get raid6-profile
# Should show: k=4, m=2, plugin=jerasure

Create the RAID 6 Pool

sudo cephadm shell -- ceph osd pool create raid6-pool 64 64 erasure raid6-profile
sudo cephadm shell -- ceph osd pool set raid6-pool allow_ec_overwrites true
# Confirm
sudo cephadm shell -- ceph osd pool ls detail

Phase 5 โ€” Monitoring & Dashboards

Enable Services

sudo cephadm shell -- ceph mgr module enable prometheus
sudo cephadm shell -- ceph mgr module enable dashboard
sudo cephadm shell -- ceph orch apply node-exporter '*'

Deploy Grafana

sudo cephadm shell -- ceph orch apply grafana
sleep 30
sudo cephadm shell -- ceph mgr services | grep grafana

Deploy Prometheus

sudo cephadm shell -- ceph orch apply prometheus
sleep 10

Access Your Dashboards

DashboardURLCredentialsCeph Dashboardhttps://<VM1_IP>:8080admin / (generated at bootstrap)Grafanahttp://<VM1_IP>:3000admin / adminPrometheushttp://<VM1_IP>:9095โ€”

Grafana gives you real-time visibility into every aspect of your cluster

Connect Grafana to Prometheus:

  1. Open Grafana โ†’ โš™๏ธ Settings โ†’ Data Sources
  2. Add โ†’ Prometheus
  3. URL: http://<VM1_IP>:9095
  4. Save & Test โ†’ โ€œData source is workingโ€ โœ…

Phase 6 โ€” Testing & Validation

Full Health Check

sudo cephadm shell -- ceph -s

Look for:

health: HEALTH_OK
osd: 5 osds: 5 up, 5 in
pools: 1 pools
pgs: all active+clean

Write and Read Data

# Write
echo "Test data from Ceph RAID 6 cluster" > /tmp/test-data.txt
sudo cephadm shell -- ceph put test-object -i /tmp/test-data.txt
# Read back
sudo cephadm shell -- ceph get test-object -o /tmp/test-download.txt
# Verify
diff /tmp/test-data.txt /tmp/test-download.txt && echo "โœ… Data matches!"

Simulate an OSD Failure

# Take down OSD 0 (simulates a disk failure)
sudo cephadm shell -- ceph osd down 0
# Watch recovery in real-time
watch -n 5 'sudo cephadm shell -- ceph -s | grep -E "health|recovery"'
# Bring it back
sudo cephadm shell -- ceph osd in 0

Your cluster will self-heal. Thatโ€™s RAID 6 working exactly as designed.

Troubleshooting Guide

โ€œCannot connect to clusterโ€

# Check config and keyring exist
cat ~/.ceph/ceph.conf
ls -la ~/.ceph/ceph.client.admin.keyring
# Fix ownership if needed
sudo chown ubuntu:ubuntu ~/.ceph/*

โ€œOSDs are DOWNโ€

# Check logs
sudo cephadm logs --name osd.0
# Check disk is visible
lsblk | grep sdf
# Force disk detection
sudo partprobe /dev/sdf

โ€œHEALTH_WARN or HEALTH_ERRโ€

# Get detailed report
sudo cephadm shell -- ceph health detail
# Most warnings resolve themselves โ€” wait 5 minutes
# If stuck, restart the affected daemon:
sudo cephadm restart mon.ceph-mon

โ€œGrafana wonโ€™t loadโ€

# Is it running?
sudo cephadm ls | grep grafana
# Check the port
sudo ss -tlnp | grep 3000
# Deploy if missing
sudo cephadm shell -- ceph orch apply grafana

What Youโ€™ve Built

Congratulations. Hereโ€™s whatโ€™s running on your cluster:

Storage capacity:   ~45โ€“50 GiB usable
Write speed:        50โ€“100 MB/s
Read speed:         100โ€“200 MB/s
Failure tolerance:  Any 2 simultaneous OSD failures
Data durability:    99.99999%
Recovery time:      5โ€“30 minutes per failure

Key Concepts You Now Understand

ConceptWhat It IsWhy It MattersErasure Codingk=4 data + m=2 parity chunksMore efficient than replicationCRUSH AlgorithmPlacement algorithmDetermines where data livesOSDObject Storage DaemonThe actual storage workersMonitorCluster coordinatorTracks the map of everythingPlacement GroupsData distribution unitsBalances load across OSDscephadmOrchestration toolDeploys and manages daemons

Final Deployment Checklist

Infrastructure
  โ˜ 6 VMs running
  โ˜ Security group with all 8 ports
  โ˜ OSD nodes have 30GB EBS volumes attached
Ceph Setup
  โ˜ Monitor bootstrapped
  โ˜ 5 OSDs: up + in
  โ˜ RAID 6 profile: k=4, m=2
  โ˜ raid6-pool created
Monitoring
  โ˜ Ceph Dashboard: https://<IP>:8080
  โ˜ Grafana: http://<IP>:3000
  โ˜ Prometheus: http://<IP>:9095
  โ˜ Grafana โ†’ Prometheus connected
Validation
  โ˜ ceph -s shows HEALTH_OK
  โ˜ Data write + read test passed
  โ˜ OSD failure + recovery tested

Quick Command Reference

# Cluster health
sudo cephadm shell -- ceph -s
sudo cephadm shell -- ceph health detail
sudo cephadm shell -- ceph df
# OSD management
sudo cephadm shell -- ceph osd tree
sudo cephadm shell -- ceph osd status
sudo cephadm shell -- ceph osd down <ID>
sudo cephadm shell -- ceph osd in <ID>
# Pool management
sudo cephadm shell -- ceph osd pool ls detail
sudo cephadm shell -- ceph osd pool info raid6-pool
# Services
sudo cephadm ls
sudo cephadm logs --name <service>
sudo cephadm restart <service>

If this guide helped you, give it a clap ๐Ÿ‘ and share it with someone learning distributed systems. Questions? Drop them in the comments.

Tags: Ceph AWS Distributed Storage RAID DevOps Cloud Infrastructure Linux


๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
post_id
2cf75fbb93fc
slug
zero-to-hero-deploy-a-ceph-raid-6-cluster-on-aws-in-90-minutes-2cf75fbb93fc
url
https://medium.com/@sharazafzal53/zero-to-hero-deploy-a-ceph-raid-6-cluster-on-aws-in-90-minutes-2cf75fbb93fc
canonical_url
https://medium.com/@sharazafzal53/zero-to-hero-deploy-a-ceph-raid-6-cluster-on-aws-in-90-minutes-2cf75fbb93fc
author_url
https://medium.com/@sharazafzal53
status
ok
fetched_at
2026-06-09 15:37:30