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.