Establecer las replicas en nuestro servidor de bases de datos MongoDB
MongoDB nos permite establecer unas replicas, que en caso de percance en el servidor principal, tomara el control una de estas replicas.
El numero de servidores que una instalación de mongoDB, es decir, contado el servidor principal y sus replicas tiene que ser impar. Esto es debido a que la replica que de valla a utilizar se realizar por «votación», y el que tenga más del 50% por ciento de los votos, es el que ocupara el puesto de primero. Esto no lo tengo yo muy bien entendido.
Por ello la configuración más habitual en un sistema MongoDB suele ser de 3 servidores, el principal y las dos replicas.
Configuración de las replicas en nuestro servicio.
El configurar las replicas en nuestro servidor MongoDB es muy sencillo.
Lo primero que tenemos que hacer es crear las carpetas donde se alojaran los ficheros de las bases de datos.
Para esta prueba, vamos a crear las carpetas en el propio servidor donde tenemos nuestra instalación de MongoDB.
mkdir /datos
mkdir /datos/principal
mkdir /datos/replica1
mkdir /datos/replica2
mkdir /datos/logs
sudo chown -R mongodb:mongodb /datos
Ademas de crear las carpetas donde se alojaran los ficheros de las bases de datos de cada uno de los servidores, hemos establecido a mongodb el propietario de las misma.
El siguiente paso que nos queda, es la crear las instancias de los servidores.
Configuración del servicio principal
Para el servidor principal quedaría de la siguiente manera.
sudo -u mongodb mongod --dbpath /datos/principal --logpath /datos/logs/principal.log --replSet servidoresMongo --smallfiles --oplogSize 128 --port 27017 --fork
La primera observación hemos ejecuta el comando bajo el usuario «mongodb», sudo -u mongodb. Si lo hiciésemos con sudo normal, estaríamos dándole los permisos de root al proceso, se puede hacer, pero no es recomendable.
Explicación de los parámetros:
- –dbpath: ruta donde se va ha almacenar los ficheros de las bases de datos.
- –logpath: ruta donde queremos que se cree el fichero de log del servidor.
- –replSet: Nombre del sistema. Todos los sistemas que pertenezcan al mismo sistema tendrá que tener el mismo replSet.
- –smallfiles: control de los tamaños de los ficheros que componen el sistema.
- –oplogSize: tamaño de los ficheros de log.
- –port: Puerto donde esta a la escucha el servidor.
- –fork: No se bloquea la sesión que inicio el mongod.
Configuración de las replicas
Para establecer los procesos de las replicas ejecutaremos el mismo comando, cambiando los parámetros de –dbpath, –logpath y –port, a los valores propios de cada proceso:
Replica 1:
sudo -u mongodb mongod --dbpath /datos/replica1 --logpath /datos/logs/replica1.log --replSet servidoresMongo --smallfiles --oplogSize 128 --port 27018 --fork
Replica 2:
sudo -u mongodb mongod --dbpath /datos/replica2 --logpath /datos/logs/replica2.log --replSet servidoresMongo --smallfiles --oplogSize 128 --port 27019 --fork
Una vez establecido los procesos que van a controlar cada uno de los servicios, entramos en la consola de mongo para configurar el uso de las replicas.
mongo --port 27017
Y creamos una variable con este formato para establecer los miembros del sistema.
cfg = {"_id":"nombreSistema", "members":[
{"_id":0, "host":"direccion_servidor:puerto"},
{"_id":1, "host":"direccion_servidor:puerto"},
{"_id":2, "host":"direccion_servidor:puerto"}
]
}
Para nuestro ejemplo, y suponiendo que los estamos haciendo en el propio servidor quedaría de la siguiente forma:
cfg = {"_id":"servidoresMongo", "members":[
{"_id":0, "host":"localhost:27017"},
{"_id":1, "host":"localhost:27018"},
{"_id":2, "host":"localhost:27019"}
]
}
Con la variable que acabamos de crear vamos ha cargar la configuración de las replicas en la configuración de nuestro MongoDB
rs.initiate(cfg)
Si todo ha sido correcto, una de las lineas que nos aparecerá sera un:
{ «ok» : 1 }
Verificación de nuestra configuración
Para verificar que así a sido, podemos ejecutar el siguiente comando.
rs.status()
Este nos mostrara el estado de las replicas, si están funcionando correctamente.
{
"set" : "nombreSistema",
"date" : ISODate("2018-04-12T16:27:39.682Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1523550459, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1523550459, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1523550459, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1523550459, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "localhost:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 6786,
"optime" : {
"ts" : Timestamp(1523550459, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-04-12T16:27:39Z"),
"electionTime" : Timestamp(1523544257, 1),
"electionDate" : ISODate("2018-04-12T14:44:17Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "localhost:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 6213,
"optime" : {
"ts" : Timestamp(1523550449, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1523550449, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-04-12T16:27:29Z"),
"optimeDurableDate" : ISODate("2018-04-12T16:27:29Z"),
"lastHeartbeat" : ISODate("2018-04-12T16:27:38.545Z"),
"lastHeartbeatRecv" : ISODate("2018-04-12T16:27:39.322Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "localhost:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 6213,
"optime" : {
"ts" : Timestamp(1523550449, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1523550449, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-04-12T16:27:29Z"),
"optimeDurableDate" : ISODate("2018-04-12T16:27:29Z"),
"lastHeartbeat" : ISODate("2018-04-12T16:27:38.545Z"),
"lastHeartbeatRecv" : ISODate("2018-04-12T16:27:39.321Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:27017",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1523550459, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1523550459, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
Si obtenemos una respuesta parecida a la de arriba, es que nuestro sistema esta funcionando correctamente.
Como de costumbre al final de los post, ya sabéis, ante cualquier duda, pues un comentario 8-))))