MongoDB crear réplica con llave

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:

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/manual/tutorial/deploy-replica-set-with-keyfile-access-control/#deploy-repl-set-with-auth

To write a comment on this article, fill out the form below. Fields marked with an asterisk (*) are required.