Troubleshooting Ceph¶
🎯 Diagnóstico Inicial¶
Comandos Esenciales¶
# Estado del clúster
ceph -s
ceph health detail
# Estado de OSDs
ceph osd tree
ceph osd stat
ceph osd df
# Estado de PGs
ceph pg stat
ceph pg dump | grep -v "^version"
# Performance
ceph osd perf
ceph tell osd.* bench
# Logs
journalctl -u ceph-osd@* -f
journalctl -u ceph-mon@* -f
🔴 HEALTH_WARN y HEALTH_ERR¶
HEALTH_WARN: OSDs near full¶
Síntoma:
$ ceph -s
health: HEALTH_WARN
1 nearfull osd(s)
OSD.5 is near full (85%)
Diagnóstico:
# Ver uso por OSD
ceph osd df tree
# Ver pools más grandes
ceph df
# Ver qué está ocupando espacio
for pool in $(ceph osd pool ls); do
echo "Pool: $pool"
rbd du $pool 2>/dev/null || rados df -p $pool
done
Soluciones:
# 1. Añadir más OSDs
ceph orch daemon add osd <host>:<device>
# 2. Ajustar thresholds temporalmente
ceph osd set-full-ratio 0.95
ceph osd set-nearfull-ratio 0.90
# 3. Eliminar datos innecesarios
# Eliminar snapshots antiguos
rbd snap ls <pool>/<image>
rbd snap rm <pool>/<image>@<snapshot>
# 4. Rebalancear
ceph osd reweight <osd-id> 0.95 # Reducir peso del OSD lleno
HEALTH_ERR: OSDs down¶
Síntoma:
$ ceph -s
health: HEALTH_ERR
3 osds down
Degraded data redundancy (...)
Diagnóstico:
# Identificar OSDs down
ceph osd tree | grep down
# Ver por qué están down
systemctl status ceph-osd@5
journalctl -u ceph-osd@5 -n 100
# Verificar disco
lsblk
smartctl -a /dev/sdb
Soluciones según causa:
OSD crashed (fallo de software):¶
# Reiniciar OSD
systemctl restart ceph-osd@5
# Si no arranca, ver logs
journalctl -u ceph-osd@5 --since "10 minutes ago"
# Intentar repair
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-5 --op fsck
Disco fallado:¶
# Marcar OSD como out
ceph osd out 5
# Remover OSD del clúster
ceph osd purge 5 --yes-i-really-mean-it
# Reemplazar disco
# 1. Físicamente reemplazar
# 2. Añadir nuevo OSD
ceph orch daemon add osd <host>:/dev/sdb
# Esperar a que se rebalancee
watch ceph -s
Problemas de red:¶
# Verificar conectividad
ping <osd-host>
ceph tell osd.* version # Ver cuáles responden
# Verificar interfaces
ip addr show
ip link show
# Reiniciar networking si es necesario
systemctl restart networking
HEALTH_WARN: PGs stuck¶
Síntomas comunes:
- X pgs stuck unclean
- X pgs stuck inactive
- X pgs stuck degraded
- X pgs stuck undersized
Diagnóstico:
# Ver PGs problemáticos
ceph pg dump | grep -E "stuck|stale|inactive"
# Detalles de un PG específico
ceph pg <pg-id> query
# Ver mapeo de PG a OSDs
ceph pg map <pg-id>
Soluciones:
PGs stuck inactive/unclean:¶
# Forzar scrub
ceph pg scrub <pg-id>
ceph pg deep-scrub <pg-id>
# Forzar recovery
ceph pg force-recovery <pg-id>
# Si persiste, revisar OSDs responsables
ceph pg <pg-id> query | grep acting
PGs stuck undersized:¶
# Significa que faltan réplicas
# Verificar cuántas réplicas tiene el pool
ceph osd pool get <pool-name> size
ceph osd pool get <pool-name> min_size
# Si tienes menos OSDs que el size del pool:
# Opción 1: Añadir OSDs
# Opción 2: Reducir size (solo para testing)
ceph osd pool set <pool-name> size 2
PGs remapped:¶
# Normal durante rebalanceos
# Ver progreso
ceph -w
# Acelerar recovery (con cuidado, impacta performance)
ceph tell 'osd.*' injectargs '--osd-max-backfills 8'
ceph tell 'osd.*' injectargs '--osd-recovery-max-active 4'
# Restaurar valores por defecto después
ceph tell 'osd.*' injectargs '--osd-max-backfills 1'
ceph tell 'osd.*' injectargs '--osd-recovery-max-active 3'
⚡ Problemas de Performance¶
Slow Operations (slow ops)¶
Síntoma:
$ ceph -s
health: HEALTH_WARN
30 slow ops, oldest one blocked for 45 sec
Diagnóstico:
# Ver operaciones lentas
ceph daemon osd.5 dump_historic_slow_ops
# Ver latencia de OSDs
ceph osd perf
# Ver stats de pools
ceph df detail
# Benchmark de un OSD específico
ceph tell osd.5 bench
Causas y soluciones:
Discos lentos/fallando:¶
# Test de I/O en disco
fio --filename=/dev/sdb --direct=1 --rw=randread --bs=4k \
--ioengine=libaio --iodepth=64 --runtime=60 --name=test
# Ver SMART health
smartctl -a /dev/sdb | grep -E "Reallocated|Pending|Uncorrectable"
# Si disco está mal, reemplazar (ver sección OSDs down)
Red saturada:¶
# Test de bandwidth entre nodos
iperf3 -s # En un nodo
iperf3 -c <ip-del-nodo> -t 30 # En otro nodo
# Ver tráfico de red
iftop -i eth0
# Solución: Mejorar red (10GbE, bonding, jumbo frames)
Journal/WAL en disco lento:¶
# Verificar dónde está el journal
ceph-volume lvm list
# Migrar journal/WAL a SSD
ceph-volume lvm new-wal /dev/nvme0n1 --osd-id 5
PGs mal balanceados:¶
# Ver distribución de PGs por OSD
ceph osd df tree
# Si hay desbalanceo:
ceph balancer on
ceph balancer mode upmap
ceph balancer eval
Alto uso de CPU en OSDs¶
Diagnóstico:
# Ver procesos
top -b -n 1 | grep ceph-osd
htop
# Ver operaciones activas
ceph daemon osd.5 dump_ops_in_flight
Soluciones:
# Limitar scrubbing
ceph tell osd.* injectargs '--osd-max-scrubs 1'
ceph config set osd osd_scrub_begin_hour 2
ceph config set osd osd_scrub_end_hour 6
# Reducir recovery concurrente
ceph tell 'osd.*' injectargs '--osd-max-backfills 1'
# Aumentar recursos (más cores, más RAM)
🗄️ Problemas de Pools y RBD¶
Error: "pool has too few PGs"¶
Síntoma:
$ ceph -s
health: HEALTH_WARN
pool 'volumes' has too few pgs
Solución:
# Calcular PGs adecuados
# Fórmula: (OSDs * 100) / pool_size / num_pools
# Ejemplo: (30 * 100) / 3 / 4 = 250 → redondear a 256
# Aumentar PGs (automático en Octopus+)
ceph osd pool set volumes pg_num 256
# Esperar autoscaling
ceph osd pool autoscale-status
# Habilitar autoscaling si no está activo
ceph osd pool set volumes pg_autoscale_mode on
No se puede eliminar pool¶
Síntoma:
$ ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; configure mon_allow_pool_delete
Solución:
# Habilitar eliminación
ceph config set mon mon_allow_pool_delete true
# Eliminar pool
ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
# Deshabilitar eliminación (buena práctica)
ceph config set mon mon_allow_pool_delete false
RBD image corrupta¶
Diagnóstico:
# Verificar imagen
rbd info <pool>/<image>
rbd check <pool>/<image>
# Ver snapshots
rbd snap ls <pool>/<image>
Solución:
# Intentar repair
rbd repair <pool>/<image>
# Si hay snapshots, flatten
rbd flatten <pool>/<image>
# Recuperar desde snapshot válido
rbd snap rollback <pool>/<image>@<snapshot-name>
# Último recurso: exportar/reimportar
rbd export <pool>/<image> /tmp/image_backup.raw
rbd rm <pool>/<image>
rbd import /tmp/image_backup.raw <pool>/<image>
🔧 Problemas de MON (Monitors)¶
MON down o clock skew¶
Síntoma:
$ ceph -s
health: HEALTH_WARN
clock skew detected on mon.node2
Solución:
# Verificar NTP/chrony en todos los nodos
systemctl status chronyd
chronyc tracking
# Sincronizar tiempo
sudo chronyc -a makestep
# Verificar timesync
timedatectl status
# Reiniciar MON si es necesario
systemctl restart ceph-mon@node2
Quorum perdido¶
Síntoma: Ceph -s no responde o muestra "no quorum".
Solución (PELIGROSO):
# Ver estado de MONs
ceph mon stat
# Si tienes >50% MONs UP, esperar a que formen quorum
# Si has perdido mayoría, recuperar manualmente:
# En el MON superviviente:
ceph-mon -i <mon-id> --extract-monmap /tmp/monmap
monmaptool --print /tmp/monmap
# Editar monmap si es necesario
monmaptool --rm <mon-id-down> /tmp/monmap
# Inyectar monmap
ceph-mon -i <mon-id> --inject-monmap /tmp/monmap
# Reiniciar
systemctl restart ceph-mon@<mon-id>
🛠️ Herramientas de Diagnóstico¶
Script de Health Check¶
#!/bin/bash
# ceph-health-check.sh
echo "=== Ceph Health Check ==="
ceph -s
echo -e "\n=== OSDs Status ==="
ceph osd tree
echo -e "\n=== Disk Usage ==="
ceph osd df tree
echo -e "\n=== PG Status ==="
ceph pg stat
echo -e "\n=== Pool Usage ==="
ceph df
echo -e "\n=== Slow Ops ==="
ceph daemon osd.* dump_historic_slow_ops | grep -A5 "slow_ops"
echo -e "\n=== Network Check ==="
ceph tell mon.* version
ceph tell osd.* version | grep -c "version"
Benchmark Storage¶
#!/bin/bash
# benchmark-ceph.sh
POOL="benchmark-pool"
# Crear pool temporal
ceph osd pool create $POOL 128
rados bench -p $POOL 30 write --no-cleanup
rados bench -p $POOL 30 seq
rados bench -p $POOL 30 rand
# Cleanup
ceph osd pool delete $POOL $POOL --yes-i-really-really-mean-it
📊 Logs y Debugging¶
Ubicaciones de Logs¶
# Logs de OSDs
/var/log/ceph/ceph-osd.*.log
# Logs de MONs
/var/log/ceph/ceph-mon.*.log
# Logs de MGRs
/var/log/ceph/ceph-mgr.*.log
# Ver en tiempo real
tail -f /var/log/ceph/ceph-osd.5.log
journalctl -u ceph-osd@5 -f
Habilitar Debug¶
# Aumentar debug level (0-30, default 1)
ceph tell osd.5 injectargs '--debug-osd 20'
ceph tell mon.* injectargs '--debug-mon 20'
# Restaurar
ceph tell osd.5 injectargs '--debug-osd 1'
📚 Comandos de Emergencia¶
Pausar Recovery/Rebalancing¶
# Pausar operaciones (para mantenimiento)
ceph osd set noout
ceph osd set norebalance
ceph osd set norecover
ceph osd set nobackfill
# Reanudar
ceph osd unset noout
ceph osd unset norebalance
ceph osd unset norecover
ceph osd unset nobackfill
Forzar Completar Recovery¶
# Ver PGs en recovery
ceph pg dump | grep -E "recovery|backfill"
# Acelerar (¡impacta performance!)
ceph tell 'osd.*' injectargs '--osd-recovery-max-active 10'
ceph tell 'osd.*' injectargs '--osd-max-backfills 10'
ceph tell 'osd.*' injectargs '--osd-recovery-sleep-hdd 0'
# Restaurar defaults
ceph tell 'osd.*' injectargs '--osd-recovery-max-active 3'
ceph tell 'osd.*' injectargs '--osd-max-backfills 1'
ceph tell 'osd.*' injectargs '--osd-recovery-sleep-hdd 0.1'
🎓 Mejores Prácticas de Troubleshooting¶
- Siempre revisar logs primero:
journalctl -u ceph-* -f - No hacer cambios drásticos sin backup: Especialmente con
ceph osd purge - Un cambio a la vez: Para identificar qué solucionó el problema
- Documentar: Mantener registro de cambios y comandos ejecutados
- Monitorizar: Usar Grafana + Prometheus para detección proactiva
📚 Referencias¶
Comandos Destructivos
Nunca ejecutes ceph osd purge, ceph osd pool delete o --force sin entender completamente las consecuencias.
Antes de Hacer Cambios
Siempre ejecuta ceph -s y ceph health detail para tener un baseline del estado del clúster.