Saltar al contenido principal

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

  1. Cada nodo tiene un voto — cada nodo puede participar en la elección del Primary.
  2. Quórum — elegir un nuevo Primary requiere una mayoría (>50%) de los votos.
  3. Elección automática — cuando el Primary actual falla, los nodos votan automáticamente.
  4. 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:

Nodos1 nodo fallaDivisión de redRecomendación
2Solo lecturaSolo lecturaNo recomendado
3FuncionaFunciona (2 de 3)Mínimo recomendado
4FuncionaSolo lectura (2 y 2)No recomendado
5FuncionaFunciona (3 de 5)Recomendado
6FuncionaSolo lectura (3 y 3)No recomendado
7FuncionaFunciona (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:

  1. Sin quórum — más de la mitad de los nodos no están disponibles.
  2. 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

  1. Las escrituras se realizan solo en el nodo Primary.
  2. El Oplog (registro de operaciones) almacena todas las operaciones de escritura.
  3. Sincronización — los nodos Secondary leen el Oplog del Primary y aplican las operaciones a sus datos.
  4. Votación — cuando el Primary falla, los nodos votan para elegir un nuevo Primary.
  5. 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:

  1. Protección contra desastres — si un sitio falla, los demás siguen funcionando.
  2. Infraestructura independiente — cada sitio tiene su propia alimentación eléctrica, refrigeración y red.
  3. 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.