How To – ambiente di test per mongodb – infrastruttura

Visto che abbiamo parlato di mongodb, affrontiamo la realizzazione di un piccolo ambiente di test che ci permetta di testare tutte le funzionalità del prodotto.

Questo articolo vuole essere solo una quida pratica, per maggiori dettagli sul prodotto si può fare riferimento al mio articolo o al sito ufficiale del prodotto.

Vogliamo realizzare un sistema che possa effettuare sia sharding sia replica dei dati. Trattandosi di un ambiente di test avvieremo tutti i demoni coinvolti sullo stesso server. La configurazione finale sarà:

  1. 3 config server
  2. 1 control server
  3. 6 demoni di dati

questi ultimi saranno organizzati in 2 ReplicaSet ognuno contenente 1 Primary server, 1 secondary server ed un arbiter.

Il primo passo è ovviamente istallare il prodotto. Si può scaricare l’ultima versione dal sito del produttore o utilizzare il gestore di pacchetti della propria distribuzione.

Se si utilizza un sistema debian o derivato bisognerà eseguire come utente root:
aptitude update
aptitude install mongodb

Se si è utilizzato  Ubuntu 13.04 si avrà mongo nella versione 2.2.4.

Almeno su debian e derivati quello che viene istallato dal gestore di pacchetti è un demone autonomo: non essendo quello che interessa a noi, procederemo fermandolo e modificando l’ambiente in modo da ospitare la nostra architettura.

Da qui conviene lavorare come utente root.
ps aux|grep mongodb ci dirà se ci sono demoni da interrompere. Eventualmente procederemo con un kill al loro spegnimento.

Dobbiamo poi assicurarci che il demone non riparta al riavvio della macchina:
update-rc.d -f mongodb remove

Assicuriamoci dell’esistenza dell’ utente mongodb e del gruppo omonimo con cui far girare i demoni mongodb:
grep mongo /etc/user
che restituirà qualche cosa come
mongodb:x:121:65534::/home/mongodb:/bin/false
e se non presente creiamolo
Analogamente per il gruppo
grep mongo /etc/group
che restituirà qualche cosa come
mongodb:x:133:mongodb
e se non presente creiamolo.

Creiamo delle directory per accogliere i dati e i log
mkdir /var/lib/mongodb/
mkdir /var/lib/mongodb/cfg1
mkdir /var/lib/mongodb/cfg2
mkdir /var/lib/mongodb/cfg3
mkdir /var/lib/mongodb/ctrl
mkdir /var/lib/mongodb/rs11
mkdir /var/lib/mongodb/rs12
mkdir /var/lib/mongodb/rs1a
mkdir /var/lib/mongodb/rs21
mkdir /var/lib/mongodb/rs22
mkdir /var/lib/mongodb/rs2a
mkdir /var/log/mongodb/

e assegnamogli utenza e gruppo
chown -R mongodb:mongodb /var/lib/mongodb/
chown -R mongodb:mongodb /var/log/mongodb/

Avviamo ora i config servers:

sudo -u mongodb /usr/bin/mongod --port 27001 --dbpath /var/lib/mongodb/cfg1 --configsvr --fork --rest --logpath /var/log/mongodb/cfg1.log
sudo -u mongodb /usr/bin/mongod --port 27002 --dbpath /var/lib/mongodb/cfg2 --configsvr --fork --rest --logpath /var/log/mongodb/cfg2.log
sudo -u mongodb /usr/bin/mongod --port 27003 --dbpath /var/lib/mongodb/cfg3 --configsvr --fork --rest --logpath /var/log/mongodb/cfg3.log

il control server
sudo -u mongodb /usr/bin/mongos --port 27021 --configdb localhost:27001,localhost:27002,localhost:27003 --fork --logpath /var/log/mongodb/ctrl.log
I nodi dati

sudo -u mongodb /usr/bin/mongod --port 27101 --dbpath /var/lib/mongodb/rs11 --replSet rs1 --shardsvr --rest --fork --logpath /var/log/mongodb/rs11.log
sudo -u mongodb /usr/bin/mongod --port 27102 --dbpath /var/lib/mongodb/rs12 --replSet rs1 --shardsvr --rest --fork --logpath /var/log/mongodb/rs12.log
sudo -u mongodb /usr/bin/mongod --port 27103 --dbpath /var/lib/mongodb/rs1a --replSet rs1 --rest --fork --logpath /var/log/mongodb/rs1a.log
sudo -u mongodb /usr/bin/mongod --port 27201 --dbpath /var/lib/mongodb/rs21 --replSet rs2 --shardsvr --rest --fork --logpath /var/log/mongodb/rs21.log
sudo -u mongodb /usr/bin/mongod --port 27202 --dbpath /var/lib/mongodb/rs22 --replSet rs2 --shardsvr --rest --fork --logpath /var/log/mongodb/rs22.log
sudo -u mongodb /usr/bin/mongod --port 27203 --dbpath /var/lib/mongodb/rs2a --replSet rs2 --rest --fork --logpath /var/log/mongodb/rs2a.log

Attenzione che ogni nodo dati prealloca ~3GB di spazio disco.
Il passo successivo è quello di creare i ReplicaSet. I ReplicaSet si controllano dal nodo primary degli stessi; connettiamoci quindi ad uno dei nodi
mongo --port 27101
dalla linea dicomando
conf = { _id: "rs1", members: [ { _id: 0, host: "localhost:27101" } ] }
rs.initiate( conf )

si può poi visualizzare lo stato della configurazione
rs.conf()
il prompt dovrebbe a questo punto riportare la dicitura “PRIMARY”.
Aggiungiamo ora gli altri due nodi al ReplicaSet

rs.add("localhost:27102")
rs.addArb("localhost:27103")

si può visualizzare lo stato del replicaSet con:
rs.status()

Lo stesso andrà fatto per il il secondo ReplicaSet
mongo --port 27201
dalla linea dicomando
conf = { _id: "rs1", members: [ { _id: 0, host: "localhost:27201" } ] }
rs.initiate( conf )

si può poi visualizzare lo stato della configurazione
rs.conf()
il prompt dovrebbe a questo punto riportare la dicitura “PRIMARY”.
Aggiungiamo ora gli altri due nodi al ReplicaSet

rs.add("localhost:27202")
rs.addArb("localhost:27203")

si può visualizzare lo stato del replicaSet con:
rs.status()

Passiamo infine alla preparazione dello sharding. Si lavora ora connessi al control server
mongo --port 27021
e si seleziona il database admin
use admin
Aggiungiamo poi i replicaset come elementi dello sharding
db.runCommand( { addshard: "rs1/localhost:27101"} )
db.runCommand( { addshard: "rs2/localhost:27201"} )

Nell’ultimo comando è presente il nome del replicaset; questo permette al sistema di aggiungere automaticamente tutti i nodi del ReplicaSet e di spostare le attività sul nodo secondary che diventa primary in caso di fault.

Per utilizzare realmente lo sharding bisogna poi configurare i singoli database.

Vedremo in un altro post più in dettaglio l’utilizzo del sistema

2 thoughts on “How To – ambiente di test per mongodb – infrastruttura

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *