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

MongoDB autohospedado

Probablemente esté alojando su MongoDB en un proveedor de servicios en la nube confiable, digamos Atlas, por ejemplo, porque realmente quiere concentrarse en su idea y delegar todas las áreas sutiles de administración clave, como redes, almacenamiento, acceso, etc.

Todo se ve bien inicialmente hasta que su pequeña idea comienza a convertirse en un negocio y el costo comienza a dispararse. Incluso si ese no es el caso, esta publicación le brindará una descripción general de las complejidades técnicas involucradas (¡y dinero ahorrado!) si tuviera que migrar a una solución autohospedada.

Por cierto, ¿de cuánto ahorro estamos hablando? Hagamos una comparación rápida entre un Atlas instancia y un MongoDB autohospedado en AWS .

Atlas (~$166/mes)

$0.23/hora según los requisitos seleccionados anteriormente (~ cloud.mongodb.com)



AWS (~$36/mes)

0,0416 USD/hora por la instancia y precios adicionales según el tipo de EBS y el almacenamiento (~calculador.aws)

¡Es un ahorro de casi 4,5 veces solo en términos de infraestructura!

Ahora que conoce los principales motivos y todavía está leyendo esta publicación, sin más preámbulos, profundicemos en la tecnología.

Esquema

  1. Configuración de la infraestructura
  2. Configuración de MongoDB
  3. Migración masiva
  4. Delta-sync para puentear la latencia del interruptor de conexión (no aplicable a clústeres obsoletos)

Dado que todo el contenido puede ser un poco agotador en un solo lugar, lo dividiré en 2 publicaciones relacionadas.

1. Configuración de la infraestructura

Voy a mencionar a continuación la guía para configurar una instancia que ejecute RedHat Enterprise Linux 8 en AWS. Esto se debe a que MongoDB generalmente funciona mejor con el sistema de archivos xfs. Aquí hay un artículo para entenderlo mejor.

activar una instancia EC2

He usado un t3.small instancia que viene con 2 vCPU y 2 Gb de RAM aunque puede seleccionar cualquier instancia de su elección.

Se recomienda que su base de datos tenga acceso a al menos 1 GB de RAM y 2 núcleos reales ya que eso afecta directamente el rendimiento durante el almacenamiento en caché y los mecanismos de concurrencia como lo maneja el motor predeterminado WiredTiger . Puede leer más sobre las notas de producción relacionadas con los requisitos de RAM y CPU aquí .

Descripción general de la configuración:

  • SO:Redhat Enterprise Linux 8 (basado en Intel x64)
  • Tipo de instancia:t3.small
  • Almacenamiento:10 GB (so) + 30 GB (datos) + 3 GB (registros) de EBS es decir, 3 volúmenes separados

Supongo que está familiarizado con la creación de una máquina virtual en AWS.

Ahora, una vez que la instancia esté en estado de ejecución, asigne una IP elástica y luego simplemente haga un inicio de sesión remoto en la máquina.

Necesitaremos la IP elástica para configurar el nombre de host público para la instancia

$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>

Montar volúmenes adicionales

Hemos agregado 2 volúmenes de EBS adicionales además del FS raíz para datos y registros que aún no se han montado (¿Recuerda los 30 Gb y 3 Gb? ). Puede listar los bloques de volumen usando,

$ sudo lsblk

Los volúmenes adicionales se enumerarán justo después del bloque raíz (consulte las flechas)

En la imagen de arriba, puede ver que los volúmenes adicionales se nombran

  1. xvdb (30 Gb de espacio para almacenar datos)
  2. xvcc (3 Gb de espacio para almacenar registros)

Ahora, creemos los sistemas de archivos en esos volúmenes.

$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc

-L es una opción de alias para establecer la etiqueta de volumen

Y luego montar los volúmenes.

$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb

Para que estos cambios se reflejen, el sistema debe reiniciarse. Por lo tanto, ahora también necesitamos la persistencia de la partición para que, en caso de un reinicio involuntario, no perdamos el almacenamiento de la base de datos.

Podemos lograr esto especificando las reglas de montaje en el archivo fstab. Puedes leer más sobre esto aquí.

Antes de eso, copiemos el UUID de las particiones anteriores (porque son únicas y no cambiarán al reiniciar el sistema )

$ sudo blkid

Copie los UUID enumerados para /dev/xvdb y /dev/xvdc . Consulte la “ETIQUETA” para identificación de bloque

Ahora abra el /etc/fstab archivo y pegue la configuración en el siguiente formato.

UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0

Actualizar nombre de host

El nombre de host se utilizará para identificar su servidor de base de datos en la red. Puede usar la IP elástica asignada anteriormente o Nombre de dominio (si está disponible). Abra el /etc/hostname archivo y anexar la entrada. Por ejemplo,

ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...

Actualizar los límites del proceso (opcional)

Esto se requiere opcionalmente para controlar el número máximo de conexiones aceptables mientras se mantiene estable el sistema. Abra el /etc/security/limits.conf archivo y agregue las siguientes entradas.

* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000

Ahora que todos los requisitos previos relacionados con la infraestructura están ordenados, reiniciar la instancia, y procedamos a la instalación de MongoDB.

1. Configurando MongoDB

Agregar la fuente del repositorio

Cree un archivo /etc/yum.repos.d/mongodb-org.4.2.repo y agregue los siguientes detalles del repositorio de paquetes.

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

Ahora instalemos MongoDB.

$ sudo yum -y install mongodb-org

Crear directorios y configurar permisos

MongoDB por defecto usa las siguientes rutas para almacenar los datos y los registros internos:

/var/lib/mongo → Datos
/var/log/mongodb → Registros

Crear los directorios

$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb

Cambiar permisos de usuario y grupo

$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod

Crear un usuario administrador

El demonio/servicio mongod debe ejecutarse primero antes de proceder a crear un usuario. Usemos la configuración predeterminada (almacenada en /etc/mongod.conf ) por ahora e inicie el proceso del daemon.

$ sudo -u mongod mongod -f /etc/mongod.conf

El comando anterior iniciará el demonio mongod en modo bifurcación (predeterminado).

Ahora, iniciemos sesión en el servidor y creemos nuestro primer usuario administrador.

Abrir un shell mongo

$ mongo

Utilice la base de datos "admin" para crear el administrador raíz

> use admin

Crear el usuario administrador

> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})

Crear un usuario normal

> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})

Apague el servidor por ahora. Reiniciaremos de nuevo con la configuración modificada

> db.shutDownServer()

Configurando la Autenticación

Aquí, habilitaremos la autenticación de la base de datos y modificaremos la dirección de enlace para que nuestro servidor sea accesible en el dominio público. Abra /etc/mongod.conf y realice los siguientes cambios.

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 # accessible on the network address
security:
  authorization: enabled # creds will be required for making db operations

Guarde la configuración y reinicie el servidor.

$ sudo -u mongod mongod -f /etc/mongod.conf

Inicio de sesión de prueba

Puede verificar si las credenciales funcionan usando,

$ mongo -u admin -p password

¡Eso es todo sobre la configuración inicial! Estén atentos a mi próxima publicación relacionada sobre el proceso de migración detallado y consejos sobre cómo mantener la base de datos lista para la producción.

PD ¡Gracias a Piyush Kumar por ayudar a curar esta publicación!