Guida passo-passo: distribuzione di un cluster sharded MongoDB di base
Sblocca la scalabilità orizzontale con questa guida passo-passo per la distribuzione di un cluster sharded MongoDB di base. Impara a configurare i server di configurazione, a impostare i replica set di shard e a distribuire i router `mongos`. Questo tutorial copre tutto, dalla configurazione iniziale e l'inizializzazione dei componenti all'abilitazione dello sharding per i tuoi database e le tue collezioni. Perfetto per sviluppatori e amministratori, fornisce comandi pratici, best practice e passaggi di verifica per garantire un ambiente MongoDB robusto e scalabile.
Guida Passo-Passo: Implementazione di un Cluster Shardato MongoDB di Base
MongoDB, un popolare database di documenti NoSQL, eccelle nella gestione di grandi volumi di dati con alte prestazioni e flessibilità. Tuttavia, man mano che i dati crescono, un singolo server o un replica set può raggiungere i suoi limiti di scalabilità. È qui che entra in gioco lo sharding, che consente la scalabilità orizzontale distribuendo i dati su più server, o shard.
Questa guida completa ti accompagnerà attraverso l'intero processo di configurazione di un cluster shardato MongoDB funzionante. Imparerai come configurare i componenti essenziali: server di configurazione (config servers), router mongos e replica set di shard. Al termine di questo tutorial, avrai una comprensione fondamentale e un'esperienza pratica nella distribuzione di un cluster shardato progettato per un'elevata scalabilità orizzontale e disponibilità.
Comprendere i Cluster Shardati MongoDB
Un cluster shardato MongoDB è costituito da tre componenti principali che lavorano insieme per distribuire e instradare i dati:
- Shard Replica Sets: Questi sono i nodi che contengono i dati effettivi. Ogni shard è un replica set per fornire alta disponibilità e ridondanza dei dati. I dati sono partizionati tra questi shard.
- Configuration Servers (Config Servers): Questi memorizzano i metadati del cluster, inclusa la mappatura dei chunk di dati agli shard. A partire da MongoDB 3.2, i config server devono essere distribuiti come replica set (CSRS - Config Server Replica Set) per alta disponibilità e consistenza.
- Router
mongos: Questi agiscono come router di query, fornendo un'interfaccia per le applicazioni client. Un'istanzamongosdirige le operazioni client allo/agli shard appropriato/i in base ai metadati del cluster. Le applicazioni si connettono amongos, non direttamente agli shard.
Diagramma concettuale di un cluster shardato MongoDB (credito immagine: documentazione ufficiale MongoDB)
Prerequisiti
Prima di iniziare, assicurati di avere quanto segue:
- Più Macchine/VM: Per un cluster shardato veramente distribuito, avrai bisogno di almeno 6-9 macchine/VM/container Docker. Per questo tutorial di base, possiamo simularlo su una singola macchina utilizzando porte diverse, ma ricorda che una configurazione di produzione richiede risorse dedicate.
- 3 per i Config Servers (configSrv01, configSrv02, configSrv03)
- Minimo 2-3 per ogni Shard (es. Shard01-RS01, Shard01-RS02, Shard01-RS03; Shard02-RS01, ...)
- 1+ per i Router
mongos
- Installazione di MongoDB: MongoDB 4.2+ installato su tutte le macchine che ospiteranno istanze
mongodomongos. Puoi trovare le istruzioni di installazione sulla Documentazione MongoDB. - Networking: Assicurati che tutte le macchine possano comunicare tra loro sulle porte necessarie (di default
27017,27018,27019,27020rispettivamente per i config server, gli shard e imongos, o porte personalizzate). - Struttura delle Directory: Crea directory dedicate per i dati e i log per ogni istanza
mongodemongos.
Per semplicità in questa guida, useremo localhost con porte e directory diverse. In un ambiente di produzione, useresti nomi host o indirizzi IP reali.
Struttura delle Directory Raccomandata (Esempio per configurazione localhost)
mkdir -p /data/db/configdb01 /data/db/configdb02 /data/db/configdb03
mkdir -p /data/db/shard01-rs01 /data/db/shard01-rs02 /data/db/shard01-rs03
mkdir -p /data/db/shard02-rs01 /data/db/shard02-rs02 /data/db/shard02-rs03
mkdir -p /data/log/config /data/log/shard01 /data/log/shard02 /data/log/mongos
Passaggi di Implementazione
Passaggio 1: Configurare i Server di Configurazione (Config Replica Set)
I server di configurazione memorizzano i metadati per il cluster shardato. Devono essere eseguiti come un replica set.
Avviare le istanze
mongodper i config server: Ogni istanza necessita delle opzioni--configsvre--replSet.# Config Server 1 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb01 --port 27019 --bind_ip localhost --logpath /data/log/config/configdb01.log --fork # Config Server 2 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb02 --port 27020 --bind_ip localhost --logpath /data/log/config/configdb02.log --fork # Config Server 3 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb03 --port 27021 --bind_ip localhost --logpath /data/log/config/configdb03.log --forkSuggerimento: Per la produzione, sostituire
localhostcon indirizzi IP o nomi host reali.Inizializzare il Config Replica Set: Connettiti a una delle istanze del config server e inizializza il replica set.
mongo --port 27019 ```
All'interno della shell mongo:
```javascript
rs.initiate({
_id: "cfgReplSet",
configsvr: true,
members: [
{ _id : 0, host : "localhost:27019" },
{ _id : 1, host : "localhost:27020" },
{ _id : 2, host : "localhost:27021" }
]
});
```
Verifica lo stato:
```javascript
rs.status();
```
Passaggio 2: Configurare gli Shard Replica Set
Ogni shard nel cluster è un replica set. Configureremo due shard (shard01 e shard02), ciascuno con tre membri.
Avviare le istanze
mongodper i membri dello Shard 1: Ogni istanza necessita delle opzioni--shardsvre--replSet.# Shard 1 Membro 1 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs01 --port 27030 --bind_ip localhost --logpath /data/log/shard01/shard01-rs01.log --fork # Shard 1 Membro 2 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs02 --port 27031 --bind_ip localhost --logpath /data/log/shard01/shard01-rs02.log --fork # Shard 1 Membro 3 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs03 --port 27032 --bind_ip localhost --logpath /data/log/shard01/shard01-rs03.log --forkInizializzare lo Shard 1 Replica Set: Connettiti a una delle istanze dello Shard 1.
mongo --port 27030 ```
All'interno della shell mongo:
```javascript
rs.initiate({
_id : "shard01",
members: [
{ _id : 0, host : "localhost:27030" },
{ _id : 1, host : "localhost:27031" },
{ _id : 2, host : "localhost:27032" }
]
});
```
Avviare le istanze
mongodper i membri dello Shard 2 (ripetere per shard aggiuntivi):# Shard 2 Membro 1 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs01 --port 27040 --bind_ip localhost --logpath /data/log/shard02/shard02-rs01.log --fork # Shard 2 Membro 2 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs02 --port 27041 --bind_ip localhost --logpath /data/log/shard02/shard02-rs02.log --fork # Shard 2 Membro 3 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs03 --port 27042 --bind_ip localhost --logpath /data/log/shard02/shard02-rs03.log --forkInizializzare lo Shard 2 Replica Set: Connettiti a una delle istanze dello Shard 2.
mongo --port 27040 ```
All'interno della shell mongo:
```javascript
rs.initiate({
_id : "shard02",
members: [
{ _id : 0, host : "localhost:27040" },
{ _id : 1, host : "localhost:27041" },
{ _id : 2, host : "localhost:27042" }
]
});
```
Passaggio 3: Configurare i Router mongos
Le istanze mongos sono i punti di ingresso per le applicazioni client. Devono sapere dove si trovano i config server.
Avviare le istanze
mongos: Fornisci l'opzione--configdb, elencando i membri del config replica set.# Router Mongos 1 mongos --configdb cfgReplSet/localhost:27019,localhost:27020,localhost:27021 --port 27017 --bind_ip localhost --logpath /data/log/mongos/mongos01.log --forkNota: Puoi avviare più istanze
mongosper il bilanciamento del carico e l'alta disponibilità. Tutte si connettono agli stessi config server.
Passaggio 4: Connettersi a mongos e Aggiungere Shard
Ora, connettiti a un'istanza mongos e aggiungi gli shard replica set al cluster.
Connettersi a
mongos: Usa la porta MongoDB predefinita27017o la porta personalizzata che hai specificato permongos.
mongo --port 27017 ```
Aggiungere Shard: Usa il comando
sh.addShard(), specificando il nome del replica set e uno dei suoi membri.sh.addShard("shard01/localhost:27030"); sh.addShard("shard02/localhost:27040");
Passaggio 5: Abilitare lo Sharding per un Database e una Collection
Una volta aggiunti gli shard, devi abilitare lo sharding per database specifici e poi per collection specifiche all'interno di tali database. Ciò richiede la scelta di una shard key.
Abilitare lo Sharding per un Database: Passa al database che desideri shardare ed esegui
sh.enableSharding().use mydatabase; sh.enableSharding("mydatabase");Shardare una Collection: Scegli una
shard keye usash.shardCollection().Attenzione: Scegliere una shard key efficace è fondamentale per le prestazioni e una distribuzione uniforme. Una shard key scadente può portare a hot spot o query inefficienti. Le strategie comuni includono chiavi hash, chiavi a intervallo o chiavi composite.
Per questo esempio, assumiamo una collection
mycollectioncon un campo_id.sh.shardCollection("mydatabase.mycollection"