miércoles, 23 de mayo de 2012

Reporte #16

Ahora hablaremos de MongoDB, para complementarlo con la entrada anterior en la que hablabamos sobre cuales son las ventajas de usarlo. Para ello dejaré la liga a esa entrada sobre MongoDB.


Entenderemos que es un shard, un shard es uno o mas servidores en un cluster que son responsables para almacenar subconjunto de datos. Cuando hay más de un server en un shard, cada servidor tiene una copia identica de cada subconjunto de datos como en el ejemplo que verán debajo.


Los datos estan eventualmente distribuidos por shards y MongoDB mueve un subconjunto de datos desde shard a otro.Imagina que nosotros usamos una colección de datos y tomamos como base el campo de nombre.MongoDB divide los datos en pequeñas partes dandoles un rango por ejemplo.

 ["a", "g"]

Para dividir en ciertas partes MongoDB hace cosas como lo siguiente:

(a, b), donde x  es mayor que a y menor que b

(a, b], donde x es mayor que a y menor igual a b

[a, b), donde x es mayor igual que a y menor que b

[a, b], donde x es mayor igual que a y menor igual que b

Ahora digamos que tenemos un rango de [a, h). Entonces decimos que "Carlos", "Hilario" y "Alejandro" pueden estar dentro del rango por que si comparamos sus iniciales donde a < a < "Alejandro" < "Carlos" < " Hilario" < h.

La manera en la que MongoDB distribuye los datos a traves de cada shard para que estos sean responsables de cada rango de datos, por ejemplo si nosotros tenemos 4 shards, asumiendo el ejemplo anterior esto podría distribuirse de la siguiente manera.


Supongamos que muchos nombres se registraron entre [a, f), lo cual hizo más el shard 1 por lo tanto tomamos parte del shard 1 al shard 2. Con solamente ajustar los rangos digamos que shard 1 [a ,c) y shard 2 [c, n).


Supongamos que shard 1 y 2 tienen 500GB de datos, mientras que el 3 y 4 solamente tienen 300GB cada uno de ellos.Suponiendo que hacemos copias en cascada donde movemos 100GB de shard 1 a shard 2, de shard 2 pasamos 200GB a shard 3 y de shard 3 pasamos a shard 4 100GB; en total nosotros movimos 400GB. 

 
Ahora si agregamos un nuevo shard y 500 GB, entonces tendremos que mover 400GB desde nuestro shard 4 a shard 5, 300GB desde nuestro shard 3 a el shard 4, 200GB desde nuestro shard 2 a shard 3 y 100GB desde nuestro shard 1 al 2. En conclusión nosotros movimos 1TB lo cual no es muy eficiente.


MongoDB no hace esto, en lugar de ello en cada shard contiene multiples rangos. Ahora consideremos que tenemos el mismo ejemplo que fue utilizado en el primero en donde shard 1 y 2 tiene 500GB, shard 3 y 4 tiene 300GB. Recordando que MongoDB hace que se divida en multiples rangos explicaremos lo siguiente, shard 1 hacemos que cambie a dos rangos donde uno es 400GB donde digamos que [a, d) y 1 de 100GB [d, f). Ahora diremos que hacemos lo mismo con shard 2 donde [f, j) y [j, n). Luego migramos  100GB [d, f) de shard 1 a shard 3 y del shard 2 [j, n) al shard 4. A cada rango de dato le llamamos chunk.Como observarán solamente movimos 200GB.


Ahora imaginemos que agregamos otro shard lo único que haremos es partir cada chunk y le daremos partes de ello para que sea de forma distribuida este partirá de cada shard 100GB para que sea un total de movimiento de 400GB.

Esta es la manera en la que se comporta un shard en MongoDB.


1 comentario: