Continuando con la serie sobre MongoDB, hoy veremos cómo realizar la instalación en Debian de un clúster con un simple nodo:

  1. Introducción a MongoDB ¿Qué es? ¿En qué situaciones es recomendable usar MongoDB y en cuáles no?
  2. Instalación de un ‘clúster’ en modo single node.
  3. Instalación de un ‘Sharded clúster’
  4. Monitorización de MongoDB con PRTG.
  5. Operaciones habituales con MongoDB.
  6. Optimización de la configuración
  7. Operaciones MapReduce en MongoDB

La instalación en Debian está totalmente detallada en la web de MongoDB,  así como la instalación en otros sistemas operativos. Bien, empecemos.

Para empezar, podemos importar la clave pública usada por el sistema gestor de paquetes.

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

Después creamos un fichero sources.list (Debian 8 Jessie) para MongoDB.

$ echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list

Seguidamente cctualizamos la cache de paquetes disponibles

$ apt-get update

Y finalmente instalamos todos los paquetes

$ apt-get install -y mongodb-org

El repositorio oficinal contiene los siguientes paquetes:

mongodb-org Un metapackage que instala el resto de paquetes.
mongodb-org-server Contiene el binario (mongod) y todos los scripts asociados para realizar la instalación.
mongodb-org-mongos Contiene el binario del query router (mongos).
mongodb-org-shell Contiene en cliente shell (mongo).
mongodb-org-tools Contiene diversas herramientas de administración de MongoDB: mongoimport bsondump, mongodump, mongoexport, mongofiles, mongooplog, mongoperf, mongorestore, mongostat, and mongotop.

El que nosotros hemos instalado es el meta que lo contiene todo. Si todo ha funcionado, el servicio está instalado, y funcionando. Podemos comprobarlo via service.

:~$ service mongod status
● mongod.service - High-performance, schema-free document-oriented database
 Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: 
 Active: active (running) since vie 2017-08-11 09:47:07 CEST; 21s ago
 Docs: https://docs.mongodb.org/manual
 Main PID: 8145 (mongod)
 Tasks: 17
 Memory: 90.7M
 CPU: 1.756s
 CGroup: /system.slice/mongod.service
 └─8145 /usr/bin/mongod --quiet --config /etc/mongod.conf

así que ya podemos conectarnos para crear nuestra primera base de datos. Para ello usamos el cliente shell.

$> mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
Server has startup warnings: 
2017-08-11T09:47:07.565+0200 I STORAGE [initandlisten] 
2017-08-11T09:47:07.565+0200 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-08-11T09:47:07.565+0200 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] 
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] 
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] 
>

En cuanto a todos los warnings que nos aparecen vamos a ver cómo evitarlos, ya que al fin y al cabo nos están indicando que algo no está funcionando del todo como debería ¿no?

Mejoras de la instalación

Uso de XFS como sistema de ficheros

El primer warning es el siguiente:

WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

Sencillamente nos indica que para el storage engine elegido, en nuestro caso, WiredTiger, se recomienda el uso del sistema de ficheros XFS. La explicación de por qué se recomienda éste y no otro sistema de ficheros se la dejo a MongoDB . Para ello, lo que recomiendo es crear una unidad, formatearla en XFS, y montarla en, por ejemplo, /data/mongodb, y hacer que esta sea la ruta en la que mongo almacena los datos. Empecemos:

Primero, instalamos (si es que no está instalado) xfsprogs.

$> apt-get install xfsprogs

Ahora, suponiendo que la unidad que queremos formatear es /dev/sdb, creamos una única partición en esta unidad.

$> fdisk /dev/sdb

Command (m for help): [n]
Partition type:
 p primary (0 primary, 0 extended, 4 free)
 e extended
Select (default p): [p]
Partition number (1-4, default 1): [1]
First sector (2048-335544319, default 2048): [press Enter]
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-335544319, default 335544319): [press Enter]
Using default value 335544319

Command (m for help): [w]
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Ahora, la formateamos en XFS,

$> mkfs.xfs -L media /dev/sdb1

Este último punto puede fallar si no hemos instalado previamente el xfsprogs. Y finalmente creamos un punto de montaje y montamos la unidad.

$> mkdir /data/mongodb
$> mount -t xfs /dev/sdb1 /data/mongodb

Ahora ya tenemos la unidad formateada y montada (es una buena idea añadirla a /etc/fstab para evitar tener que montarla manualmente cada vez 😉 ) podemos modificar la ruta en la que almacenamos los datos.  Para ello, editamos el fichero /etc/mongod.conf y en la sección de storage, modificamos la ruta a la que queremos. En nuestro caso cambiamos la que viene por defecto (/var/lib/mongodb) por /data/mongodb.

# Where and how to store data.
storage:
 dbPath: /data/mongodb

Si ahora reiniciamos el servicio, veremos que el warning ha desaparecido.

$> service mongod restart
$> mongo
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
Server has startup warnings: 
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] 
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2017-08-11T09:47:09.190+0200 I CONTROL [initandlisten] 
>

Vamos con los siguientes warnings.

Deshabilitar las Transparent Huge Pages

Esta recomendación requiere hacer dos pasos, primero crear un script para que deshabilite las THP, y posteriormente crear un servicio que lo ejecute cada vez que se inicie el sistema. Seguimos las instrucciones que se nos indican en la web de MongoDB.

Primero creamos el fichero /etc/init.d/disable-transparent-hugepages, con el siguiente contenido:

#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO

case $1 in
 start)
 if [ -d /sys/kernel/mm/transparent_hugepage ]; then
 thp_path=/sys/kernel/mm/transparent_hugepage
 elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
 thp_path=/sys/kernel/mm/redhat_transparent_hugepage
 else
 return 0
 fi

echo 'never' > ${thp_path}/enabled
 echo 'never' > ${thp_path}/defrag

re='^[0-1]+$'
 if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
 then
 # RHEL 7
 echo 0 > ${thp_path}/khugepaged/defrag
 else
 # RHEL 6
 echo 'no' > ${thp_path}/khugepaged/defrag
 fi

unset re
 unset thp_path
 ;;
esac

Lo hacemos ejecutable:

sudo chmod 755 /etc/init.d/disable-transparent-hugepages

Y lo pasamos a servicio:

sudo update-rc.d disable-transparent-hugepages defaults

Reiniciamos el equipo, y para comprobar que se ha deshabilitado correctamente, podemos hacer lo siguiente:

$> cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$> cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
$>  

Si la respuesta es [never] todo ha funcionado correctamente, y al arrancar MongoDB ya no recibiremos aviso alguno.

MongoDB y NUMA

La ejecución de MongoDB en hardware con soporte para el acceso no uniforme a la memoria (Non-Uniform Access Memory o NUMA) puede causar pérdidas de rendimiento o incluso errores en el funcionamiento, por lo tanto, MongoDB recomienda que se deshabilite. A pesar de que en mi equipo no está habilitado y este warning no se ha mostrado, si lo hacéis en un equipo que sí lo tenga habilitado, se os motrará un mensaje como el siguiente:

WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl --interleave=all mongod [other options]

A pesar de que el soporte para NUMA se puede desactivar a nivel de Kernel, en mi caso prefiero desactivarlo a nivel de BIOS. La BIOS de nuestros servidores tiene la opción tal y como se muestra en la imagen siguiente:

NUMA.jpg

Pero depende de cada BIOS el que la opción esté en una u otra sección. Para comprobar que en realidad está deshabilitado, podemos ejecutar el siguiente comando:

~$ dmesg | grep -i numa
[ 0.000000] No NUMA configuration found

 

Conclusiones

En principio esto es todo. Si hemos seguido las instrucciones podemos usar MongoDB sin problemas y sin recibir ningún warning. Si queréis consultar más detalles sobre las recomendaciones de MongoDB para entornos de producción, siempre podéis consultar las production-notes. En futuros posts veremos cómo a partir de esta instalación podemos configurar un clúster más complejo.

Saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s