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

Implementación y configuración de fragmentos de MongoDB con Ansible

Los sistemas de bases de datos funcionan mejor cuando hay una carga de trabajo distribuida entre varias instancias en ejecución o, más bien, los datos se clasifican de manera sencilla. MongoDB utiliza fragmentación de modo que los datos en una base de datos determinada se agrupan de acuerdo con alguna clave. La fragmentación mejora el escalado horizontal, lo que en consecuencia da como resultado un mejor rendimiento y una mayor confiabilidad. En general, MongoDB ofrece escalado horizontal y vertical a diferencia de SQL DBMS, por ejemplo MySQL, que solo promueve el escalado vertical.

MongoDB tiene un modelo de consistencia menos estricto en el que un documento de una colección puede tener una clave adicional que estaría ausente en otros documentos de la misma colección.

fragmentación

La fragmentación consiste básicamente en particionar datos en fragmentos separados y luego definir un rango de fragmentos en diferentes servidores de fragmentos. Para agrupar los datos, se utiliza una clave de partición, que suele ser un campo que está presente en todos los documentos de la base de datos que se van a fragmentar. La fragmentación funciona de la mano con la replicación para acelerar el rendimiento de lectura al garantizar una carga de trabajo distribuida entre varios servidores en lugar de depender de un solo servidor. Además, la replicación garantiza la disponibilidad de copias de los datos escritos.

Digamos que tenemos 120 documentos en una colección, estos datos se pueden fragmentar de modo que tengamos 3 conjuntos de réplicas y cada uno tenga 40 documentos, como se muestra en la configuración de configuración a continuación. Si dos clientes envían solicitudes, una para obtener un documento que está en el índice 35 y la otra cuyo índice está en el 92, la solicitud es recibida por el enrutador de consulta (un proceso mongos) que a su vez contacta al nodo de configuración que mantiene un registro de cómo se distribuyen los rangos de fragmentos entre los fragmentos. Cuando se encuentra la identidad del documento especificado, se obtiene del fragmento asociado. Por ejemplo, el documento del primer cliente se obtendrá del Fragmento A y para el cliente B, el documento se obtendrá del Fragmento C. En general, habrá una carga de trabajo distribuida que se define como escalado horizontal.

Para los fragmentos dados, si el tamaño de una colección en un fragmento excede el tamaño de fragmento, la colección se dividirá y equilibrará entre los fragmentos automáticamente usando la clave de fragmento definida. En la configuración de la implementación, para el siguiente ejemplo, necesitaremos 3 conjuntos de réplicas, cada uno con una principal y algunas secundarias. Los nodos primarios también actúan como servidores de fragmentación.

La configuración mínima recomendada para una implementación de producción de MongoDB será de al menos tres servidores de fragmentos, cada uno con un conjunto de réplicas. Para obtener el mejor rendimiento, los servidores mongos se implementan en servidores independientes, mientras que los nodos de configuración se integran con los fragmentos.

Implementación de fragmentos de MongoDB con Ansible

Configurar fragmentos y conjuntos de réplicas de un clúster por separado es una tarea engorrosa, por lo que nos convertimos en herramientas simples como Ansible para lograr los resultados requeridos con mucha facilidad. Los playbooks se utilizan para escribir las configuraciones y tareas necesarias que ejecutará el software de Ansible.

El proceso sistemático del libro de jugadas debe ser:

  1. Instale los paquetes base de mongo (interfaz sin servidor, pymongo y de línea de comandos)
  2. Instale el servidor mongodb. Siga esta guía para comenzar.
  3. Configure instancias de mongod y sus correspondientes conjuntos de réplicas.
  4. Configurar y configurar los servidores de configuración
  5. Configurar y configurar el servicio de enrutamiento de Mongos.
  6. Agregue los fragmentos a su clúster.

El libro de jugadas de nivel superior debería verse así

- name: install mongo base packages include: mongod.yml
  tags: - mongod

- name: configure config server
  include: configServer.yml
  when: inventory_hostname in groups['mongoc-servers'] 
  tags:
  - cs

- name: configure mongos server
  include: configMongos.yml
  when: inventory_hostname in groups['mongos-server'] tags:
  - mongos

- name: add shards
  include: addShards.yml
  when: inventory_hostname in groups['mongos-servers'] 
  tags:
  - mongos
  - shards

Podemos guardar el archivo anterior como mongodbCluster.yml.

Varios nueves Conviértase en un administrador de bases de datos de MongoDB - Llevando MongoDB a la producción Obtenga información sobre lo que necesita saber para implementar, monitorear, administrar y escalar MongoDBDescargar gratis

Un archivo mongodb.yml simple se verá así:

---
- hosts: ansible-test
  remote_user: root
  become: yes
  tasks:
  - name: Import the public key used by the package management system
    apt_key: keyserver=hkp://keyserver.ubuntu.com:80 id=7F0CEB10 state=present
  - name: Add MongoDB repository
    apt_repository: repo='deb <a class="vglnk" href="https://downloads-distro.mongodb.org/repo/ubuntu-upstart" rel="nofollow"><span>http</span><span>://</span><span>downloads</span><span>-</span><span>distro</span><span>.</span><span>mongodb</span><span>.</span><span>org</span><span>/</span><span>repo</span><span>/</span><span>ubuntu</span><span>-</span><span>upstart</span></a> dist 10gen' state=present
  - name: install mongodb
    apt: pkg=mongodb-org state=latest update_cache=yes
    notify:
    - start mongodb
  handlers:
    - name: start mongodb
      service: name=mongod state=started

A los parámetros generales requeridos en la implementación de un conjunto de réplicas, necesitamos estos dos más para agregar los fragmentos.

  • fragmento: de forma predeterminada, es nulo. Esta es una cadena de conexión de fragmento que debe tener el formato /host:port. Por ejemplo, replica0/siteurl1.com:27017
  • estado: de forma predeterminada, el valor está presente, lo que dicta que el fragmento debe estar presente; de ​​lo contrario, se puede establecer que esté ausente.

Después de implementar un conjunto de réplicas como se explica en este blog, puede proceder a agregar los fragmentos.

# add a replicaset shard named replica0 with a member running on port 27017 on mongodb0.example.net
- mongodb_shard:
    login_user: admin
    login_password: root
    shard: "replica0/mongodb1.example.net:27017"
    state: present

# add a standalone mongod shard running on port 27018 of mongodb2.example.net
- mongodb_shard:
    login_user: admin
    login_password: root
    shard: "mongodb2.example.net:27018"
    state: present

# Single node shard running on localhost
- name: Ensure shard replica0 exists
  mongodb_shard:
    login_user: admin
    login_password: root
    shard: "replica0/localhost:3001"
    state: present

# Single node shard running on localhost
- name: Ensure shard replica0 exists
  mongodb_shard:
    login_user: admin
    login_password: root
    shard: "replica0/localhost:3002"
    state: present

Después de configurar todas estas configuraciones, ejecutamos el libro de jugadas con el comando

ansible-playbook -i hosts mongodbCluster.yml

Una vez que se completa el libro de jugadas, podemos iniciar sesión en cualquiera de los servidores mongos y ejecutar el comando sh.status(). Si la salida es similar a la siguiente, los fragmentos se han implementado. Además puedes ver la clave mongodb_shard si ha sido valorada como exitosa.

mongos> sh.status()
    --- Sharding Status --- 
      sharding version: { "_id" : 1, "version" : 3 }
      shards:
        {  "_id" : "shardA",  "host" : "locahhost1/web2:2017,locahhost3:2017" }
        {  "_id" : "shardB",  "host" : "locahhost3/web2:2018,locahhost3:2019" }
{  "_id" : "shardC",  "host" : "locahhost3/web2:2019,locahhost3:2019" }

    databases:
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

Para eliminar un fragmento llamado replica0

- mongodb_shard:
    login_user: admin
    login_password: root
    shard: replica0
    state: absent

Conclusión

Ansible ha jugado un papel importante para facilitar el proceso de implementación, ya que solo necesitamos definir las tareas que deben ejecutarse. Imagine, por ejemplo, si tuviera 40 miembros del conjunto de réplicas y necesita agregar fragmentos a cada uno. Ir de la manera normal le llevará años y es propenso a muchos errores humanos. Con ansible, simplemente define estas tareas en un archivo simple llamado libro de jugadas y ansible se encargará de las tareas cuando se ejecute el archivo.