In questa guida spieghiamo come aggiungere e togliere nodi allo sharding e come attivare lo sharding ai db e alle collections.
Per prima cosa verifichiamo che tutti i demoni sono presenti;
ps aux|grep mongo
dovrebbe restituire tre config server, 1 control server e 6 data server.
Connettiamoci al control server e di li entriamo nel db admin per vedere gli elementi dello sharding
mongo –port 27021
use admin
db.runCommand( {listshards:1} )
Si otterrà qualche cosa come
mongos> db.runCommand( {listshards:1} )
{
“shards” : [
{
“_id” : “rs1”,
“host” : “rs1/localhost:27101,localhost:27102”
},
{
“_id” : “rs2”,
“host” : “rs2/localhost:27201,localhost:27202”
}
],
“ok” : 1
}
E’ possibile rimuovere un elemento dello sharding
db.runCommand( {removeShard: “rs1/localhost:27101,localhost:27102”} )
L’operazione richiede del tempo perché comporta la ridistribuzione dei dati sugli altri shards. Il comando
db.printShardingStatus()
o
sh.status()
mostra lo stato dello sharding e quindi il progresso di questa operazione.
Altre informazioni si possono avere ripetendo il comando di rimozione.
Per aggiungere un replicaset allo sharding
db.runCommand( {addShard: “rs1/localhost:27101”} )
E’ il caso di sottolineare che tutto questo prepara solamente l’infrastruttura dello sharding che, essendo intimamente legato alla struttura dei dati richiede per essere attivato realmente degli interventi a livello di collection e database.
Procediamo quindi con la creazione di un set minimale di dati.
Per prima cosa ci si connette al control server:
mongo –port 27021
Creiamo quindi il nuovo db e verifichiamo
use mydb
db
Creiamo due documenti
a = { name : “pippo”, city : “topolinia” }
b = { name : “paperino”, city : “paperinia” }
e, infine, inseriamoli in una collection
db.personaggi.insert( a )
db.personaggi.insert( b )
Verificiamo quindi quanto è stato fatto
show collections
db.personaggi.find()
Passiamo allo sharding vero e proprio. Abilitiamo lo sharding sul database
sh.enableSharding( “mydb” )
e sulla collection
db.personaggi.ensureIndex( { “city”: 1 } )
sh.shardCollection(“mydb.personaggi”, { “city”: 1 } )
Il primo comando crea un indice sul campo city. Questo indice è necessario per poter fare lo sharding.
Ora il comando sh.status() mostrerà la lista e la posizione dei chunk (partizioni) della collection di cui è stato effettuato lo sharding.
Essendo pochissimi i documenti si troveranno tutti sullo stesso nodo. Il chunk ha infatti di default una dimensione di 64MB riducibile fino a 1MB; possiamo però divertirci a spostare sull’altro shard il chunk contenente la city topolinia:
db.adminCommand( { moveChunk : “mydb.personaggi”, find : {city : “topolinia”}, to : “rs2” } )
e verificare il risultato con
sh.status()
La scelta della chiave dello sharding e in misura minore della dimensione dei chunk sono essenziali per determinare le prestazioni del cluster ma è argomento che va oltre lo scopo di questa guida.