MongoDB Replicaset
Come detto nel precedente post MongoDB è noto per la sua alta affidabilità e scalabilità orizzontale. Oggi vedremo quella che è la soluzione più utilizzata: un cluster replica o Replicaset.
Replicaset
Un replicaset è un insieme processi mongod (consigliati almeno 3) che lavorano al fine di mantenere lo stesso insieme di dati. In fase di inizializzazione, tramite una elezione, viene nominato un nodo primary che sarà il cuore pulsante del nostro replicaset. Con le impostazioni di default tutte le chiamate in scrittura e lettura verranno inoltrare al nodo primary che si occuperà di soddisfarle.
Quante copie del dato?
Di default MongoDB crea una copia del dato su ogni istanza mongod presente nel replicaset ma è possibile limitare questo utilizzo di risorse disco specificando un nodo arbiter. Un arbiter è un nodo che non contene alcun dato ma entra in gioco in fase di elezione del primary. Quindi in uno scenario con tre nodi di cui uno è un arbiter avremo due copie dello stesso dato.
Carico di lavoro?
Normalmente tutte le richieste vengono inviate al nodo primary ma con tutti i moderni driver (client che ci permettono di comunicare con MongoDB) è possibile specificare ad esempio che le operazioni in lettura possano essere inviate ad un nodo mongod secondary (non arbiter per ovvi motivi). Facendo così si distribuisce in minima parte il carico di lavoro sui nodi secondary.
Configurazione
Nell scorso ariticolo abbiamo visto come si installa e si configura MongoDB. Per avere un replicaset basta replicare l’installazione su tutti i nodi. Di seguito vedremo come configurare mongod e come inizializzare il cluster in replica.
Esporre mongod
Nel file con configurazione /etc/mongod.conf bisogna modificare il bind per permettere la comunicazione con l’esterno.
net:
bindIp: 0.0.0.0
Utilizzando la wildcard “0.0.0.0” mongod sarà in ascolto su tutte le interfacce di rete. In alternativa è possibile inserire l’ip sul quale esporre il servizio (nb: è possible inserire più indirizzi ip separati da virgola).
Chiave condivisa
Uno dei meccanismi più comodi per l’autenticazione tra i nodi è di certo quella chiave condivisa e per fortuna mongod offre questo sistema di “riconoscimento”.
Per generare una chiave valida è sufficiente lanciare il comando
# openssl rand -base64 756 > /etc/mongod.key
e copiarla su tutti i nodi (nello stasso path) sui quali avvieremo MongoDB.
nb: la chiave deve avere permessi 600 altrimenti il servizio mongod non si avvierà.
Scelta del nome
L’ultimo passo (almeno per oggi) è quello di dare un nome al nostro Replicaset.
Fatto?! Bene
Ora siamo pronti per modificare il file mongod.conf e tentare il primo avvio.
/etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /etc/mongod.key
#operationProfiling:
replication:
replSetName: pappappero
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
Avviamo il servizio mongod
# systemctl start mongod
Inizializzazione
Avviato mongod su tutti i nodi dobbiamo inizializzare il replicaset e avere la prima elezione.
Prepariamo il comando di inizializzazione
rs.initiate( {
_id : "pappappero",
members: [
{ _id: 0, host: "mongodb0.example.net:27017" },
{ _id: 1, host: "mongodb1.example.net:27017" },
{ _id: 2, host: "mongodb2.example.net:27017" }
]
})
Apriamo una shell su un nodo e lanciamo il comando.
# mongo
> rs.initiate( {
_id : "pappappero",
members: [
{ _id: 0, host: "mongodb0.example.net:27017" },
{ _id: 1, host: "mongodb1.example.net:27017" },
{ _id: 2, host: "mongodb2.example.net:27017" }
]
})
pappappero:PRIMARY>
Utente admin
Dopo l’inizializzazione abbiamo la possibilità di creare l’utente admin supremo.
NB: Non lasciamoci sfuggire questa opportunità perché se lasciassimo la sessione prima di creare l’utente resteremo chiusi fuori dal nostro replicaset.
pappappero:PRIMARY> use admin;
pappappero:PRIMARY> db.createUser({
user: 'mongone',
pwd: 'passwordSuperSicura',
roles :
[
{ role: "root", db: "admin" }
]
});
Ora abbiamo il nostro Replicaset funzionante e possiamo testare la connessione utilizzando la mongouri.
Per creare la nostra URI dobbiamo utilizzare questo schema: mongodb://[user]:[password]@[nodo1]:[porta],[nodo2]:[porta],[nodoN]:[porta]/[DB]?[parametri]
Nel nostro caso sarà:
mongodb://mongone:[email protected]:27017,mongodb1.example.net:27017,mongodb2.example.net:27017/?authSource=admin&replicaSet=pappappero
Ora possiamo utilizzare il nostro cluster MongoDB Replicaset.
Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.
Risorse: