Storage para bases de datos: PostgreSQL + Ceph¶
Esta guía explica cómo configurar PostgreSQL con Ceph como storage backend, optimizando rendimiento y alta disponibilidad para bases de datos críticas.
🏗️ Arquitectura¶
Componentes principales¶
graph TD
A[PostgreSQL] --> B[RBD Block Device]
B --> C[Ceph Cluster]
C --> D[OSD Nodes]
C --> E[Monitor Nodes]
C --> F[Manager Nodes]
G[Cliente] --> A
Beneficios de esta combinación: - ✅ Escalabilidad: Storage ilimitado prácticamente - ✅ HA: Replicación automática de datos - ✅ Rendimiento: RBD optimizado para bases de datos - ✅ Backup: Snapshots consistentes - ✅ Recuperación: RTO/RPO mínimos
📋 Prerrequisitos¶
Cluster Ceph¶
# Verificar estado del cluster
ceph status
ceph health
# Verificar pools disponibles
ceph osd pool ls
Nodo PostgreSQL¶
# Instalar herramientas Ceph
sudo apt update
sudo apt install ceph-common
# Copiar configuración de Ceph
sudo scp ceph-admin:/etc/ceph/ceph.conf /etc/ceph/
sudo scp ceph-admin:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
🚀 Configuración paso a paso¶
1. Crear pool optimizado para RBD¶
# Pool para datos PostgreSQL
ceph osd pool create pg_data 128 128
ceph osd pool set pg_data size 3
ceph osd pool set pg_data min_size 2
# Pool para WAL (Write-Ahead Log)
ceph osd pool create pg_wal 64 64
ceph osd pool set pg_wal size 3
ceph osd pool set pg_wal min_size 2
# Pool para backups
ceph osd pool create pg_backup 128 128
2. Crear RBD images¶
# Image para datos principales (100GB)
rbd create pg_data/postgres_data --size 100G --pool pg_data
# Image para WAL (20GB)
rbd create pg_wal/postgres_wal --size 20G --pool pg_wal
# Image para backups (200GB)
rbd create pg_backup/postgres_backup --size 200G --pool pg_backup
# Verificar creación
rbd ls pg_data
rbd info pg_data/postgres_data
3. Mapear y formatear RBD¶
# Mapear devices
sudo rbd map pg_data/postgres_data
sudo rbd map pg_wal/postgres_wal
# Verificar mapeo
rbd showmapped
# Formatear con XFS (recomendado para PostgreSQL)
sudo mkfs.xfs /dev/rbd/pg_data/postgres_data
sudo mkfs.xfs /dev/rbd/pg_wal/postgres_wal
# Crear puntos de montaje
sudo mkdir -p /var/lib/postgresql/data
sudo mkdir -p /var/lib/postgresql/wal
# Montar
sudo mount /dev/rbd/pg_data/postgres_data /var/lib/postgresql/data
sudo mount /dev/rbd/pg_wal/postgres_wal /var/lib/postgresql/wal
4. Instalar y configurar PostgreSQL¶
# Instalar PostgreSQL
sudo apt install postgresql postgresql-contrib
# Detener servicio
sudo systemctl stop postgresql
# Configurar permisos
sudo chown postgres:postgres /var/lib/postgresql/data
sudo chown postgres:postgres /var/lib/postgresql/wal
5. Configuración de PostgreSQL para Ceph¶
# Archivo: /etc/postgresql/14/main/postgresql.conf
sudo tee /etc/postgresql/14/main/postgresql.conf > /dev/null <<EOF
# Configuración optimizada para Ceph RBD
data_directory = '/var/lib/postgresql/data'
hba_file = '/etc/postgresql/14/main/pg_hba.conf'
ident_file = '/etc/postgresql/14/main/pg_ident.conf'
# Memoria
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 4MB
maintenance_work_mem = 64MB
# WAL
wal_level = replica
wal_buffers = 16MB
wal_writer_delay = 200ms
wal_writer_flush_after = 1MB
# Checkpointing
checkpoint_completion_target = 0.9
checkpoint_timeout = 15min
max_wal_size = 2GB
min_wal_size = 80MB
# Logging
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_statement = 'ddl'
log_duration = on
log_lock_waits = on
# Replication (si aplica)
max_replication_slots = 10
max_wal_senders = 10
# Conexiones
listen_addresses = '*'
max_connections = 100
EOF
6. Configuración de pg_hba.conf¶
# Archivo: /etc/postgresql/14/main/pg_hba.conf
sudo tee /etc/postgresql/14/main/pg_hba.conf > /dev/null <<EOF
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
local all all peer
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
host all all 10.0.0.0/8 md5
host all all 192.168.0.0/16 md5
EOF
🔧 Optimizaciones de rendimiento¶
Configuración RBD¶
# Aumentar queue depth para mejor IOPS
rbd config global set rbd rbd_default_queue_depth 256
# Configurar QoS por pool
ceph osd pool set pg_data qos_iops_limit 10000
ceph osd pool set pg_wal qos_iops_limit 5000
# Habilitar RBD caching
rbd config image set pg_data/postgres_data rbd_cache true
rbd config image set pg_data/postgres_data rbd_cache_max_dirty 100
Optimizaciones PostgreSQL¶
-- Configuración de base de datos
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';
ALTER SYSTEM SET track_io_timing = on;
ALTER SYSTEM SET track_functions = all;
-- Crear usuario para monitoreo
CREATE USER ceph_monitor WITH PASSWORD 'secure_password';
GRANT pg_monitor TO ceph_monitor;
-- Configurar tablespaces si es necesario
CREATE TABLESPACE ceph_data OWNER postgres LOCATION '/var/lib/postgresql/data';
CREATE TABLESPACE ceph_wal OWNER postgres LOCATION '/var/lib/postgresql/wal';
Monitoreo de rendimiento¶
# IOPS del RBD
rbd perf image iostat pg_data/postgres_data
# Latencia de Ceph
ceph tell osd.* perf dump | jq '.osd.osd_op_lat'
# Estadísticas PostgreSQL
psql -c "SELECT * FROM pg_stat_bgwriter;"
psql -c "SELECT * FROM pg_stat_database;"
🛡️ Alta disponibilidad¶
Configuración de replicas¶
# Crear snapshot para backup
rbd snap create pg_data/postgres_data@snapshot_$(date +%Y%m%d_%H%M%S)
# Clonar para replica
rbd snap protect pg_data/postgres_data@snapshot_20231201_120000
rbd clone pg_data/postgres_data@snapshot_20231201_120000 pg_data/postgres_data_replica
# Configurar PostgreSQL streaming replication
# En postgresql.conf del slave:
# hot_standby = on
# primary_conninfo = 'host=master_ip port=5432 user=replicator'
Backup strategy¶
#!/bin/bash
# backup_postgres_ceph.sh
DATE=$(date +%Y%m%d_%H%M%S)
SNAP_NAME="backup_$DATE"
# Crear snapshot consistente
psql -c "SELECT pg_start_backup('$SNAP_NAME');"
rbd snap create pg_data/postgres_data@$SNAP_NAME
psql -c "SELECT pg_stop_backup();"
# Exportar snapshot
rbd export pg_data/postgres_data@$SNAP_NAME /backup/postgres_$DATE.img
# Limpiar snapshots antiguos (mantener 7 días)
rbd snap ls pg_data/postgres_data | grep backup | head -n -7 | awk '{print $2}' | xargs -I {} rbd snap rm pg_data/postgres_data@{}
📊 Monitoreo y troubleshooting¶
Métricas clave¶
# Uso de storage
ceph df
rbd du pg_data/postgres_data
# Rendimiento PostgreSQL
psql -c "SELECT * FROM pg_stat_bgwriter;"
psql -c "SELECT * FROM pg_stat_database WHERE datname = 'postgres';"
# Logs de errores
tail -f /var/log/postgresql/postgresql-14-main.log
Problemas comunes¶
Rendimiento lento¶
# Verificar latencia RBD
rbd perf image iostat pg_data/postgres_data --period 10
# Ajustar parámetros PostgreSQL
# Aumentar shared_buffers si hay memoria disponible
# Ajustar work_mem basado en consultas complejas
Conectividad Ceph¶
# Verificar conectividad
ceph ping mon.a
ceph ping osd.0
# Ver logs de RBD
dmesg | grep rbd
journalctl -u ceph-rbd-mirror
Recuperación de desastres¶
# Simular falla
sudo umount /var/lib/postgresql/data
sudo rbd unmap /dev/rbd/pg_data/postgres_data
# Recuperar
sudo rbd map pg_data/postgres_data
sudo mount /dev/rbd/pg_data/postgres_data /var/lib/postgresql/data
sudo systemctl start postgresql
🔄 Migración desde storage tradicional¶
Estrategia de migración¶
# 1. Crear backup completo
pg_dumpall > full_backup.sql
# 2. Detener aplicación
sudo systemctl stop myapp
# 3. Migrar datos
rsync -av /var/lib/postgresql/data/ /tmp/postgres_backup/
cp -r /tmp/postgres_backup/* /var/lib/postgresql/data/
# 4. Verificar integridad
psql -c "SELECT count(*) FROM pg_database;"
# 5. Reiniciar servicios
sudo systemctl start postgresql
sudo systemctl start myapp
📈 Escalado y crecimiento¶
Añadir más OSDs¶
# Añadir nuevo OSD
ceph-deploy osd create node-03:sdb
# Rebalancear datos
ceph balancer on
ceph balancer mode upmap
Expandir pools¶
# Añadir más PGs si es necesario
ceph osd pool set pg_data pg_num 256
ceph osd pool set pg_data pgp_num 256
# Monitorear rebalanceo
ceph status
watch ceph -s