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

Una guía para desarrolladores sobre la fragmentación de MongoDB

Un crecimiento masivo de datos viene con un costo de operaciones de rendimiento reducido, especialmente cuando son atendidos por un solo servidor. Sin embargo, puede mejorar este rendimiento aumentando la cantidad de servidores y también distribuyendo sus datos en varios números de estos servidores. En este artículo, conjuntos de réplicas en MongoDB, discutimos en detalle cómo se pueden mejorar las operaciones de rendimiento además de garantizar una alta disponibilidad de datos. Este proceso no se puede lograr por completo sin mencionar Sharding en MongoDB.

¿Qué es la fragmentación en MongoDB

MongoDB está diseñado de manera flexible, de modo que es escalable para ejecutarlo en un clúster en una plataforma distribuida. En esta plataforma, los datos se distribuyen en varios servidores para su almacenamiento. Este proceso es lo que se denomina fragmentación. Si un solo servidor está sujeto a una gran cantidad de datos para el almacenamiento, es posible que se quede sin espacio de almacenamiento. Además, las operaciones de rendimiento muy críticas, como la lectura y la escritura, pueden verse afectadas en gran medida. La función de escalado horizontal en MongoDB nos permite distribuir datos entre varias máquinas con el resultado final de mejorar el equilibrio de carga.

Fragmentos de MongoDB

Se puede considerar que un fragmento es un conjunto de réplicas que aloja algún subconjunto de datos utilizado en un clúster fragmentado. Para una instancia determinada de mongod con algún conjunto de datos, los datos se dividen y distribuyen en varias bases de datos, en este caso fragmentos. Básicamente, varios fragmentos diferentes sirven como bases de datos independientes, pero en conjunto forman una base de datos lógica. Los fragmentos reducen la carga de trabajo que debe realizar toda la base de datos al reducir la cantidad de operaciones que debe manejar un fragmento además de la menor cantidad de datos que alojará este fragmento. Esta métrica da espacio para la expansión de un clúster horizontalmente. A continuación se muestra una arquitectura simple de fragmentación.

Los datos enviados desde una aplicación cliente son interceptados por los controladores del servidor y luego se envían al enrutador. Luego, el enrutador consultará las configuraciones del servidor para determinar dónde aplicar la operación de lectura o escritura en los servidores de fragmentos. En pocas palabras, para una operación como escribir, tiene algún índice que dictará qué fragmento es el registro que será el host. Digamos que una base de datos tiene una capacidad de datos de 1 TB distribuida en 4 fragmentos, cada fragmento contendrá 256 GB de estos datos. Con una cantidad reducida de datos que puede manejar un fragmento, las operaciones se pueden realizar bastante rápido. Debería considerar usar el clúster fragmentado en su base de datos cuando:

  1. Espera que la cantidad de datos supere su capacidad de almacenamiento de instancia única en el futuro.
  2. Si la única instancia de MongodB no puede realizar las operaciones de escritura
  3. Se queda sin RAM de memoria de acceso aleatorio a expensas del aumento del tamaño del conjunto de trabajo activo.

La fragmentación viene con una mayor complejidad en la arquitectura además de recursos adicionales. Sin embargo, es recomendable fragmentar en las primeras etapas antes de que sus datos crezcan demasiado, ya que es bastante tedioso hacerlo cuando sus datos están más allá de su capacidad.

Clave de fragmento de MongoDB

Como todos sabemos, un documento en MongoDB tiene campos para almacenar valores. Cuando esté implementando una fragmentación, se le pedirá que seleccione un campo de una colección que usará para dividir los datos. Este campo que seleccionó es la clave de fragmento que determina cómo dividirá los documentos de la colección en varios fragmentos. En un ejemplo simple, sus datos pueden tener nombres de campo para estudiantes, maestros de clase y calificaciones. Puede decidir que un conjunto de fragmentos contenga los documentos con el alumno índice, otro maestro y las calificaciones. Sin embargo, es posible que necesite que sus datos se distribuyan aleatoriamente, por lo tanto, use una clave fragmentada con hash. Existe una gama de claves de fragmentos que se utilizan para dividir datos además de la clave de fragmentos hash, pero las dos categorías principales son campos indexados y campos compuestos indexados.

Elegir una clave fragmentada

Para una mejor funcionalidad, capacidad y rendimiento de la estrategia de fragmentación, deberá seleccionar la clave fragmentada adecuada. Los criterios de selección dependen de 2 factores:

  1. Estructura de esquema de sus datos. Podemos por ejemplo considerar un campo cuyo valor puede ser creciente o decreciente (cambiando monótonamente). Lo más probable es que esto influya en una distribución de inserciones en un solo fragmento dentro de un clúster.
  2. Cómo se presentan sus configuraciones de consulta para realizar operaciones de escritura.

¿Qué es una clave fragmentada con hash?

Esto utiliza un índice hash de un solo campo como clave de partición. Un índice hash es un índice que mantiene entradas con hash de los valores de un campo indexado. Es decir,

{
    "_id" :"5b85117af532da651cc912cd"
}

Para crear un índice hash, puede usar este comando en el shell de mongo.

db.collection.createIndex( { _id: hashedValue } )

Donde la variable hashValue representa una cadena de su valor hash especificado. La fragmentación con hash promueve una distribución uniforme de los datos en un clúster fragmentado, lo que reduce las operaciones de destino. Sin embargo, es poco probable que los documentos con casi las mismas claves de fragmento estén en el mismo fragmento, por lo que se requiere una instancia de mongo para realizar una operación de transmisión para satisfacer un criterio de consulta determinado.

Clave de fragmento basada en rango

En esta categoría, el conjunto de datos se divide en función de los rangos de valores de una clave de campo elegida, por lo tanto, un rango alto de particiones. Es decir. si tiene una clave numérica cuyos valores van desde infinito negativo hasta infinito positivo, cada clave fragmentada caerá en cierto punto dentro de esa línea. Esta línea se divide en fragmentos y cada fragmento tiene un cierto rango de valores. Precisamente, aquellos documentos con una clave de fragmento casi similar se alojan en el mismo fragmento. La ventaja de esta técnica es que admite una variedad de consultas, ya que el enrutador seleccionará el fragmento con el fragmento específico.

Características de una clave fragmentada óptima

  1. Una clave de fragmento ideal debería poder apuntar a un solo fragmento para mejorar un programa mongos para devolver operaciones de consulta desde una sola instancia de mongod. La clave es el campo primario que caracteriza esto. Es decir. no en un documento incrustado.
  2. Tener un alto grado de aleatoriedad. Es decir, el campo debería estar disponible en la mayoría de los documentos. Esto garantizará que las operaciones de escritura se distribuyan dentro de un fragmento.
  3. Ser fácilmente divisible. Con una clave de fragmento fácilmente divisible, hay una mayor distribución de datos, por lo tanto, más fragmentos.
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

Componentes de una implementación de clúster de producción

Con respecto a la arquitectura que se muestra arriba, el clúster de fragmentos de producción debe tener:

  • Enrutadores Mongos/Query. Estas son instancias de mongo que actúan como un servidor entre los controladores de la aplicación y la propia base de datos. En la implementación, el equilibrador de carga se configura para habilitar la conexión desde un solo cliente para llegar a los mismos mongos.
  • Fragmentos. Estas son las particiones en las que se alojan los documentos que comparten la misma definición de clave de fragmento. Debe tener al menos 2 para aumentar la disponibilidad de datos.
  • Servidores de configuración:puede tener 3 servidores de configuración separados en diferentes máquinas o un grupo de ellos si va a tener varios clústeres fragmentados.

Implementación de un clúster fragmentado

Los siguientes pasos le darán una dirección clara para implementar su clúster fragmentado.

  1. Creación de host para los servidores de configuración. De forma predeterminada, los archivos del servidor están disponibles en el directorio /data/configdb, pero siempre puede configurarlo en su directorio preferido. El comando para crear el directorio de datos es:

    $ mkdir /data/configdb
  2. Inicie los servidores de configuración definiendo el puerto y la ruta del archivo para cada uno usando el comando

    $ mongod --configsvr --dbpath /data/config --port 27018

    Este comando iniciará el archivo de configuración en el directorio de datos con el nombre config en el puerto 27018. De forma predeterminada, todos los servidores MongoDB se ejecutan en el puerto 27017.

  3. Inicie una instancia de mongos usando la sintaxis:

    $ mongo --host hostAddress --port 27018.

    La variable hostAddress tendrá el valor del nombre de host o la dirección IP de su host.

  4. Inicie mongod en el servidor de fragmentos e inícielo usando el comando:

    mongod --shardsvr --replSet
    rs.initiate()
  5. Inicie sus mongos en el enrutador con el comando:

    mongos --configdb rs/mongoconfig:27018
  6. Agregar fragmentos a su clúster. Digamos que tenemos el puerto predeterminado 27017 como nuestro clúster, podemos agregar un fragmento en el puerto 27018 como este:

    mongo --host mongomaster --port 27017
    sh.addShard( "rs/mongoshard:27018")
    { "shardAdded" : "rs", "ok" : 1 }
  7. Habilite la fragmentación para la base de datos usando el nombre del fragmento con el comando:

    sh.enableSharding(shardname)
    { "ok" : 1 }

    Puede verificar el estado del fragmento con el comando:

    sh.status()

    Se le presentará esta información

    sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("59f425f12fdbabb0daflfa82")
    }
    shards:
    { "_id" : "rs", "host" : "rs/mongoshard:27018", "state" : 1 }
    active mongoses:
    "3.4.10" : 1
    autosplit:
    Currently enabled: yes
    balancer:
    Currently enabled: yes
    Currently running: no
    NaN
    Failed balancer rounds in last 5 attempts: 0
    Migration Results for the last 24 hours:
    No recent migrations
    databases:
    { "_id" : shardname, "primary" : "rs", "partitioned" : true }

Equilibrio de fragmentos

Después de agregar un fragmento a un clúster, es posible que observe que algunos fragmentos aún pueden alojar más datos que otros y, para ser más secante, el nuevo fragmento no tendrá datos. Por lo tanto, debe realizar algunas verificaciones de antecedentes para garantizar el equilibrio de carga. El equilibrio es la base por la cual los datos se redistribuyen en un clúster. El equilibrador detectará una distribución desigual, por lo tanto, migrará fragmentos de un fragmento a otro hasta que se alcance un quórum de equilibrio.

El proceso de equilibrio consume mucho ancho de banda además de los gastos generales de la carga de trabajo y esto afectará el funcionamiento de su base de datos. Un mejor proceso de equilibrio implica:

  • Mover un solo fragmento a la vez.
  • Haga el balance cuando se alcanza el umbral de migraciones, es decir, cuando la diferencia entre el número más bajo de fragmentos para una colección determinada y el número más alto de fragmentos en la colección fragmentada.