MongoDB es un gestor de base de datos NoSQL, de código abierto, orientado a documentos y multiplataforma, diseñado para ser escalable, tener un alto rendimiento (tanto para lecturas como para escrituras) y alta disponibilidad, escalando desde una configuración de servidor único a grandes y complejas arquitecturas de centros de datos.
MongoDB es un gestor de base de datos ágil que permite que los esquemas de datos cambien rápidamente a medida que las aplicaciones evolucionan, proporcionando funcionalidades de las bases de datos tradicionales, como índices secundarios, un lenguaje de consulta y consistencia de datos.
MongoDB incluye integración con hadoop, drivers oficiales para 10 lenguajes de programación, así como 40 drivers desarrollados y mantenidos por la comunidad.
Características de MongoDB:
- Modelo de datos JSON con esquemas dinámicos. MongoDB usa el formato BSON para representar internamente el formato JSON, JSON es el formato que se usa para modelar los datos.
- Auto-Sharding para escalabilidad horizontal
- Replicación nativa para alta disponibilidad
- Índices secundarios, incluyendo índices geoespaciales
- Índices TTL
- Búsqueda de texto
- Aggregation Framework & MapReduce nativo
Componentes de MongoDB:
- MongoDB Server (mongod): es el servicio que maneja las solicitudes y acceso a los datos, los permisos y autenticación, las base datos y más.
- MongoDB shell (mongo): cliente para conectarse al servidor MongoDB y realizar consultas y tareas de administración.
- Enrutador de consulta de clúster sharded/MongoDB sharded cluster query router (mongos): proporciona la interfaz entre las aplicaciones clientes y el clúster. Las instancias de mongos enrutan consultas y escriben operaciones en los shards.
- Herramientas MongoDB.
MongoDB es desarrollado por MongoDB Inc., y se publica bajo una combinación de la Licencia pública del lado del servidor y la Licencia de Apache.
Vea MongoDB Licensing para más detalles sobre las licencias bajo la cuál se desarrolla MongoDB
Adicionar el repositorio de MongoDB
En este paso crearemos el fichero mongodb.repo el cual contiene la definición del repositorio MongoDB versión 4.2
$ sudo bash -c 'cat > /etc/yum.repos.d/mongodb.repo <<EOF
[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
EOF
'
Puede obtener el listado de los paquetes disponibles ejecutando:
$ sudo dnf search mongodb-
...
mongodb-org.x86_64 : MongoDB open source document-oriented database system (metapackage)
mongodb-org-shell.x86_64 : MongoDB shell client
mongodb-org-tools.x86_64 : MongoDB tools
mongodb-org-mongos.x86_64 : MongoDB sharded cluster query router
mongodb-org-server.x86_64 : MongoDB database server
Instalar MongoDB
Con el siguiente comando instalamos la última versión estable
$ sudo bash -c 'dnf update && dnf -y install mongodb-org'
Configurando SELinux
La política actual de SELinux no permite que el proceso MongoDB acceda a /sys/fs/cgroup/
, que es necesario para determinar la memoria disponible en su sistema. Si tiene la intención de ejecutar SELinux en modo enforcing, deberá realizar el siguiente ajuste a su política SELinux:
1. Asegúrese que el paquetecheckpolicy
esté instalado:
$ sudo dnf install checkpolicy
2. Cree un archivo de política personalizado mongodb_cgroup_memory.te:
$ cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
type cgroup_t;
type mongod_t;
class dir search;
class file { getattr open read };
}
#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF
3. Compile y cargue el módulo de políticas personalizado ejecutando estos tres comandos:
$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp
Deshabilitar parámetros de diágnosticos
Los parámetros de diágnosticos es un mecanismo de recopilación de datos, como estadísticas del servidor y mensajes de estado (que solo es útil si posee un acuerdo de soporte con MongoDB Inc. ya que esta información puede ser enviada a los ingenieros de MongoDB para facilitar el análisis del comportamiento del servidor MongoDB); esta información es almacenada en formato binario y no sabrá a ciencia cierta que está guardando su servidor a menos que revise el código fuente de MongoDB, por tanto es recomendable deshabilitar esta opción.
Editamos el fichero mongod.conf
(/etc/mongod.conf) y agregamos las siguientes líneas:
Deshabilitar Transparent Huge Pages (THP)
Los sistemas de base de datos tienden a tener patrones de acceso a la memoria dispersos en lugar de contiguos por tanto tienen un pobre rendimiento cuando está habilitada THP.
Para más información sobre THP visite:
- Disable Transparent Huge Pages
- HUGE PAGES AND TRANSPARENT HUGE PAGES
- Disabling Transparent HugePages
1. Crear el servicio systemd
Con la siguiente unidad systemd garantizamos deshabilitar las THP antes de que se inicie el servicio mongod
$ sudo bash -c "cat > /etc/systemd/system/disable-transparent-huge-pages.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
EOF
"
2. Recargar las unidades systemd
Ejecute el siguiente comando para que la unidad systemd disable-transparent-huge-pages.service esté disponible para su uso:
$ sudo systemctl daemon-reload
3. Iniciar el servicio
Inicie el servicio para asegurarse de que se haya cambiado la configuración de THP:
$ sudo systemctl start disable-transparent-huge-pages
Verifique que THP se haya configurado correctamente en [never] ejecutando el siguiente comando:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
4. Iniciar con el sistema operativo
Para asegurarse de que esta configuración se aplique cada vez que se inicie su sistema operativo, ejecute el siguiente comando:
$ sudo systemctl enable disable-transparent-huge-pages
Ejecutar y administrar el proceso mongod
En esta parte aprenderemos como iniciar, detener o reiniciar el servicio mongod para ello usaremos el sistema de inicialización systemd.
Iniciar MongoDB
Ejecute el siguiente comando para iniciar mongod
$ sudo systemctl start mongod
Si obtiene un error como este:
Failed to start mongod.service: Unit mongod.service not found.
Ejecute el siguiente comando:
$ sudo systemctl daemon-reload
Y luego el comando anterior.
Verificar que el servicio se ha iniciado correctamente
Con el siguiente comando obtenemos información sobre el servicio mongod
$ sudo systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2020-04-06 11:20:19 EDT; 1min 16s ago
Docs: https://docs.mongodb.org/manual
Process: 3361 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
Process: 3359 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 3357 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 3354 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
Main PID: 3363 (mongod)
Memory: 165.7M
CGroup: /system.slice/mongod.service
└─3363 /usr/bin/mongod -f /etc/mongod.conf
Apr 06 11:20:19 localhost.localdomain systemd[1]: Stopped MongoDB Database Server.
Apr 06 11:20:19 localhost.localdomain systemd[1]: Starting MongoDB Database Server...
Apr 06 11:20:19 localhost.localdomain mongod[3361]: about to fork child process, waiting until server is ready for connections.
Apr 06 11:20:19 localhost.localdomain mongod[3361]: forked process: 3363
Apr 06 11:20:19 localhost.localdomain mongod[3361]: child process started successfully, parent exiting
Apr 06 11:20:19 localhost.localdomain systemd[1]: Started MongoDB Database Server.
Iniciar MongoDB luego que se inicie el SO
Con el siguiente comando garantiza que mongod se inicie automaticamente inmediatamente después que se inicie el sistema operativo.
$ sudo systemctl enable mongod
Detener MongoDB
Si necesita detener el servicio mongod, ejecute el siguiente comando.
$ sudo systemctl stop mongod
Reiniciar MongoDB
Para reiniciar el servidor MongoDB ejecute el siguiente comando:
$ sudo systemctl restart mongod
Puede seguir el estado del proceso en busca de errores o mensajes importantes mirando la salida en el archivo /var/log/mongodb/mongod.log
.
Conectarse a MongoDB usando mongo shell
Inicie un shell mongo en el mismo servidor que ejecuta el servicio mongod. Por defecto el servicio mongod recibe conexiones en la dirección loopback: 127.0.0.1 y en el puerto 27017, puede cambiar este comportamiento modificando la sección net del fichero de configuración, tenga en cuenta que si cambia la directiva bindIp
or bindIpAll
entonces puede conectarse al servidor MongoDB desde otro dispositivo sin necesidad de especificar usuario y contraseña y esto conlleva un riesgo de seguridad, de ahí que es necesario habilitar Control de acceso basado en roles.
Control de acceso basado en roles
Edite el fichero de configuración y agregue:
security:
authorization: enabled
Crear usuario admin
Conéctese al servidor de BD ejecutando
$ mongo
luego ejecute:
use admin
y a continuación creamos el usuario admin, el cual tendrá todos los permisos y/o accesos en todas las BD (nótese el rol userAdminAnyDatabase).
db.createUser({
user: "admin",
pwd: "MyPass",
roles: [
{
role: "userAdminAnyDatabase",
db: "admin"
},
"readWriteAnyDatabase"
],
});
Ahora reiniciamos el servicio mongod
$ sudo systemctl restart mongod
Para conectarse debe especificar el usuario
$ mongo -u "admin" --authenticationDatabase "admin" mongodbServer
MongoDB shell version v4.2.3
Enter password:
La opción --authenticationDatabase
significa que el chequeo de credenciales se realizará contra la BD admin.