Base de datos
Introducción
La replicación de la base de datos es una parte fundamental de la arquitectura tolerante a fallos de Passwork. Mantiene los datos sincronizados entre nodos. Cuando el nodo Primary falla, los nodos restantes votan para elegir un nuevo Primary que los servidores de aplicaciones comienzan a usar automáticamente.
Mecanismo de votación
Cómo funciona
- Cada nodo tiene un voto — cada nodo puede participar en la elección del Primary.
- Quórum — elegir un nuevo Primary requiere una mayoría (>50%) de los votos.
- Elección automática — cuando el Primary actual falla, los nodos votan automáticamente.
- Sincronización de datos — el nuevo Primary debe tener datos actualizados.
Por qué importa la cantidad de nodos
Nodos mínimos: 3
Para mantener la tolerancia a fallos, utilice un número impar de nodos (3, 5, 7) en el conjunto de réplicas.
Por qué 2 nodos no son suficientes
- Con 2 nodos: si uno falla, el nodo restante no puede alcanzar el quórum (50% es insuficiente; se necesita >50%).
- Con 3 nodos: si uno falla, los 2 nodos restantes forman una mayoría (66%) y pueden elegir un nuevo Primary.
Por qué se prefiere un número impar
Con un número par de nodos (por ejemplo, 4), existe el riesgo de un escenario de split-brain:
- Si la red se divide en dos partes con 2 nodos cada una, ningún lado puede alcanzar la mayoría (se requiere >50%).
- Ambas partes cambian a modo de solo lectura y el sistema queda no disponible.
Ejemplo del problema con 4 nodos:
┌─────────────────────────────────────────────────────────────────────────┐
│ NETWORK SPLIT │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Node #1 │ │ Node #2 │ │ Node #3 │ │ Node #4 │ │
│ │ │ │ │ │ │ │ │ │
│ │ Vote: 1 │ │ Vote: 1 │ │ Vote: 1 │ │ Vote: 1 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ │
│ │ │ │
│ Part 1: 2 nodes (50%) Part 2: 2 nodes (50%) │
│ — Cannot elect Primary — Cannot elect Primary │
│ — Read-only mode — Read-only mode │
│ — Passwork unavailable — Passwork unavailable │
└─────────────────────────────────────────────────────────────────────────┘
Comparación de configuraciones:
| Nodos | 1 nodo falla | División de red | Recomendación |
|---|---|---|---|
| 2 | Solo lectura | Solo lectura | No recomendado |
| 3 | Funciona | Funciona (2 de 3) | Mínimo recomendado |
| 4 | Funciona | Solo lectura (2 y 2) | No recomendado |
| 5 | Funciona | Funciona (3 de 5) | Recomendado |
| 6 | Funciona | Solo lectura (3 y 3) | No recomendado |
| 7 | Funciona | Funciona (4 de 7) | Recomendado |
Diagrama de votación
┌─────────────────────────────────────────────────────────────────┐
│ REPLICA SET │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Node #1 │ │ Node #2 │ │ Node #3 │ │
│ │ (Primary) │ │ (Secondary) │ │ (Secondary) │ │
│ │ │ │ │ │ │ │
│ │ Vote: 1 │ │ Vote: 1 │ │ Vote: 1 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └─────────────────┼─────────────────┘ │
│ │ │
│ Voting between nodes │
│ (Quorum: 2 of 3 = majority) │
└─────────────────────────────────────────────────────────────────┘
Escenarios operativos
Operación normal (3 nodos):
- El Primary maneja todas las lecturas y escrituras.
- Los nodos Secondary se sincronizan con el Primary.
- Todos los nodos participan en la votación.
Un nodo falla (quedan 2 nodos):
- Los 2 nodos restantes forman una mayoría (66%).
- Un nuevo Primary se elige automáticamente.
- El sistema continúa funcionando para lecturas y escrituras.
Dos nodos fallan (queda 1 nodo):
- El nodo restante no puede alcanzar el quórum (33% < 50%).
- El conjunto de réplicas cambia a modo de solo lectura.
- Passwork queda no disponible para escrituras.
Modo de solo lectura y disponibilidad de Passwork
Cuándo ocurre el modo de solo lectura
Un conjunto de réplicas entra en modo de solo lectura cuando:
- Sin quórum — más de la mitad de los nodos no están disponibles.
- Partición de red — las partes del clúster tienen cada una menos del 50% de los nodos.
Impacto en Passwork
Cuando la base de datos está en modo de solo lectura, Passwork está completamente no disponible. Cualquier acción en Passwork (iniciar sesión, ver datos, crear o actualizar elementos) requiere escrituras en la base de datos para registrar el historial de actividad. Con las escrituras bloqueadas, estas operaciones no se pueden completar.
Lo que ven los usuarios:
- Errores de conexión al intentar acceder a la base de datos
- Mensajes en los registros como «read-only mode» o «no primary available»
- Mensajes de error en la interfaz al intentar usar el sistema
Conjunto de réplicas de MongoDB
Arquitectura
Un conjunto de réplicas de MongoDB consta de múltiples nodos, un Primary y uno o más nodos Secondary.
Tipos de nodos:
- Primary — maneja todas las operaciones de escritura y lectura.
- Secondary — se sincronizan desde el Primary y opcionalmente pueden servir lecturas.
- Arbiter (opcional) — participa en las elecciones pero no almacena datos.
Cómo funciona
- Las escrituras se realizan solo en el nodo Primary.
- El Oplog (registro de operaciones) almacena todas las operaciones de escritura.
- Sincronización — los nodos Secondary leen el Oplog del Primary y aplican las operaciones a sus datos.
- Votación — cuando el Primary falla, los nodos votan para elegir un nuevo Primary.
- Conmutación automática por error — un nuevo Primary se elige automáticamente entre los nodos con datos actualizados.
Cadena de conexión
Todos los servidores de aplicaciones de Passwork se conectan al conjunto de réplicas utilizando una única cadena de conexión:
mongodb://node1:27017,node2:27017,node3:27017/pw?replicaSet=rs0
El controlador de MongoDB automáticamente:
- Detecta el nodo Primary actual
- Después de la conmutación por error, redirige las consultas al nuevo Primary elegido por el conjunto de réplicas
Requisitos para la ubicación de nodos
Importancia de sitios independientes
Para máxima tolerancia a fallos, utilice tres sitios físicos independientes (centros de datos).
Por qué es importante:
- Protección contra desastres — si un sitio falla, los demás siguen funcionando.
- Infraestructura independiente — cada sitio tiene su propia alimentación eléctrica, refrigeración y red.
- Distribución geográfica — los nodos pueden estar en diferentes ubicaciones.
Arquitectura de ubicación recomendada
┌─────────────────────────────────────────────────────────────────────┐
│ RECOMMENDED ARCHITECTURE │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ DC #1 │ │ DC #2 │ │ DC #3 │ │
│ │ │ │ │ │ │ │
│ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │
│ │ │ MongoDB │ │ │ │ MongoDB │ │ │ │ MongoDB │ │ │
│ │ │ Node #1 │ │ │ │ Node #2 │ │ │ │ Node #3 │ │ │
│ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │ │
│ │ │ │ │ │ │ │
│ │ Independent │ │ Independent │ │ Independent │ │
│ │ infrastructure │ │ infrastructure │ │ infrastructure │ │
│ └────────┬─────────┘ └────────┬─────────┘ └───────┬──────────┘ │
│ │ │ │ │
│ │ │ │ │
│ └─────────────────────┼────────────────────┘ │
│ │ │
│ High-speed network │
│ (for data replication) │
└─────────────────────────────────────────────────────────────────────┘
Requisitos de red
Los nodos de la base de datos necesitan:
- Conexiones de alta velocidad para la replicación
- Baja latencia para una sincronización rápida
- Enlaces estables con pérdida mínima de paquetes
- Ancho de banda suficiente para el tráfico de replicación
Requisitos mínimos
Mínimo: 3 nodos en 3 sitios independientes
- Cada nodo en un sitio físico separado (centro de datos)
- Enlaces de red de alta velocidad entre sitios
- Infraestructura independiente por sitio
Alternativa (no recomendada):
- 3 nodos en un centro de datos pero en diferentes servidores/racks
- Menor protección contra desastres, pero aún tolerante a la falla de un solo nodo
Conexión de los servidores de aplicaciones
Cadena de conexión única
Todos los servidores de aplicaciones de Passwork se conectan a través de una cadena de conexión.
Los controladores de MongoDB descubren el Primary automáticamente cuando se enumeran todos los nodos:
mongodb://db-mongo-1,db-mongo-2,db-mongo-3/?replicaSet=rs0
Detección automática del Primary
- El controlador detecta el Primary actual durante la conexión.
- Monitorea el estado de los nodos.
- Después de una elección, cambia el tráfico al nuevo Primary automáticamente.
Recomendaciones
- Utilice una cadena de conexión compartida en todos los servidores de aplicaciones.
- Enumere todos los nodos, no apunte a un solo host.
- Establezca tiempos de espera razonables para conexiones y operaciones.
- Monitoree el conjunto de réplicas para rastrear cuál nodo es Primary y verificar las elecciones.