MongoDB Sharding


Sharding

En MongoDB existe otro tipo de clúster, que es la tecnología de sharding, que puede satisfacer la necesidad de un gran crecimiento en la cantidad de datos de MongoDB.

Cuando MongoDB almacena una gran cantidad de datos, una sola máquina puede no ser suficiente para almacenar los datos, ni para proporcionar un rendimiento aceptable de lectura y escritura. En este caso, podemos dividir los datos en múltiples máquinas para que el sistema de base de datos pueda almacenar y procesar más datos.


¿Por qué usar sharding?

  • Replicar todas las operaciones de escritura al nodo primario
  • Los datos sensibles a la latencia se consultan en el nodo primario
  • Un conjunto de réplicas está limitado a 12 nodos
  • Cuando la cantidad de solicitudes es enorme, puede producirse falta de memoria.
  • Espacio en disco local insuficiente
  • La escalabilidad vertical es costosa

MongoDB Sharding

La siguiente figura muestra la distribución de la estructura del clúster de sharding en MongoDB:

En la figura anterior, hay principalmente tres componentes principales como se describe a continuación:

  • Shard:

    Se utiliza para almacenar los bloques de datos reales. En un entorno de producción real, el rol de un servidor shard puede ser asumido por un conjunto de réplicas compuesto por varias máquinas, para prevenir el punto único de fallo del host.

  • Config Server:

    Instancia de mongod, que almacena todo el ClusterMetadata, incluida la información de los chunks.

  • Query Routers:

    Enrutador front-end, a través del cual se conectan los clientes, y hace que todo el clúster parezca una única base de datos, que las aplicaciones front-end pueden usar de forma transparente.


Ejemplo de sharding

La distribución de puertos de la estructura de sharding es la siguiente:

Shard Server 1:27020
Shard Server 2:27021
Shard Server 3:27022
Shard Server 4:27023
Config Server :27100
Route Process:40000

Paso 1: Iniciar el servidor Shard

[root@100 /]# mkdir -p /www/mongoDB/shard/s0
[root@100 /]# mkdir -p /www/mongoDB/shard/s1
[root@100 /]# mkdir -p /www/mongoDB/shard/s2
[root@100 /]# mkdir -p /www/mongoDB/shard/s3
[root@100 /]# mkdir -p /www/mongoDB/shard/log
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork
....
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork

Paso 2: Iniciar el servidor Config

[root@100 /]# mkdir -p /www/mongoDB/shard/config
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork

Nota:Aquí podemos iniciarlo exactamente igual que un servicio mongodb normal, sin necesidad de agregar los parámetros --shardsvr y --configsvr. Debido a que la función de estos dos parámetros es cambiar el puerto de inicio, podemos simplemente especificar el puerto nosotros mismos.

Paso 3: Iniciar el proceso Route

/usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500

Entre los parámetros de inicio de mongos, chunkSize se utiliza para especificar el tamaño del chunk, en MB, con un tamaño predeterminado de 200 MB.

Paso 4: Configurar Sharding

A continuación, usamos MongoDB Shell para iniciar sesión en mongos y agregar nodos Shard.

[root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000
MongoDB shell version: 2.0.7
connecting to: 127.0.0.1:40000/admin
mongos> db.runCommand({ addshard:"localhost:27020" })
{ "shardAdded" : "shard0000", "ok" : 1 }
......
mongos> db.runCommand({ addshard:"localhost:27029" })
{ "shardAdded" : "shard0009", "ok" : 1 }
mongos> db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库
{ "ok" : 1 }
mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }

Paso 5: No es necesario realizar grandes cambios en el código del programa; simplemente conecte la base de datos al puerto 40000 de la misma manera que se conecta a una base de datos mongo normal.

Otras extensiones