MongoDB: Replica set (HA)

Cómo configurar un replica set de alta disponibilidad

Un replica set es un grupo de nodos MongoDB que trabajan conjuntamente para proporcionar alta disponibilidad y mejorar el rendimiento duplicando los datos en varios servidores. Con un replica set, su base de datos permanece accesible incluso si uno de los nodos falla, y puede gestionar un mayor número de peticiones distribuyendo la carga de trabajo.

Ejemplo de un replica set con 3 nodosEjemplo de un replica set con 3 nodos

En una configuración de alta disponibilidad, si un nodo se desconecta, sus datos siguen estando disponibles a través de los otros nodos. El rendimiento también mejora porque todas las operaciones de escritura se dirigen al nodo primario, mientras que las operaciones de lectura pueden distribuirse entre los nodos secundarios.

Si es la primera vez que trabaja con replica sets, puede consultar la documentación oficial de MongoDB para obtener más información.

Para configurar un replica set, necesitará al menos tres nodos MongoDB:

  1. Un nodo actúa como primary, gestionando todas las operaciones de escritura y, por defecto, también las de lectura.
  2. Los otros nodos son secondaries. Replican continuamente los datos del nodo primario casi en tiempo real.

Si un nodo secundario se vuelve inaccesible, su aplicación seguirá funcionando con normalidad. Cuando el secundario se reincorpora al clúster, sincroniza los datos que se haya perdido y se pone al día con el resto del replica set.

Si el nodo primario falla, el replica set inicia automáticamente una elección para seleccionar un nuevo primario. Este proceso suele tardar unos 10 segundos. Durante este tiempo, el replica set es de solo lectura. Una vez elegido el nuevo primario, todas las operaciones se reanudan con normalidad.

Ejemplo de una elecciónEjemplo de una elección

Para crear un replica set en Stackhero, necesitará al menos tres instancias de MongoDB. Aquí tiene una guía paso a paso:

  1. Inicie sus tres (o más) instancias de MongoDB desde el panel de Stackhero.
  2. Una vez que las instancias estén en funcionamiento, actualice su configuración en el panel:
    1. Establezca la misma contraseña de administrador en cada instancia.
    2. Active la opción Activar replica set.
    3. Elija un nombre de replica y una clave secreta que compartirán todos los nodos. (Tenga en cuenta: El nombre del replica set no se puede cambiar después de la creación. Si tiene dudas, rs-1 es un valor predeterminado recomendable.)

Recuerde que TODAS sus instancias deben tener una configuración idéntica (contraseña de administrador, nombre del replica set y clave secreta del replica set).

Una vez guardada la configuración, deberá definir todos los miembros de su replica set dentro de MongoDB. Así es como puede hacerlo:

  1. Puede utilizar este comando para conectarse con el Mongo CLI:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true

Si no tiene instalado el Mongo CLI, puede utilizar la imagen oficial de Docker con este comando:

> docker run -it mongo /bin/bash

Este comando abre un shell donde puede ejecutar comandos de Mongo directamente.

  1. Tras conectarse, puede iniciar su replica set con el siguiente comando. Asegúrese de reemplazar el _id por el nombre de su replica set y de actualizar los nombres de host de los miembros según corresponda:
rs.initiate({
   _id: "rs-1",
   members: [
      { _id: 0, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 1, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 2, host: "<XXXXXX>.stackhero-network.com:27017" }
   ]
})

Si el comando se ejecuta correctamente, verá una respuesta similar a { "ok" : 1 }.

  1. Si desea revisar la configuración de su replica set, puede ejecutar:
rs.conf()

Solo necesita aplicar esta configuración en un nodo. Los demás nodos se actualizan automáticamente.

Su replica set de MongoDB debería estar ya en funcionamiento.

Para ayudarle a monitorizar el estado de su replica set, hemos creado un script en Node.js que comprueba el estado cada segundo. Puede encontrar este script en nuestro repositorio de GitHub.

Captura de pantalla del scriptCaptura de pantalla del script

Si ve este error, normalmente se debe a que no se ha habilitado el cifrado TLS. Puede solucionarlo añadiendo el parámetro tls=true a su URL de conexión. Por ejemplo:

mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true