Replicación maestro-esclavo en MongoDB
Esta es una entrada cortita, gracias en parte a la extrema facilidad de administrador de nuestra base de datos NoSQL favorita. En esta ocasión vamos a ver como crear una replicación dentre dos sistemas MongoDB, en arquitectura Maestro-Esclavo. Como pasa bastante habitualmente, la arquitectura Maestro-Maestro, a pesar de ser posible, no la recomiendan. Esta, al igual que en MySQL, se basa en el truco de hacer que un esclavo sea al mismo tiempo maestro.
Yo voy a mostrar la opción recomendada, Maestro-Esclavo.
Para ello, lo primero es instalar dos MongoDB en Debian Lenny.
El primero se llamará Maestro con IP 192.168.1.105 y el segundo Esclavo con IP 192.168.1.101.
Arrancamos el maestro indicando que actuará con ese Rol:
debian1:/usr/local/mongodb# bin/mongod --master Sat Jun 12 16:41:23 Mongo DB : starting : pid = 2158 port = 27017 dbpath = /data/db/ master = 1 slave = 0 64-bit Sat Jun 12 16:41:23 db version v1.4.3, pdfile version 4.5 Sat Jun 12 16:41:23 git version: 47ffbdfd53f46edeb6ff54bbb734783db7abc8ca Sat Jun 12 16:41:23 sys info: Linux domU-12-31-39-06-79-A1 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41 Sat Jun 12 16:41:23 waiting for connections on port 27017 Sat Jun 12 16:41:23 ****** Sat Jun 12 16:41:23 creating replication oplog of size: 944MB (use --oplogSize to change) Sat Jun 12 16:41:23 ****** Sat Jun 12 16:41:23 allocating new datafile /data/db/local.ns, filling with zeroes... Sat Jun 12 16:41:23 done allocating datafile /data/db/local.ns, size: 16MB, took 0.026 secs Sat Jun 12 16:41:23 allocating new datafile /data/db/local.0, filling with zeroes... Sat Jun 12 16:41:23 done allocating datafile /data/db/local.0, size: 64MB, took 0.185 secs Sat Jun 12 16:41:23 allocating new datafile /data/db/local.1, filling with zeroes...
Una vez hecho, arrancamos el Esclavo indicándole por parámetro donde está su Maestro:
debian2:/usr/local/mongodb/bin# ./mongod --slave --source 192.168.1.105:27017 Sat Jun 12 16:42:03 Mongo DB : starting : pid = 2172 port = 27017 dbpath = /data/db/ master = 0 slave = 1 64-bit Sat Jun 12 16:42:03 db version v1.4.3, pdfile version 4.5 Sat Jun 12 16:42:03 git version: 47ffbdfd53f46edeb6ff54bbb734783db7abc8ca Sat Jun 12 16:42:03 sys info: Linux domU-12-31-39-06-79-A1 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41 Sat Jun 12 16:42:03 waiting for connections on port 27017 Sat Jun 12 16:42:03 web admin interface listening on port 28017 Sat Jun 12 16:42:04 allocating new datafile /data/db/local.ns, filling with zeroes... Sat Jun 12 16:42:04 done allocating datafile /data/db/local.ns, size: 16MB, took 0.028 secs Sat Jun 12 16:42:04 allocating new datafile /data/db/local.0, filling with zeroes... Sat Jun 12 16:42:05 done allocating datafile /data/db/local.0, size: 64MB, took 0.185 secs Sat Jun 12 16:42:05 building new index on { id: 1 } for local.sources Sat Jun 12 16:42:05 Buildindex local.sources idxNo:0 { name: "_id", ns: "local.sources", key: { _id: 1 } } Sat Jun 12 16:42:05 done for 0 records 0secs Sat Jun 12 16:42:05 repl: from host:192.168.1.105:27017 Sat Jun 12 16:42:05 repl: applied 1 operations Sat Jun 12 16:42:05 repl: end sync_pullOpLog syncedTo: Sat Jun 12 16:42:00 2010 4c139cb8:1
Ya tenemos las dos bases de datos en marcha:

Creamos una nueva base de datos llamada test y añadimos una colección:
> use test switched to db test > a = { nombre : "Miguel Angel", apellido : "Nieto" } { "nombre" : "Miguel Angel", "apellido" : "Nieto" } > db.gente.save(a);
Comprobamos que se ha añadido en Maestro:

Comprobamos que se ha añadido en Esclavo:

Y lo buscamos en el Esclavo:

Más facil y rápido imposible :)



