Guía Técnica para la Implementación y Configuración de Redis Failover

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 raft la opción predeterminada por su robustez en sistemas distribuidos.

Etiquetas: Redis Failover golang raft-consensus high-availability

Publicado el 7-20 21:53