El sharding és una tècnica de particionament horitzontal utilitzada per distribuir dades entre múltiples servidors MongoDB.
Permet:
MongoDB implementa sharding de forma nativa mitjançant clusters distribuïts.
Les dades es distribueixen per rangs de valors.
Exemple:
Aquest sistema pot generar hotspots si moltes escriptures es concentren en un mateix rang.
S'aplica una funció hash sobre la Shard Key.
Avantatges:
És l’estratègia recomanada per càrregues generals.
Les dades es reparteixen segons valors predefinits.
Exemple:
| Component | Funció |
|---|---|
| Config Server | Emmagatzema les metadades del cluster |
| Shards | Emmagatzemen les dades |
| Mongos | Router que distribueix les peticions |
+----------------+
| Mongos |
+--------+-------+
|
+----------------+----------------+
| |
+----+----+ +----+----+
| Shard1 | | Shard2 |
+---------+ +---------+
+------------------+
| Config Server |
+------------------+
mkdir /mongodb-sharding cd /mongodb-sharding
Crear el fitxer docker-compose.yml:
version: "3.8" services: configsvr: container_name: configsvr image: mongo:4.4 restart: always command: > mongod --configsvr --replSet configReplSet --port 27019 --bind_ip_all ports: - "27019:27019" volumes: - configdb:/data/db shard1: container_name: shard1 image: mongo:4.4 restart: always command: > mongod --shardsvr --replSet shard1ReplSet --port 27018 --bind_ip_all ports: - "27018:27018" volumes: - shard1db:/data/db shard2: container_name: shard2 image: mongo:4.4 restart: always command: > mongod --shardsvr --replSet shard2ReplSet --port 27018 --bind_ip_all ports: - "27028:27018" volumes: - shard2db:/data/db mongos: container_name: mongos image: mongo:4.4 restart: always depends_on: - configsvr - shard1 - shard2 command: > mongos --configdb configReplSet/configsvr:27019 --bind_ip_all --port 27017 ports: - "27017:27017" volumes: configdb: {} shard1db: {} shard2db: {}
S’utilitzen volums Docker per mantenir les dades persistents encara que els contenidors s’aturin o es recreïn.
Sense volums, la pèrdua dels contenidors implicaria la pèrdua de totes les dades del cluster.
També s’ha configurat:
restart: always
Aquesta directiva permet reiniciar automàticament els contenidors després d’un reinici del sistema o de la màquina.
docker-compose up -d docker ps
docker exec -it configsvr mongo --port 27019
rs.initiate({ _id: "configReplSet", configsvr: true, members: [ { _id: 0, host: "configsvr:27019" } ] })
docker exec -it shard1 mongo --port 27018
rs.initiate({ _id: "shard1ReplSet", members: [ { _id: 0, host: "shard1:27018" } ] })
docker exec -it shard2 mongo --port 27018
rs.initiate({ _id: "shard2ReplSet", members: [ { _id: 0, host: "shard2:27018" } ] })
docker exec -it mongos mongo --port 27017
sh.addShard("shard1ReplSet/shard1:27018") sh.addShard("shard2ReplSet/shard2:27018")
sh.enableSharding("testDB")
sh.shardCollection( "testDB.users", { _id: "hashed" } )
use testDB for (let i = 0; i < 1000; i++) { db.users.insert({ name: "user" + i, value: i }) }
db.users.getShardDistribution()
use config db.collections.find({ _id: "testDB.users" })
El sharding permet escalar MongoDB distribuint les dades entre múltiples nodes.
L’ús de hashed shard keys facilita: