Estructura del Proyecto y Organización de Componentes
El proyecto Redis Failover está diseñado para gestionar la alta disponibilidad de clústeres Redis mediante un mecanismo de consenso. A continuación, se detalla la disposición de sus directorios y la funcionalidad de sus componentes esenciales:
redis-failover/
├── failover/ # Núcleo de la lógica de alta disponibilidad
│ ├── group.go # Gestión de agrupaciones de instancias
│ ├── node.go # Control de estados de nodos individuales
├── vendor/ # Dependencias externas gestionadas
├── Makefile # Automatización de tareas de compilación
├── go.mod # Definición de módulos de Go
├── main.go # Punto de entrada de la aplicación
└── config.toml # Ejemplo de configuración externa
Dentro del directorio failover/ se procesa la detección de fallos y se orquestan las transferencias de roles (failover). El archivo group.go supervisa el conjunto de instancias, mientras que node.go se encarga de la comunicación directa y el monitoreo de salud de cada servidor Redis.
Análisis del Punto de Entrada (main.go)
El archivo main.go es el encargado de inicializar el servicio, procesar los parámetros de ejecución y estiblecer el mecanismo de consenso (Raft o ZooKeeper). A continuación, se presenta una versión estructurada del código de inicio:
package main
import (
"flag"
"log"
"github.com/ledisdb/redis-failover/failover"
)
func main() {
// Definición de parámetros mediante flags
escuchaHTTP := flag.String("http-addr", "0.0.0.0:11000", "Dirección de la interfaz API")
nodosMaestros := flag.String("redis-master-list", "", "Direcciones de los nodos Redis principales")
raftVinculo := flag.String("raft-bind", "", "Dirección de comunicación interna Raft")
rutaDatosRaft := flag.String("db-path", "/data/raft", "Directorio para la persistencia de Raft")
nodosConsenso := flag.String("cluster-nodes", "", "Lista de miembros del clúster Raft")
tipoGestor := flag.String("backend", "raft", "Backend de coordinación (raft o zk)")
flag.Parse()
// Inicialización de la instancia de failover
instanciaSrv := failover.NewFailover(
*escuchaHTTP,
*nodosMaestros,
*raftVinculo,
*rutaDatosRaft,
*nodosConsenso,
*tipoGestor,
)
// Ejecución del servicio
log.Printf("Iniciando Redis Failover en %s...", *escuchaHTTP)
if err := instanciaSrv.Start(); err != nil {
log.Fatalf("Error crítico al arrancar el servicio: %v", err)
}
}
En esta implementación, se utiliza el paquete flag para permitir una configuración dinámica. La función failover.NewFailover instancia el orquestador que mantendrá la consistencia del estado del clúster frente a posibles caídas de red o de hardware.
Gestión de Parámetros mediatne Archivos de Configuración
Además de los argumentos de línea de comandos, es posible definir el comportamiento del sistema mediante un archivo en formato TOML. Este enfoque es preferible para despliegues en entornos de producción y contenedores.
# Ejemplo de configuración para alta disponibilidad
addr = "0.0.0.0:11000"
masters = "192.168.1.10:6379, 192.168.1.11:6379"
raft_addr = "192.168.1.10:12000"
raft_data_dir = "/var/lib/redis-failover"
raft_cluster = "192.168.1.10:12000,192.168.1.11:12000,192.168.1.12:12000"
broker = "raft"
Los parámetros clave son:
- addr: El puerto donde la API HTTP estará disponible para consultas de estado.
- masters: La lista inicial de servidores Redis que el sistema debe supervisar.
- raft_cluster: Define la topología del clúster de consenso para garantizar que las decisiones de failover sean consistentes entre múltiples nodos de control.
- broker: Determina el motor de coordinación, siendo
raftla opción predeterminada por su robustez en sistemas distribuidos.