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
- Configuración de la infraestructura
- Configuración de MongoDB
- Migración masiva
- 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
- xvdb (30 Gb de espacio para almacenar datos)
- 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!