Vamos a combinar dos temas importantes para darte una solución completa: un sistema de almacenamiento distribuido adecuado junto con el balanceo de cargas entre nodos proxmox.
Parte 1: Almacenamiento distribuido con Ceph
Ceph es la mejor solución integrada en Proxmox para distribuir el almacenamiento entre todos los nodos:
- Configuración básica de Ceph:
- Instala Ceph en los tres nodos:
bash
apt update apt install proxmox-ceph-server
- Inicia la configuración desde la interfaz web de Proxmox:
- Ve a Datacenter → Ceph → Create Ceph Monitor
- Configura un monitor en cada uno de tus tres nodos
- Añade discos OSD en cada nodo:
- Ve a cada nodo → Ceph → OSD
- Selecciona discos dedicados para Ceph (idealmente SSD)
- Tres OSD (uno por nodo) como mínimo
- Crea un pool para VMs y contenedores:
bash
pveceph pool create vms --size 3 --application rbd
- Instala Ceph en los tres nodos:
- Ventajas de Ceph para tu caso:
- Los datos se distribuyen entre los tres nodos
- Si cae proxmox0, los datos siguen disponibles
- Rendimiento escalable al añadir más discos
- Integración nativa con Proxmox
Parte 2: Balanceo automático de cargas
Con el almacenamiento Ceph configurado, ahora podemos implementar un balanceo automático efectivo:
- Script de balanceo mejorado:
bash
#!/bin/bash
# Configuración
MAX_CPU=80
MIN_CPU=20
MAX_MEM=75
MIN_MEM=25
LOG_FILE="/var/log/pve-balancer.log"
# Función para registrar actividad
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
log "Iniciando balanceo de cargas"
# Obtener información de todos los nodos
NODES_INFO=$(pvesh get /nodes --output-format=json)
# Encontrar nodos sobrecargados
OVERLOADED_NODES=$(echo $NODES_INFO | jq -r ".[] | select(.cpu > $MAX_CPU or .mem_usage > $MAX_MEM) | .node")
# Encontrar nodos con baja carga
UNDERLOADED_NODES=$(echo $NODES_INFO | jq -r ".[] | select(.cpu < $MIN_CPU and .mem_usage < $MIN_MEM) | .node")
if [ -z "$OVERLOADED_NODES" ]; then
log "No hay nodos sobrecargados. No se requiere migración."
exit 0
fi
if [ -z "$UNDERLOADED_NODES" ]; then
log "No hay nodos con baja carga disponibles para migración."
exit 0
fi
log "Nodos sobrecargados: $OVERLOADED_NODES"
log "Nodos con baja carga: $UNDERLOADED_NODES"
# Para cada nodo sobrecargado
for SOURCE_NODE in $OVERLOADED_NODES; do
# Obtener VMs en ejecución en el nodo sobrecargado
RUNNING_VMS=$(pvesh get /nodes/$SOURCE_NODE/qemu --output-format=json | jq -r '.[] | select(.status=="running") | .vmid')
for VM in $RUNNING_VMS; do
# Elegir un nodo de destino con baja carga
TARGET_NODE=$(echo "$UNDERLOADED_NODES" | tr ' ' '\n' | shuf | head -n1)
if [ -n "$TARGET_NODE" ]; then
log "Migrando VM $VM desde $SOURCE_NODE a $TARGET_NODE"
# Realizar la migración en vivo
pvesh create /nodes/$SOURCE_NODE/qemu/$VM/migrate -target $TARGET_NODE -online 1
# Esperar un tiempo para que se complete la migración
sleep 60
# Verificar si la migración fue exitosa
CURRENT_NODE=$(pvesh get /cluster/resources --output-format=json | jq -r ".[] | select(.id==\"qemu/$VM\") | .node")
if [ "$CURRENT_NODE" = "$TARGET_NODE" ]; then
log "Migración exitosa de VM $VM a $TARGET_NODE"
else
log "Error en la migración de VM $VM a $TARGET_NODE"
fi
# Actualizar la lista de nodos con baja carga
NODES_INFO=$(pvesh get /nodes --output-format=json)
UNDERLOADED_NODES=$(echo $NODES_INFO | jq -r ".[] | select(.cpu < $MIN_CPU and .mem_usage < $MIN_MEM) | .node")
if [ -z "$UNDERLOADED_NODES" ]; then
log "No hay más nodos con baja carga disponibles."
break 2
fi
fi
done
done
log "Balanceo de cargas completado"
- Programación del balanceador:
- Guarda el script como /usr/local/bin/pve-balancer.sh
- Dale permisos de ejecución: chmod +x /usr/local/bin/pve-balancer.sh
- Configúralo para ejecutarse cada hora:
bash
echo "0 * * * * root /usr/local/bin/pve-balancer.sh" > /etc/cron.d/pve-balancer
Parte 3: Integración con alta disponibilidad
- Configurar grupos de alta disponibilidad:
- En la interfaz web: Datacenter → HA → Groups → Create
- Añade VMs críticas al grupo HA
- Configurar reglas de restricción:
- Define en qué nodos pueden ejecutarse tus VMs
- Establece preferencias de ubicación
Esta combinación te dará:
- Almacenamiento distribuido entre todos los nodos (sin punto único de fallo)
- Balanceo automático de cargas para optimizar CPU y RAM
- Alta disponibilidad para recuperación automática ante fallos