jueves, 12 de enero de 2012

Como montar un Cluster de MongoDB con 4 Nodos

Bueno, después de una temporada con mucho curro vuelvo con cositas nuevas y frescas, voy a explicaros como montar un cluster de MongoDB para entornos de producción.
Para empezar vamos a contar con 4 nodos a los que vamos a llamar Frodo, Sam, Pipin y Merry...si exacto soy un jodido friki xDD. Para hacer mas fácil levantar los servicios y demás lo mejor es usar configuración de demonios basada en archivos viene a ser mas o menos lo mismo que el comando en crudo, pero de esta manera alguien que no tenga mucha idea, puede levantar los servicios mientras tu te rascas la parte baja de los genitales xD.

Vamos a empezar con el Replica Set, que en resumen es, un cluster Maestro-esclavo inteligente, si se cae un nodo, hace otro de ellos se hace maestro y toma el control de la situación. Se van a llamar Agny y Rudra...que si que soy un puto friki...xDD

Frodo
mkdir -p /var/lib/mongo/agny /var/lib/mongo/rudra
mongod --dbpath /var/lib/mongo/agny --port 10000 --replSet agny
mongod --dbpath /var/lib/mongo/rudra --port 11000 --replSet rudra --oplogSize 1


Pipin
mkdir -p /var/lib/mongo/agny
mongod --dbpath /var/lib/mongo/agny --port 10000 --replSet agny


Sam
mkdir -p /var/lib/mongo/agny /var/lib/mongo/rudra
mongod --dbpath /var/lib/mongo/agny --port 11000 --replSet agny --oplogSize 1
mongod --dbpath /var/lib/mongo/rudra --port 10000 --replSet rudra

Merry
mkdir -p /var/lib/mongo/rudra
mongod --dbpath /var/lib/mongo/rudra --port 10000 --replSet rudra

Con estas instrucciones puestas cada una en su correspondiente servidor, lo que hacemos es preparar el terreno, estamos organizando el espacio donde se va a dejar los archivos de la DB, y despues levantamos los correspondientes demonios en cada servidor.

Ahora vamos a conectarnos a Frodo para cargarle la configuración..


mongo Frodo:10000/admin

> rs.initiate({"_id" : "agny", "members" : [
... {"_id" : 0, "host" : "Frodo:10000"},
... {"_id" : 1, "host" : "Pipin:10000"},
... {"_id" : 2, "host" : "Sam:11000", arbiterOnly : true}]})

Y ahora a Sam...

mongo Sam:10000/admin

> rs.initiate({"_id" : "rudra", "members" : [
... {"_id" : 0, "host" : "Sam:10000"},
... {"_id" : 1, "host" : "Merry:10000"},
... {"_id" : 2, "host" : "Frodo:11000", arbiterOnly : true}]})


Tarda unos segundos y ale ya tienes tu Set de hobbits replicados, lo bueno que tiene esta configuración es que los que actúan de árbitros hacen que en caso de caída no se pierda funcionalidad en la aplicación, ademas de que no vas a tener 2 maestros concurrentes en ningún servidor nunca.

Ahora las Shards, vamos a montar 2 y vamos a volcar la configuracion en Sam, Pipin y Merry


Pipin
mkdir /var/lib/mongo/config
mongod --dbpath /var/lib/mongo/config --port 20000

Sam
mkdir /var/lib/mongo/config
mongod --dbpath /var/lib/mongo/config --port 20000

Merry
mkdir /var/lib/mongo/config
mongod --dbpath /var/lib/mongo/config --port 20000
mongos --configdb Pipin:20000,Sam:20000,Merry:20000 --port 30000

Ahora nos conectamos al puerto 30000 de Merry y configuramos la Shards

> mongo Merry:30000/admin

> db.runCommand({addshard : "agny/Frodo:10000,Pipin:10000"})
{ "shardAdded" : "agny", "ok" : 1 }
> db.runCommand({addshard : "rudra/Sam:10000,Merry:10000"})
{ "shardAdded" : "rudra", "ok" : 1 }

Ale a correr, ya tenemos el cluster montado, ahora vuestra aplicación debe apuntar al proceso mongos, bueno realmente lo mejor es montar un proceso mongos por nodo de aplicación y que así apunten a Localhost:puerto.

Espero que os haya servido de ayuda, esta info la he sacado de un par de libros y de el blog http://www.snailinaturtleneck.com/blog.