En este artículo os vamos a enseñar cómo configurar MongoDB con replica en 3 servidores, así tendremos nuestros datos guardados en 3 servidores. Crearemos 3 servidores que los llamaremos mongodb1, mongodb2 y mongodb3. Partimos del artículo Cómo instalar MongoDB realizando sólo el primer paso de instalación.
Actualizar hosts
Editaremos nuestro fichero hosts en cada servidor para añadir el host de cada servidor con la IP privada correspondiente:
10.20.10.22 mongodb1
10.20.10.23 mongodb2
10.20.10.24 mongodb3
Creación de llave
Este paso sólo hay que ejecutarlo en uno de los 3 servidores, en nuestro ejemplo lo haremos en mongodb1 y después procederemos a copiarlo a mongodb2 y mongodb3:
# openssl rand -base64 756 > /var/lib/mongodb/mongo.key
# scp /var/lib/mongodb/mongo.key mongodb2:/var/lib/mongodb/mongo.key
# scp /var/lib/mongodb/mongo.key mongodb3:/var/lib/mongodb/mongo.key
Permisos de llave
Este paso hay que ejecutarlo los 3 servidores, en nuestro ejemplo lo haremos en mongodb1 y después procederemos a copiarlo a mongodb2 y mongodb3:
# chown mongodb:mongodb /var/lib/mongodb/mongo.key
# chmod 400 /var/lib/mongodb/mongo.key
Creación de usuario Admin
Este paso sólo hay que ejecutarlo en mongodb1:
# mongo
> use admin
> db.createUser({user: "mongo-replica", pwd: "CloudingEjemploKB", roles:[{role: "root", db: "admin"}]})
> quit()
devolverá:
Successfully added user: {
"user" : "mongo-replica",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
Configurar MongoDB
Ahora que ya tenemos el usuario administrador creado procederemos a configurar MongoDB en los 3 servidores para que se autentique con la llave que hemos creado y asignarle un nombre a la réplica, para ello añadiremos en el archivo de configuración:
# vi /etc/mongod.conf
security:
keyFile: /var/lib/mongodb/mongo.key
replication:
replSetName: rs0
Una vez hechos los cambios reiniciaremos MongoDB en los 3 servidores:
# systemctl restart mongod
Iniciar Réplicas MongoDB
Este paso sólo lo haremos en mongodb1, primero nos conectaremos con el usuario y contraseña que hemos creado en el paso anterior e iniciaremos la réplica:
# mongo -u mongo-replica -p --authenticationDatabase admin
rs.initiate( { _id : "rs0", members: [ { _id : 0, host : "mongodb1:27017" }, { _id : 1, host : "mongodb2:27017" }, { _id : 2, host : "mongodb3:27017" } ] } )
devovlerá:
{
"ok" : 1,
"operationTime" : Timestamp(1520358155, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1520358155, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
Podemos ver la configuración:
rs.conf()
rs.conf()
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "mongodb1:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongodb2:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongodb3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5a9ed30a3a8cb5b9647406b5")
}
}
También podemos ver el estado de las réplicas ejecutando:
rs.status()
{
"set" : "rs0",
"date" : ISODate("2018-03-06T17:53:45.571Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "mongodb1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 842,
"optime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-03-06T17:53:37Z"),
"electionTime" : Timestamp(1520358165, 1),
"electionDate" : ISODate("2018-03-06T17:42:45Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "mongodb2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 670,
"optime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-03-06T17:53:37Z"),
"optimeDurableDate" : ISODate("2018-03-06T17:53:37Z"),
"lastHeartbeat" : ISODate("2018-03-06T17:53:43.925Z"),
"lastHeartbeatRecv" : ISODate("2018-03-06T17:53:44.971Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "mongodb1:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "mongodb3:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 670,
"optime" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1520358817, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-03-06T17:53:37Z"),
"optimeDurableDate" : ISODate("2018-03-06T17:53:37Z"),
"lastHeartbeat" : ISODate("2018-03-06T17:53:43.925Z"),
"lastHeartbeatRecv" : ISODate("2018-03-06T17:53:44.681Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "mongodb1:27017",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1520358817, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1520358817, 1),
"signature" : {
"hash" : BinData(0,"4rm4LohRlAYnX8qwMh2XkFZCZ4A="),
"keyId" : NumberLong("6529888605471506433")
}
}
}
Este artículo está basado en: https://docs.mongodb.com