Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| — |
sharding_mongo_docker [2026/05/23 07:06] (actual) cristofol_garcia_pujol creat |
||
|---|---|---|---|
| Línia 1: | Línia 1: | ||
| + | ====== Implementació de Hash-Based Sharding usant MongoDB i Docker ====== | ||
| + | {{tag> CetiMp03 CiberMp03 mongodb docker sharding basesdedades cluster replicaset }} | ||
| + | |||
| + | ===== Introducció ===== | ||
| + | |||
| + | El '' | ||
| + | |||
| + | Permet: | ||
| + | * escalar horitzontalment, | ||
| + | * distribuir càrrega, | ||
| + | * millorar el rendiment, | ||
| + | * augmentar la disponibilitat. | ||
| + | |||
| + | MongoDB implementa '' | ||
| + | |||
| + | ===== Tipus de sharding ===== | ||
| + | |||
| + | ==== Range-based sharding ==== | ||
| + | |||
| + | Les dades es distribueixen per rangs de valors. | ||
| + | |||
| + | Exemple: | ||
| + | * ID 1-1000 → shard1 | ||
| + | * ID 1001-2000 → shard2 | ||
| + | |||
| + | Aquest sistema pot generar '' | ||
| + | |||
| + | ==== Hash-based sharding ==== | ||
| + | |||
| + | S' | ||
| + | |||
| + | Avantatges: | ||
| + | * distribució uniforme, | ||
| + | * balanceig automàtic, | ||
| + | * evita hotspots. | ||
| + | |||
| + | És l’estratègia recomanada per càrregues generals. | ||
| + | |||
| + | ==== List-based sharding ==== | ||
| + | |||
| + | Les dades es reparteixen segons valors predefinits. | ||
| + | |||
| + | Exemple: | ||
| + | * Espanya → shard1 | ||
| + | * França → shard2 | ||
| + | |||
| + | ===== Components d’un cluster MongoDB ===== | ||
| + | |||
| + | ^ Component ^ Funció ^ | ||
| + | | Config Server | Emmagatzema les metadades del cluster | | ||
| + | | Shards | Emmagatzemen les dades | | ||
| + | | Mongos | Router que distribueix les peticions | | ||
| + | |||
| + | ===== Arquitectura ===== | ||
| + | |||
| + | < | ||
| + | +----------------+ | ||
| + | | | ||
| + | +--------+-------+ | ||
| + | | | ||
| + | +----------------+----------------+ | ||
| + | | | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | +------------------+ | ||
| + | | Config Server | ||
| + | +------------------+ | ||
| + | </ | ||
| + | |||
| + | ===== Exemple pràctic sobre Fedora Linux===== | ||
| + | |||
| + | ==== Crear directori de treball ==== | ||
| + | |||
| + | <code bash> | ||
| + | mkdir / | ||
| + | cd / | ||
| + | </ | ||
| + | |||
| + | ==== Crear el Docker Compose ==== | ||
| + | |||
| + | Crear el fitxer '' | ||
| + | |||
| + | <code yaml> | ||
| + | version: " | ||
| + | |||
| + | services: | ||
| + | |||
| + | configsvr: | ||
| + | container_name: | ||
| + | image: mongo:4.4 | ||
| + | restart: always | ||
| + | command: > | ||
| + | mongod --configsvr --replSet configReplSet --port 27019 --bind_ip_all | ||
| + | ports: | ||
| + | - " | ||
| + | volumes: | ||
| + | - configdb:/ | ||
| + | |||
| + | shard1: | ||
| + | container_name: | ||
| + | image: mongo:4.4 | ||
| + | restart: always | ||
| + | command: > | ||
| + | mongod --shardsvr --replSet shard1ReplSet --port 27018 --bind_ip_all | ||
| + | ports: | ||
| + | - " | ||
| + | volumes: | ||
| + | - shard1db:/ | ||
| + | |||
| + | shard2: | ||
| + | container_name: | ||
| + | image: mongo:4.4 | ||
| + | restart: always | ||
| + | command: > | ||
| + | mongod --shardsvr --replSet shard2ReplSet --port 27018 --bind_ip_all | ||
| + | ports: | ||
| + | - " | ||
| + | volumes: | ||
| + | - shard2db:/ | ||
| + | |||
| + | mongos: | ||
| + | container_name: | ||
| + | image: mongo:4.4 | ||
| + | restart: always | ||
| + | depends_on: | ||
| + | - configsvr | ||
| + | - shard1 | ||
| + | - shard2 | ||
| + | command: > | ||
| + | mongos --configdb configReplSet/ | ||
| + | ports: | ||
| + | - " | ||
| + | |||
| + | volumes: | ||
| + | configdb: {} | ||
| + | shard1db: {} | ||
| + | shard2db: {} | ||
| + | </ | ||
| + | |||
| + | ===== Persistència i reinici automàtic ===== | ||
| + | |||
| + | 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: | ||
| + | |||
| + | <code yaml> | ||
| + | restart: always | ||
| + | </ | ||
| + | |||
| + | Aquesta directiva permet reiniciar automàticament els contenidors després d’un reinici del sistema o de la màquina. | ||
| + | |||
| + | ===== Inicialitzar els contenidors ===== | ||
| + | |||
| + | <code bash> | ||
| + | docker-compose up -d | ||
| + | docker ps | ||
| + | </ | ||
| + | |||
| + | ===== Inicialitzar el Config Server ===== | ||
| + | |||
| + | Accedir al contenidor: | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it configsvr mongo --port 27019 | ||
| + | </ | ||
| + | |||
| + | Inicialitzar el Replica Set: | ||
| + | |||
| + | <code javascript> | ||
| + | rs.initiate({ | ||
| + | _id: " | ||
| + | configsvr: true, | ||
| + | members: [ | ||
| + | { _id: 0, host: " | ||
| + | ] | ||
| + | }) | ||
| + | </ | ||
| + | |||
| + | ===== Inicialitzar shard1 ===== | ||
| + | |||
| + | Accedir al contenidor: | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it shard1 mongo --port 27018 | ||
| + | </ | ||
| + | |||
| + | Inicialitzar el Replica Set: | ||
| + | |||
| + | <code javascript> | ||
| + | rs.initiate({ | ||
| + | _id: " | ||
| + | members: [ | ||
| + | { _id: 0, host: " | ||
| + | ] | ||
| + | }) | ||
| + | </ | ||
| + | |||
| + | ===== Inicialitzar shard2 ===== | ||
| + | |||
| + | Accedir al contenidor: | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it shard2 mongo --port 27018 | ||
| + | </ | ||
| + | |||
| + | Inicialitzar el Replica Set: | ||
| + | |||
| + | <code javascript> | ||
| + | rs.initiate({ | ||
| + | _id: " | ||
| + | members: [ | ||
| + | { _id: 0, host: " | ||
| + | ] | ||
| + | }) | ||
| + | </ | ||
| + | |||
| + | ===== Afegir shards al cluster ===== | ||
| + | |||
| + | Connectar al router '' | ||
| + | |||
| + | <code bash> | ||
| + | docker exec -it mongos mongo --port 27017 | ||
| + | </ | ||
| + | |||
| + | Afegir els shards: | ||
| + | |||
| + | <code javascript> | ||
| + | sh.addShard(" | ||
| + | sh.addShard(" | ||
| + | </ | ||
| + | |||
| + | ===== Activar sharding ===== | ||
| + | |||
| + | Activar el '' | ||
| + | |||
| + | <code javascript> | ||
| + | sh.enableSharding(" | ||
| + | </ | ||
| + | |||
| + | ===== Configurar la col·lecció ===== | ||
| + | |||
| + | La següent instrucció activa el '' | ||
| + | |||
| + | <code javascript> | ||
| + | sh.shardCollection( | ||
| + | " | ||
| + | { _id: " | ||
| + | ) | ||
| + | </ | ||
| + | |||
| + | On: | ||
| + | * '' | ||
| + | * '' | ||
| + | * ''" | ||
| + | |||
| + | ===== Inserir dades ===== | ||
| + | |||
| + | Crear la base de dades, la col·lecció i inserir les dades (en el mongos): | ||
| + | |||
| + | <code javascript> | ||
| + | use testDB | ||
| + | |||
| + | for (let i = 0; i < 1000; i++) { | ||
| + | db.users.insert({ | ||
| + | name: " | ||
| + | value: i | ||
| + | }) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Comprovar la distribució ===== | ||
| + | |||
| + | <code javascript> | ||
| + | db.users.getShardDistribution() | ||
| + | </ | ||
| + | |||
| + | Amb aquesta comanda es pot veure els percentatges de distribució | ||
| + | També es pot entrar a cada shard, entrar a la base de dades i veure el contingut de la col·lecció | ||
| + | |||
| + | ===== Consultar la configuració ===== | ||
| + | |||
| + | <code javascript> | ||
| + | use config | ||
| + | |||
| + | db.collections.find({ | ||
| + | _id: " | ||
| + | }) | ||
| + | </ | ||
| + | |||
| + | ===== Limitacions de l’entorn ===== | ||
| + | |||
| + | Aquest exemple implementa un cluster '' | ||
| + | |||
| + | Cal tenir en compte que: | ||
| + | * tots els contenidors s’executen sobre una única màquina, | ||
| + | * els shards no estan distribuïts físicament, | ||
| + | * només s’utilitzen dos shards, | ||
| + | * cada shard disposa d’un únic node, | ||
| + | * no s’han configurat rèpliques per alta disponibilitat. | ||
| + | |||
| + | Per tal de poder observar millor els beneficis del '' | ||
| + | |||
| + | En un entorn de producció: | ||
| + | * cada shard acostuma a executar-se en servidors diferents, | ||
| + | * els shards solen implementar-se mitjançant Replica Sets, | ||
| + | * s’utilitzen mecanismes de monitoratge i tolerància a fallades. | ||
| + | |||
| + | ===== Conclusions ===== | ||
| + | |||
| + | El '' | ||
| + | |||
| + | L’ús de '' | ||
| + | * el balanceig automàtic, | ||
| + | * la distribució uniforme, | ||
| + | * la reducció de hotspots. | ||