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.