Marvin Pascale

[B.Log]

14 Agosto 2021

MongoDB Replicaset

MogoDB 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: