Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
talk:ceti_mp03 [2026/05/23 06:47] cristofol_garcia_pujol |
— (actual) | ||
|---|---|---|---|
| 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. | ||