sql >> Base de Datos >  >> NoSQL >> MongoDB

Mantenimiento de conjuntos de réplicas de MongoDB en la nube mediante Ansible

La replicación se ha aplicado ampliamente en los sistemas de bases de datos para garantizar una alta disponibilidad de los datos mediante la creación de redundancia. Básicamente es una estrategia de hacer una copia de los mismos datos en diferentes servidores en ejecución que pueden estar en diferentes máquinas para que, en caso de falla del servidor principal, se pueda activar otro para continuar con el servicio.

Un conjunto de réplicas es un grupo de instancias de MongoDB que mantienen el mismo conjunto de datos. Son la base de los despliegues de producción. La replicación es ventajosa por el hecho de que los datos siempre están disponibles desde un servidor diferente en caso de que falle el sistema del servidor principal. Además, mejora el rendimiento de lectura al permitir que un cliente envíe una solicitud de lectura a diferentes servidores y obtenga una respuesta del más cercano.

Un conjunto de réplicas está formado por varios nodos portadores de datos que podrían alojarse en diferentes máquinas y un nodo árbitro. Uno de estos nodos que contienen datos está etiquetado como principal, mientras que los otros son nodos secundarios. El nodo principal recibe todas las operaciones de escritura y luego replica los datos a los otros nodos una vez que se completa la operación de escritura y se registran los cambios en un registro de operaciones.

Un árbitro es una instancia adicional que no mantiene un conjunto de datos pero proporciona un quórum en un conjunto de réplicas al responder a las solicitudes de latidos y elecciones de otros miembros del conjunto de réplicas. Por lo tanto, reducen el costo de mantener un conjunto de réplicas en lugar de un conjunto completamente funcional. miembro del conjunto de réplicas con un conjunto de datos.

Conmutación por error automática

Un nodo principal puede fallar debido a algunas razones, como cortes de energía o desconexión de la red, por lo que no puede comunicarse con los otros miembros. Si la comunicación se corta por más tiempo que el período de tiempo de espera de elecciones configurado, uno de los secundarios convoca a una elección para nominarse a sí mismo como el nuevo primario. Si la elección es completa y satisfactoria, el clúster continúa con el funcionamiento normal. Durante este período no se pueden realizar operaciones de escritura. Sin embargo, las consultas de lectura se pueden configurar para que funcionen con normalidad en los secundarios mientras el principal está fuera de línea.

Para un proceso de replicación óptimo, la mediana de tiempo antes de que el clúster elija un nuevo principal debe ser como máximo de 12 segundos con las opciones de configuración de replicación predeterminadas. Esto puede verse afectado por factores como la latencia de la red, que puede prolongar el tiempo, por lo que se debe tener en cuenta la arquitectura del clúster para garantizar que este tiempo no sea demasiado alto.

El valor de choiceTimeoutMillis se puede reducir del valor predeterminado 10000 (10 segundos), por lo que el primario se puede detectar primero durante muy rápido. Sin embargo, esto puede estar llamando a elecciones con frecuencia incluso por factores menores, como la latencia temporal de la red, aunque el nodo principal esté en buen estado. Esto dará lugar a problemas como reversiones para operaciones de escritura.

Ansible para conjuntos de réplicas

Como se mencionó, un conjunto de réplicas puede tener miembros de diferentes máquinas host, lo que hace que sea más complejo mantener el clúster. Necesitamos una plataforma única desde la cual este conjunto de réplicas se pueda mantener con facilidad. Ansible es una de las herramientas que proporciona una mejor visión general para configurar y administrar un conjunto de réplicas. Si es nuevo en ansible, haga un resumen rápido de este artículo para comprender los conceptos básicos, como la creación de un libro de jugadas.

Parámetros de configuración

  • árbitro_en_índice: esto define la posición del árbitro en la lista de miembros del conjunto de réplicas. Un árbitro recuerda que no tiene ningún dato como los demás miembros y no se puede utilizar como nodo principal. Solo está disponible para crear un quórum durante la elección. Por ejemplo, si tiene un número par de miembros, es bueno agregar un árbitro de modo que si los votos son iguales, agregue un 1 para hacer un miembro ganador. El valor a asignar debe ser un número entero.
  • encadenamiento_permitido: Esto toma un valor booleano y define si los otros miembros secundarios deben replicar desde los otros miembros secundarios si se encadena _allowed =true. De lo contrario, si se encadena _allowed =false, los otros miembros secundarios solo pueden replicar desde el principal. El valor predeterminado es verdadero.
  • election_timeout_secs: por defecto el valor es 10000 (toma un valor entero). Es el tiempo en milisegundos para detectar cuando el nodo principal no es accesible o no se comunica con los otros miembros, por lo tanto, desencadena una elección. Establezca esto en un valor medio de 12 segundos. Si se establece demasiado alto, pasará mucho tiempo antes de detectar la falla primaria y, por lo tanto, más tiempo para hacer una elección. Dado que esto afecta la operación de escritura, puede terminar perdiendo una gran cantidad de datos durante ese período. Por otro lado, si se establece demasiado bajo, habrá una activación frecuente de una elección, incluso cuando el caso no sea tan grave y la primaria aún sea alcanzable. Como resultado, tendrá tantas reversiones para operaciones de escritura que en algún momento pueden conducir a una mala integridad o inconsistencia de los datos.
  • heartbeat_timeout_secs: Los conjuntos de réplicas deben comunicarse entre sí antes de una elección mediante el envío de una señal denominada latido. Luego, los miembros deben responder a esta señalización dentro de un período específico que, de forma predeterminada, se establece en 10 segundos. Heartbeat_timeout_secs es el número de segundos que los miembros del conjunto de réplicas esperan un latido correcto entre sí y, si un miembro no responde, se marca como inaccesible. Sin embargo, esto es aplicable solo para la versión 0 del protocolo. Por lo tanto, el valor para esto es un número entero.
  • iniciar_host: Este es el host que alberga la base de datos de inicio de sesión. Por defecto para MongoDB es localhost.
  • base_de_inicio_de_inicio de sesión: el valor predeterminado es el administrador y es donde se almacenan las credenciales de inicio de sesión (toma un valor de cadena)
  • usuario_de_inicio de sesión: el nombre de usuario con el que se debe realizar la autenticación. (toma un valor de cadena)
  • contraseña_de_inicio de sesión: la contraseña para autenticar al usuario. (toma un valor de cadena)
  • puerto_de_inicio de sesión: Este es el puerto MongoDB para que el host inicie sesión. (toma un valor entero)
  • miembros: define una lista de miembros del conjunto de réplicas. Es una cadena separada por comas o una lista yaml, es decir, mongodb0:27017,mongodb2:27018,mongodb3:27019... Si no hay un número de puerto, se asume el 27017.
  • versión_del_protocolo: toma un número entero que define la versión del proceso de replicación. 0 o 1
  • conjunto_de_réplicas: este es un valor de cadena que define el nombre del conjunto de réplicas.
  • ssl: valor booleano que define si usar o no la conexión SSL cuando se conecta a la base de datos.
  • ssl_certs_reqs: esto especifica si se requiere un certificado del otro lado de la conexión y si será necesario validarlo si se proporciona. Las opciones para esto son CERT_NONE, CERT_OPTIONAL y CERT_REQUIRED. El valor predeterminado es CERT_REQUIRED.
  • validar: toma un valor booleano que define si se debe realizar una validación básica en la configuración del conjunto de réplicas proporcionada. El valor predeterminado es verdadero.

Creación de un conjunto de réplicas de MongoDB mediante Ansible

Este es un ejemplo simple de tareas para configurar un conjunto de réplicas en ansible. Llamemos a este archivo tareas.yaml

# Create a replicaset called 'replica0' with the 3 provided members
- name: Ensure replicaset replica0 exists
  mongodb_replicaset:
    login_host: localhost
    login_user: admin
    login_password: root
    replica_set: replica0
    arbiter_at_index:2
    election_timeout_secs:12000
    members:
    - mongodb1:27017
    - mongodb2:27018
    - mongodb3:27019
  when: groups.mongod.index(inventory_hostname) == 0

# Create two single-node replicasets on the localhost for testing
- name: Ensure replicaset replica0 exists
  mongodb_replicaset:
    login_host: localhost
    login_port: 3001
    login_user: admin
    login_password: root
    login_database: admin
    replica_set: replica0
    members: localhost:3000
    validate: yes

- name: Ensure replicaset replica1 exists
  mongodb_replicaset:
    login_host: localhost
    login_port: 3002
    login_user: admin
    login_password: secret
    login_database: root
    replica_set: replica1
    members: localhost:3001
    validate: yes

En nuestro libro de jugadas podemos llamar a las tareas como

---
- hosts: ansible-test
  remote_user: root
  become: yes
  Tasks:
- include: tasks.yml

Si ejecuta esto en su libro de jugadas, ansible-playbook -i Inventory.txt -c ssh mongodbcreateReplcaSet.yaml, se le presentará una respuesta si el conjunto de réplicas se ha creado o no. Si la clave mongodb_replicaset se devuelve con un valor de éxito y una descripción del conjunto de réplicas que se ha creado, entonces está listo para continuar.

Conclusión

En MongoDB, generalmente es tedioso configurar un conjunto de réplicas para las instancias de mongod que pueden estar alojadas en diferentes máquinas. Sin embargo, Ansible proporciona una plataforma simple para hacer lo mismo simplemente definiendo algunos parámetros como se mencionó anteriormente. La replicación es uno de los procesos que garantiza el funcionamiento continuo de la aplicación, por lo que debe configurarse bien configurando una cantidad múltiple de miembros en el mundo de producción. Se utiliza un árbitro para crear quórum durante el proceso de elección, por lo que debe incluirse en el archivo de configuración definiendo su posición.