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

Lo que debe saber cuando comience a trabajar con MongoDB en producción:diez consejos

Aprender MongoDB requiere mucho pensamiento preciso. A menudo, no se presta mucha atención a las tareas esenciales que, de otro modo, podrían poner en peligro el rendimiento de la base de datos en el modo de producción.

MongoDB es un DBMS NoSQL que literalmente sigue un patrón diferente al de las bases de datos SQL, especialmente en lo que se refiere a seguridad y estructura. Aunque algunas de las funciones integradas promueven su rendimiento y lo convierten en uno de los mejores de los últimos tiempos, algunas de las funciones plantean amenazas potenciales que pueden arruinar su rendimiento si no se tienen en cuenta.

En una experiencia reciente en el "peor de los casos", estaba tratando de consultar una colección con documentos que tenían matrices grandes y me tomó mucho tiempo recuperar los resultados. Decidí escribir este blog porque sabía que si alguien experimenta estos mismos problemas, este blog será de gran ayuda.

Consideraciones clave para MongoDB en producción

  1. Seguridad y autenticación.
  2. Indización de sus documentos
  3. Usar un esquema en sus colecciones
  4. Colección limitada
  5. Tamaño del documento
  6. Tamaño de matriz para documentos incrustados
  7. Etapas de canalización de agregación
  8. Orden de claves en objeto hash
  9. 'indefinido' y 'nulo' en MongoDB
  10. Operación de escritura

Seguridad y autenticación de MongoDB

Los datos varían de muchas maneras y, obviamente, deberá mantener la confidencialidad de cierta información. De forma predeterminada, las instalaciones de MongoDB no establecen el requisito de autenticación como obligatorio, pero eso no le permite usarlo, especialmente cuando se trata de datos confidenciales, como registros financieros y médicos. En una estación de trabajo de desarrollo, no es gran cosa, pero debido a la participación de múltiples usuarios en el modo de producción, es una buena práctica establecer los certificados de autenticación. El método más común y fácil de usar son las credenciales predeterminadas de nombre de usuario y contraseña de MongoDB.

Los datos se escriben en archivos a los que se puede acceder a través de una herramienta de terceros, más aún si no están encriptados. Los datos pueden modificarse sin su conocimiento si alguna persona anónima obtiene acceso a los archivos del sistema. Alojar la base de datos en un servidor dedicado y asignar un solo usuario que tendrá acceso total a los archivos de datos le ahorrará el truco.

La protección de datos contra ataques de inyección externa también es una tarea esencial. Algunos operadores como $group, $whereby y las operaciones mapReduce están desarrollados en javascript (js), por lo que son propensos a la manipulación de js. Para evitar cualquier instancia de integridad de datos como resultado, puede deshabilitar la configuración arbitraria de JS configurando el parámetro javascriptEnabled:false en el archivo de configuración si no ha utilizado ninguno de los operadores mencionados. Además, puede reducir el riesgo de acceso a los datos a través de infracciones de la red empleando algunos de los procedimientos destacados en la Lista de verificación de seguridad de MongoDB.

Indización de sus documentos

La indexación generalmente asigna un valor de identificación único a cada documento en una colección de MongoDB. La indexación genera una mejora del rendimiento tanto en operaciones de lectura como de escritura. De forma predeterminada, está habilitado y siempre se debe mantener esa configuración. Sin la indexación, la base de datos tiene que revisar varios documentos desde el principio hasta el final y, lamentablemente, la operación requerirá mucho tiempo para los documentos que están hacia el final, lo que generará una latencia deficiente para la consulta. En algún momento, al final de la aplicación, los usuarios pueden experimentar un retraso y pueden pensar que la aplicación en realidad no funciona. La indexación es útil en las operaciones de consulta de clasificación y búsqueda sin dejar de lado la operación de búsqueda en sí. La clasificación es una operación común para muchos documentos devueltos. A menudo se lleva a cabo como la etapa final después de que se hayan filtrado los documentos, por lo que es necesario clasificar una pequeña cantidad de datos. En este caso, un índice ayudará a clasificar los datos según la naturaleza de la entrada y restringirá los datos devueltos a un límite de 32 MB. Si no hay indexación, se excederán las posibilidades de que se supere el límite de memoria de 32 en el tamaño combinado de los documentos devueltos y cada vez que la base de datos alcance este límite, arrojará un error además de devolver un conjunto de registros vacío.

La operación

$lookup también es compatible con la indexación en su lugar. Un índice sobre el valor de la clave utilizada como clave externa es esencial para el procesamiento de las etapas anteriores.

Uso de un esquema en sus colecciones

MongoDB no necesita uno para definir campos (columnas) tal como puede requerir que lo haga para SQL dbms. Por mucho que no necesite definir los campos, para evitar inconsistencias en los datos y algunos contratiempos que puedan surgir, definir un esquema siempre es una buena práctica. El diseño del esquema le permite determinar qué tipo de datos van a un determinado campo, qué campo debe proporcionarse con un valor y, en general, mejorar la validación de datos antes de ingresarlos o actualizarlos, promoviendo así la integridad y consistencia de los datos. Un diseño de esquema también le indicará si debe hacer referencia o incrustar datos. Como principiante, puede pensar que el único modelo será "Uno a N" que facilitará tener entradas de matriz de subdocumento, pero ese no es el caso.

Debe comprender la relación de cardinalidad entre los documentos antes de crear su modelo. Algunas de las reglas que te ayudarán a tener un esquema óptimo son:

  1. Para reducir la cantidad de consultas que deberá ejecutar antes de acceder a algunos datos y si hay pocos campos o elementos de matriz involucrados, puede incrustar subdocumentos. Tome un ejemplo del siguiente modelo:
    1. {
       Name: ‘John Doh’,
       Age:20
       Addresses:[
         {street: ‘Moi Avenue’, city:’Nairobi’, countryCode: ‘KE’},
         {street: ‘Kenyatta Avenue’, city:’Nairobi’, countryCode: ‘KE’},
       ]
      }
      
  2. Para documentos que se actualizan con frecuencia, utilice la desnormalización . Si algún campo se va a actualizar con frecuencia, entonces existirá la tarea de encontrar todas las instancias que deben actualizarse. Esto dará como resultado un procesamiento de consultas lento, por lo tanto, abrumará incluso los méritos asociados con la desnormalización.
  3. Las consultas complejas, como la canalización agregada, tardan más en ejecutarse cuando hay muchos subdocumentos involucrados y es necesario obtener un documento por separado.
  4. Los elementos de matriz con un gran conjunto de datos de objetos no deben incrustarse obviamente debido al hecho de que pueden crecer y, en consecuencia, exceder el tamaño del documento.

El modelado de un esquema suele estar determinado por el patrón de acceso a la aplicación. Puede encontrar más procedimientos que pueden ayudar en el diseño de su modelo en el blog 6 Reglas generales para el diseño de esquemas de MongoDB

Usar una colección limitada para la prioridad de documentos recientes

MongoDB proporciona una gran cantidad de recursos, como la colección limitada. Desafortunadamente, algunos terminan sin ser utilizados. Una colección limitada tiene un tamaño fijo y se sabe que admite operaciones de alto rendimiento que insertan y recuperan documentos según el orden de inserción. Cuando se llena su espacio, los documentos antiguos se eliminan para dejar espacio para los nuevos.

Ejemplo de caso de uso de colección limitada:

  • Almacenamiento en caché de los datos a los que se accede con frecuencia, ya que la colección en sí requiere mucha lectura en lugar de mucha escritura. Debe asegurarse de que la colección esté siempre en funcionamiento.
  • Información de registro para sistemas de alto volumen. La colección limitada a menudo no usa un índice y esto es ventajoso porque la velocidad de grabación es bastante rápida, como escribir en un archivo.

Preste atención al tamaño del documento MongoDB

Cada documento MongoDB está limitado a un tamaño de 16 megabytes. Sin embargo, es óptimo que el documento alcance o se acerque a este límite, ya que planteará algunos problemas de rendimiento atroces. MongoDB en sí funciona mejor cuando el tamaño de los documentos es de unos pocos kilobytes. Si el documento es lo suficientemente grande, una solicitud de proyección compleja llevará mucho tiempo y la consulta puede agotarse.

Preste atención al tamaño de la matriz de documentos incrustados

Uno puede enviar subdocumentos a un campo en un documento creando así un valor de matriz en este campo. Como se mencionó anteriormente, debe mantener bajo el tamaño de los subdocumentos. Es igualmente importante asegurarse de que la cantidad de elementos de la matriz sea inferior a cuatro cifras. De lo contrario, el documento crecerá más allá de su tamaño y deberá reubicarse en el disco. Otro problema asociado con una operación de este tipo es que será necesario volver a indexar todos los documentos. Además, cada subdocumento deberá volver a indexarse ​​igualmente. Esto significa que habrá muchas escrituras de índice que darán como resultado operaciones lentas. Para subdocumentos de gran tamaño, es bastante importante mantener los registros en una nueva colección en lugar de incrustarlos.

Etapas de canalización de agregación 

Además de las operaciones de consulta normales de MongoDB, existe un marco de agregación que se utiliza para manipular y devolver datos de acuerdo con algunas especificaciones, como ordenar y agrupar. MongoDB no tiene un optimizador de consultas, por lo tanto, necesita uno para ordenar las consultas de manera adecuada. Con el marco de agregación, asegúrese de que las etapas de canalización estén bien ordenadas. Comience por reducir la cantidad de datos que maneja usando el operador $match y posiblemente $sort al final si necesita ordenar. Puede usar herramientas de terceros como Studio 3T para optimizar su consulta de agregación antes de integrarla en su código. La herramienta le permite ver la entrada y salida de datos en cualquiera de las etapas, por lo que sabe a qué se enfrenta.

Usar $limit y $sort debería dar siempre los mismos resultados cada vez que se ejecuta la consulta. En caso de que use $limit, los datos devueltos no serán deterministas y pueden generar algunos problemas que son difíciles de rastrear.

Comprobar el orden de las claves en objetos hash

Considere tener dos documentos grandes con datos de muestra 

{

   FirstName: ‘John’,

   LastName: ‘Doh’

}

Si realiza una operación de búsqueda con la consulta {FirstName:'John', LastName:'Doh'}, la operación no coincide con la consulta {LastName:'Doh' FirstName:'John' }. Por lo tanto, debe mantener el orden de los pares de nombre y valor en sus documentos.

Evite 'indefinido' y 'nulo' en MongoDB

MongoDB usa el formato BSON para sus documentos. Con la validación JSON, 'indefinido' no es compatible y debe evitar usarlo. $null viene como una solución, pero también debes evitarlo.

Considerar operaciones de escritura

Puede configurar MongoDB para escrituras de alta velocidad, pero esto representa un contratiempo en el sentido de que se devuelve una respuesta incluso antes de que se escriban los datos. El diario debe estar habilitado para evitar este escenario. Además, en el caso de que se rompa la base de datos, los datos seguirán estando disponibles y crearán un punto de control que se puede utilizar en el proceso de recuperación. La configuración de la duración de las escrituras del diario se puede establecer mediante el parámetro commitIntervalMs.

Conclusión

El sistema de base de datos debe garantizar la integridad y consistencia de los datos además de ser resistente a fallas y malicia. Sin embargo, para llegar a estos factores, es necesario comprender la base de datos en sí y los datos que contiene. MongoDB funcionará bien cuando se tengan en cuenta los factores mencionados anteriormente. Lo más importante de ellos es usar un esquema. Un esquema le permite validar sus datos antes de ingresarlos o actualizarlos y cómo modelará estos datos. El modelado de datos suele estar impulsado por el patrón de accesibilidad de la aplicación. Todos estos sumados ofrecerán un mejor rendimiento de la base de datos.