MongoDB es un sistema de base de datos NoSQL de código abierto y orientado a documentos que se utiliza para almacenar y recuperar grandes volúmenes de datos. Fue desarrollado por MongoDB Inc y usa documentos similares a JSON con esquemas opcionales en lugar de usar tablas y filas. MongoDB usa un conjunto de réplicas para redundancia y alta disponibilidad. Puedes utilizar un conjunto de réplicas para distribuir las bases de datos entre muchos nodos. El conjunto de réplicas utiliza un nodo como nodo maestro, responsable de las operaciones de escritura, mientras que los otros son nodos cliente que realizan operaciones de lectura.
En este tutorial te enseñamos cómo configurar un cluster MongoDB de tres nodos en Ubuntu 20.04 VPS.
Requisitos Previos
Tres servidores en la nube corriendo con Ubuntu 20.04 para configurar el cluster MongoDB.
Configura el archivo Host
Primero, necesitarás configurar el archivo host en cada nodo para ejecutar la resolución de nombre de host en cada nodo.
Edita el archivo /etc/hosts en cada nodo:
# nano /etc/hosts
Añade las siguientes líneas:
master-ip-address masternode
client1-ip-address client1
client2-ip-address client2
Guarda y cierra el archivo cuando hayas terminado.
Instala MongoDB
A continuación, necesitarás instalar el paquete de servidor MongoDB en todos los nodos.
Primero, instala las dependencias requeridas utilizando el siguiente comando:
# apt install apt-transport-https software-properties-common gnupg2 dirmngr -y
Después de instalar todas las dependencias, agrega el repositorio MongoDB con el siguiente comando:
# wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -
# add-apt-repository 'deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse'
Una vez que el repositorio esté agregado, actualízalo con el siguiente comando:
# apt update -y
A continuación, instala el paquete de servidor MongoDB con el siguiente comando:
# apt install mongodb-org -y
Después de instalar MongoDB, inicia el servicio MongoDB y habilítalo para que se inicie con un reinicio del sistema:
# systemctl start mongod
# systemctl enable mongod
Crea un usuario administrativo en el nodo Maestro
Para seguir, necesitarás crear un usuario administrativo para autenticar MongoDb en el nodo Maestro.
Primero, conéctate a MongoDB usando el siguiente comando:
# mongo
Después de conectarte al shell de MongoDB, cambia la base de datos a admin:
use admin
Para continuar, crea un usuario administrativo con nombre admin y establece una contraseña para él:
db.createUser({user: "admin", pwd: "adminpassword", roles:[{role: "root", db: "admin"}]})
Éste es el resultado que deberías obtener:
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
Para terminar, sal de la shell de MongoDB con el siguiente comando:
exit
Configura el nodo Maestro
Ahora necesitarás crear una llave primaria en el nodo Maestro y después, copiarla en el resto de los nodos.
Primero, crea un llave primaria y establece los permisos pertinentes en el nodo Maestro:
# openssl rand -base64 756 > /mnt/keyfile
# chmod 400 /mnt/keyfile
# chown mongodb:mongodb /mnt/keyfile
Después, copia el archivo principal en los nodos Clientes:
# scp /mnt/keyfile root@client1:/mnt/
# scp /mnt/keyfile root@client2:/mnt/
A continuación, edita el archivo principal de configuración de MongoDB y define la réplica, el archivo llave y la dirección IP:
# nano /etc/mongod.conf
Añade o modifica las siguientes líneas:
net:
port: 27017
bindIp: 127.0.0.1,master-ip-address
security:
keyFile: /mnt/keyfile
replication:
replSetName: "replica1"
Guarda y cierra el archivo cuando hayas terminado.
Configura los nodos restantes
Ahora tendrás que editar el archivo principal de configuración de MongoDB en los nodos cliente1 y cliente2.
En el nodo cliente1, edita el archivo mongod.conf:
# nano /etc/mongod.conf
Añade o modifica las siguientes líneas:
net:
port: 27017
bindIp: 127.0.0.1,client1-ip-address
security:
keyFile: /mnt/keyfile
replication:
replSetName: "replica1"
Guarda el archivo y establece los permisos necesario en el archivo llave.
# chmod 400 /mnt/keyfile
# chown mongodb:mongodb /mnt/keyfile
En el nodo cliente2, edita el archivo mongod.conf:
# nano /etc/mongod.conf
Añade o modifica las siguientes líneas:
net:
port: 27017
bindIp: 127.0.0.1,client2-ip-address
security:
keyFile: /mnt/keyfile
replication:
replSetName: "replica1"
Guarda el archivo y después establece los permisos necesarios para el archivo principal:
# chmod 400 /mnt/keyfile
# chown mongodb:mongodb /mnt/keyfile
A continuación, necesitarás reiniciar el servicio MongoDB en todos los nodos, uno por uno. Puedes hacerlo con el siguiente comando:
# systemctl restart mongod
Inicia el Set de Réplica
Ahora necesitarás iniciar el set de réplica en el nodo Maestro.
Para ello, primero conéctate a MongoDB con el siguiente comando:
# mongo -u admin -p --authenticationDatabase admin
Una vez que hayas hecho login, corre el siguiente comando para iniciar el set de réplica:
> rs.initiate()
Éste es el resultado que deberías obtener:
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "master-address:27017",
"ok" : 1
}
Para el siguiente paso, sal del shell de MongoDB, espera un tiempo y después haz login otra vez con el siguiente comando:
# mongo -u admin -p --authenticationDatabase admin
Para continuar, añade el nodo cliente1 como miembro con el siguiente comando:
replica1:PRIMARY> rs.add("client1")
Éste es el resultado que deberías ver:
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1625489476, 1),
"signature" : {
"hash" : BinData(0,"Igm6kb044jADRUx+qaU0q5iKZX4="),
"keyId" : NumberLong("6981423727095316484")
}
},
"operationTime" : Timestamp(1625489476, 1)
}
Para continuar, añade el nodo cliente2 como miembro con el siguiente comando:
replica1:PRIMARY> rs.add("client2")
Ahora comprueba el estado de todos los nodos con el siguiente comando:
> rs.status()
Verifa la Réplica
A continuación, necesitarás verificar si la réplica entre todos los nodos está funcionando o no.
Para ello, crea una base de datos y añade unos valores en el nodo Maestro:
# mongo -u admin -p --authenticationDatabase admin
replica1:PRIMARY> use mydb
replica1:PRIMARY> for (var i = 0; i <= 10; i++) db.myCollection.insert( { x : i } )
En el siguiente paso, corre el siguiente comando para verificar la base de datos:
replica1:PRIMARY> show dbs
Éste es el resultado que deberías obtener:
admin 0.000GB
config 0.000GB
mydb 0.000GB
local 0.000GB
Para continuar, ve al nodo cliente1 y haz login en MongoDB con el siguiente comando:
# mongo -u admin -p --authenticationDatabase admin
Después de hacer login, hablita las operaciones de lectura de miembro secundario en una base de por-conexión utilizando el siguiente comando:
replica1:SECONDARY> db.getMongo().setSecondaryOk()
Después, cambia la base de datos a mydb y comprueba todos los documentos con el siguiente comando:
replica1:SECONDARY> use mydb
replica1:SECONDARY> db.myCollection.find()
Deberías ver todos los documentos creados en el nodo Maestro con el siguiente resultado:
{ "_id" : ObjectId("60e300746d386a637d52b9f1"), "x" : 0 }
{ "_id" : ObjectId("60e300746d386a637d52b9f2"), "x" : 1 }
{ "_id" : ObjectId("60e300746d386a637d52b9fa"), "x" : 9 }
{ "_id" : ObjectId("60e300746d386a637d52b9f7"), "x" : 6 }
{ "_id" : ObjectId("60e300746d386a637d52b9fb"), "x" : 10 }
{ "_id" : ObjectId("60e300746d386a637d52b9f8"), "x" : 7 }
{ "_id" : ObjectId("60e300746d386a637d52b9f3"), "x" : 2 }
{ "_id" : ObjectId("60e300746d386a637d52b9f9"), "x" : 8 }
{ "_id" : ObjectId("60e300746d386a637d52b9f6"), "x" : 5 }
{ "_id" : ObjectId("60e300746d386a637d52b9f4"), "x" : 3 }
{ "_id" : ObjectId("60e300746d386a637d52b9f5"), "x" : 4 }
Conclusión
Esperamos que ahora tengas un mayor conocimiento del cluster de MongoDB.
También puedes añadir más clientes al cluster en función de tus necesidades.