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

Cómo entrar en producción con MongoDB:los diez mejores consejos

Después del desarrollo exitoso de la aplicación y antes de dedicarse a la producción de MongoDB, tenga en cuenta estas pautas rápidas para garantizar un flujo fluido y eficiente, así como para lograr un rendimiento óptimo.

1) Opciones de implementación

Selección del hardware adecuado

Para un rendimiento óptimo, es preferible usar SSD en lugar de HDD. Es necesario tener cuidado si su almacenamiento es local o remoto y tomar las medidas correspondientes. Es mejor usar RAID para la protección de defectos de hardware y el esquema de recuperación, pero no confíe completamente en él, ya que no ofrece ninguna protección contra fallas adversas. Para la ejecución en discos, RAID-10 es una buena opción en términos de rendimiento y disponibilidad, que suele faltar en otros niveles de RAID. El hardware adecuado es la piedra angular de su aplicación para optimizar el rendimiento y evitar cualquier debacle importante.

Alojamiento en la nube

Hay disponible una gama de proveedores de nube que ofrecen hosts de base de datos MongoDB preinstalados. La selección de la mejor opción es el paso fundamental para que su aplicación crezca y cause las primeras impresiones en el mercado objetivo. MongoDB Atlas es una de las opciones posibles que ofrece una solución completa para la interfaz de la nube con funciones como la implementación de sus nodos y una instantánea de sus datos almacenados en Amazon S3. ClusterControl es otra buena opción disponible para una fácil implementación y escalado. Lo que ofrece una variedad de características como la fácil adición y eliminación de nodos, el cambio de tamaño de las instancias y la clonación de su clúster de producción. Puedes probar ClusterControl aquí sin que te cobren. Otras opciones disponibles son RackSpace ObjectRocket y MongoStitch.

2) RAM

Los elementos a los que se accede con frecuencia se almacenan en caché en la RAM, de modo que MongoDB pueda proporcionar un tiempo de respuesta óptimo. La memoria RAM generalmente depende de la cantidad de datos que va a almacenar, la cantidad de colecciones y los índices. Asegúrese de tener suficiente RAM para acomodar sus índices; de lo contrario, afectará drásticamente el rendimiento de su aplicación en producción. Más RAM significa menos errores de página y mejor tiempo de respuesta.

3) Indexación

Para las aplicaciones que incluyen solicitudes de escritura crónicas, la indexación juega un papel imperativo. Según los documentos de MongoDB:

“Si una operación de escritura modifica un campo indexado, MongoDB actualiza todos los índices que tienen el campo modificado como clave”

Por lo tanto, tenga cuidado al elegir los índices, ya que puede afectar el rendimiento de su base de datos.

Ejemplo de indexación:entrada de muestra en la base de datos del restaurante

{
  "address": {
     "building": "701",
     "street": "Harley street",
     "zipcode": "71000"
  },
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Bombay Bakery",
  "restaurant_id": "187521"
}
  1. Crear índice en un solo campo

    > db.restaurants.createIndex( { "cuisine": 1 } );
    {
         "createdCollectionAutomatically" : false,
         "numIndexesBefore" : 1,
         "numIndexesAfter" : 2,
         "ok" : 1
    }

    En el ejemplo anterior, se crea un índice de orden ascendente en el campo de cocina.

  2. Creando Índice en Múltiples Campos

    > db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } );
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 2,
            "numIndexesAfter" : 3,
            "ok" : 1
    }

    Aquí se crea un índice compuesto en los campos de cocina y código postal. El número -ve define el orden descendente.

4) Esté preparado para la fragmentación

MongoDB divide los datos en diferentes máquinas mediante un mecanismo conocido como fragmentación. No se recomienda agregar fragmentación al principio, a menos que espere grandes conjuntos de datos. Recuerde que para mantener el rendimiento de su aplicación en línea, necesita una buena clave de fragmentación, de acuerdo con sus patrones de datos, ya que afecta directamente su tiempo de respuesta. El equilibrio de datos entre fragmentos es automático. Sin embargo, es mejor estar preparado y tener un plan adecuado. Para que pueda consolidar cuando su aplicación lo exija.

5) Mejores prácticas para la configuración del sistema operativo

  • Sistema de archivos XFS
    • Es un sistema de archivos de diario de 64 bits altamente escalable y de alto rendimiento. Renueva el rendimiento de E/S al permitir menos operaciones de E/S y más grandes.
  • Poner límite de descriptor de archivo.
  • Deshabilitar las páginas grandes transparentes y la memoria de acceso no uniforme (NUMA).
  • Cambie el tiempo de actividad TCP predeterminado a 300 segundos (para Linux) y 120 segundos (para Azure).

Pruebe estos comandos para cambiar el tiempo de actividad predeterminado;

Para Linux

sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

Para Windows

Escriba este comando en el símbolo del sistema como administrador, donde se expresa en hexadecimal (por ejemplo, 120000 es 0x1d4c0):

reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>

6) Garantizar una alta disponibilidad mediante la replicación

Pasar a producción sin replicación puede causar que su aplicación falle repentinamente. La replicación soluciona el problema si falla un nodo. Administre las operaciones de lectura y escritura para sus instancias secundarias de MongoDB de acuerdo con las necesidades de su aplicación.

Tenga en cuenta estas cosas al replicar:

  • Para una alta disponibilidad, implemente su conjunto de réplicas en un mínimo de tres centros de datos.
  • Asegúrese de que las instancias de MongoDB tengan 0 o 1 votos.
  • Garantice una conectividad de red bidireccional completa entre todas las instancias de MongoDB.

Ejemplo de creación de un conjunto de réplicas con 4 instancias locales de MongoDB:

  1. Creando 4 instancias MongoDB locales

    Primero, cree directorios de datos

    mkdir -p /data/m0
    mkdir -p /data/m1
    mkdir -p /data/m2
    mkdir -p /data/m3
  2. Inicie 4 instancias locales

    mongod --replSet cluster1 --port 27017 --dbpath /data/m0
    mongod --replSet cluster2 --port 27018 --dbpath /data/m1
    mongod --replSet cluster1 --port 27019 --dbpath /data/m2
    mongod --replSet cluster1 --port 27020 --dbpath /data/m3
  3. Agregue las instancias al clúster e inicie

    mongo myhost:34014
    myConfig = {_id: ‘cluster1’, members: [
        {_id: 0, host: ‘myhost1:27017’},
        {_id: 1, host: ‘myhost2:27018’},
        {_id: 2, host: ‘myhost3:27019’},
        {_id: 3, host: ‘myhost4:27020’}]
    }
    rs.initiate(myConfig);

Medidas de Seguridad

7) Máquinas seguras

Los puertos abiertos en máquinas que alojan MongoDB son vulnerables a varios ataques maliciosos. Más de 30 000 bases de datos de MongoDB se vieron comprometidas en un ataque de ransomware debido a un retraso en la configuración de seguridad adecuada. Mientras continúa la producción, cierre los puertos públicos del servidor MongoDB. Sin embargo, debe mantener un puerto abierto para SSh.

Habilitación de la autenticación en la instancia de MongoDB:

  1. Inicie el archivo mongod.conf en su editor favorito.

  2. Agregue estas líneas al final del archivo de configuración.

    security:
          authorization: enabled
  3. Agregue estas líneas al final del archivo de configuración.

    service mongod restart
  4. Confirmar el estado

    service mongod status

Restringir el acceso externo

Abra el archivo mongod.conf de nuevo para establecer direcciones IP limitadas para acceder a su servidor.

bind_ip=127.0.0.1

Al agregar esta línea, significa que solo puede acceder a su servidor a través de 127.0.0. (que es host local). También puede agregar varias direcciones IP en la opción de vinculación.

bind_ip=127.0.0.1,168.21.200.200

Significa que puede acceder desde localhost y su red privada.

8) Protección con contraseña

Para agregar una capa de seguridad adicional a sus máquinas, habilite el control de acceso y haga cumplir la autenticación. A pesar de que ha restringido el servidor MongoDB para que acepte conexiones del mundo exterior, todavía existe la posibilidad de que algún script malicioso ingrese a su servidor. Por lo tanto, no dude en establecer un nombre de usuario/contraseña para su base de datos y asignar los permisos necesarios. El control de acceso habilitado permitirá a los usuarios solo realizar acciones determinadas por sus funciones.

Estos son los pasos para crear un usuario y asignar acceso a la base de datos con roles específicos.

En primer lugar, crearemos un usuario (en este caso, es administrador) para administrar todos los usuarios y bases de datos y luego crearemos un propietario de base de datos específico que solo tendrá privilegios de lectura y escritura en una instancia de base de datos MongoDB.

Cree un usuario administrador para administrar otros usuarios para instancias de base de datos

  1. Abra su shell de Mongo y cambie a la base de datos de administración:

    use admin
  2. Crear un usuario para la base de datos de administración

    db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
  3. Autenticar usuario recién creado

    db.auth("admin", "admin_password")
  4. Creando un usuario de instancia específico:

    use database_1
    db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
  5. Ahora verifique si un usuario se ha creado correctamente o no.

    db.auth("user_1", "your_password")
    show collections

¡Eso es todo! Ha asegurado con éxito las instancias de su base de datos con la autenticación adecuada. Puede agregar tantos usuarios como desee siguiendo el mismo procedimiento.

9) Cifrado y Protección de Datos

Si está utilizando Wiredtiger como motor de almacenamiento, puede usar su configuración de cifrado en reposo para cifrar sus datos. De lo contrario, el cifrado debe realizarse en el host mediante un sistema de archivos, dispositivos o cifrado físico.

10) Supervise su implementación

Una vez que haya terminado la implementación de MongoDB en producción, debe realizar un seguimiento de la actividad de rendimiento para evitar posibles problemas tempranos. Existe una variedad de estrategias que puede adaptar para monitorear el rendimiento de sus datos en el entorno de producción.

  • MongoDB incluye utilidades, que devuelven estadísticas sobre el rendimiento y la actividad de la instancia. Las utilidades se utilizan para identificar problemas y analizar las operaciones normales.

  • Use mongostat para comprender la disposición de los tipos de operaciones y la planificación de la capacidad.

  • Para el seguimiento de informes y actividades de lectura y escritura, se recomienda mongotop.

mongotop 15

Este comando devolverá la salida cada 15 segundos.

                     ns    total    read    write          2018-04-22T15:32:01-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms     
                     ns    total    read    write          2018-04-22T15:32:16-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms

MongoDB Monitoring Service (MMS) es otra opción disponible que monitorea su clúster de MongoDB y hace que sea conveniente para usted tener una vista de las actividades de implementación de producción.

Y por supuesto está ClusterControl de Variousnines, el sistema de automatización y gestión de bases de datos de código abierto. ClusterControl permite una fácil implementación de clústeres con configuraciones de seguridad automatizadas y simplifica la resolución de problemas de su base de datos al proporcionar una automatización de administración fácil de usar que incluye reparación y recuperación de nodos dañados, actualizaciones automáticas y más. Puede comenzar con su Community Edition (gratis para siempre), con la que puede implementar y monitorear MongoDB, así como crear asesores personalizados para ajustar sus esfuerzos de monitoreo a aquellos aspectos que son específicos de su configuración. Descárgalo gratis aquí.