[MongoDB] Replica Set in ambiente di Test e Sviluppo

Rispondi
Roberto
Amministratore
Messaggi: 161
Iscritto il: 19/12/2009, 19:30

[MongoDB] Replica Set in ambiente di Test e Sviluppo

Messaggio da Roberto »

Vediamo come configurare velocemente un Replica Set da utilizzare in ambiente di Test e Sviluppo su un'unica macchina.

Un Replica Set dovrebbe essere sempre formato da un numero dispari di membri per evitare problemi nel meccanismo di elezione (in questo esempio sara’ formato da 3 membri).

Per ogni istanza server (per ogni membro) sulla macchina va creata una struttura file simile alla seguente:

Codice: Seleziona tutto

mkdir –p /srv/mongodb/rs0-0
mkdir –p /srv/mongodb/rs0-1
mkdir –p /srv/mongodb/rs0-2
In questo modo avremo creato 3 directory “rs0-0”, “rs0-1” e “rs0-2” che conterranno i dati di ognuno de membri facenti parte del Replica Set.

Per ogni membro del Replica Set eseguiamo adesso la relativa istanza attraverso i seguenti comandi:

Codice: Seleziona tutto

mongod --port 27017 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128
mongod --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128
mongod --port 27019 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128
Poichè stiamo lavorando in locale ogni membro viene eseguito su una porta distinta (--port), vengono specificate le relative directory dati (--dbpath) e viene scelto “rs0” come nome del Replica Set (--replSet). Le impostazioni --smallfiles e --oplogSize servono a ridurre lo spazio di memoria utilizzato dalle istanze (utile solo in fase di test e sviluppo).

Connettiamoci adesso ad una delle istanze indicando la relativa porta:

Codice: Seleziona tutto

mongo --port 27017
Per inizializzare un Replica Set bisogna creare una variabile di configurazione come la seguente:

Codice: Seleziona tutto

rsconf = { _id: “rs0”,
		members: [ {
			_id: 0,
			host: “localhost:27017”
		} ]
	}
Passare dunque la configurazione con il seguente comando:

Codice: Seleziona tutto

rs.initiate(rsconf)
A questo punto non rimane che aggiungere gli altri membri del Replica Set:

Codice: Seleziona tutto

rs.add(“<hostname>:27018”)
rs.add(“<hostname>:27019”)
In questo momento abbiamo un Replica Set completamente funzionante, per vedere la configurazione e lo stato del Replica Set possiamo utilizzare i seguenti comandi:

Codice: Seleziona tutto

rs.conf()
rs.status()
A questo punto possiamo effettuare delle normali operazioni sul database e verificare la loro propagazione a tutti i membri del Replica Set. Creo una variabile legata al primario:

Codice: Seleziona tutto

conn1 = new Mongo(“localhost:27017”)
primaryDB = conn1.getDB(“test”)
Cominciamo adesso a popolare la nostra base di dati andando ad inserire per esempio 1.000 documenti:

Codice: Seleziona tutto

for ( i = 0; i < 1000; i++ ) {
	 primaryDB.coll.insert ( { count: i } )
}
Faccio una verifica veloce per vedere che siano effettivamente stati inseriti 1000 documenti sul primario al quale siamo connessi:

Codice: Seleziona tutto

primaryDB.coll.count()
Se l'operazione di propagazione e' andata a buon fine dovrei avere lo stesso risultato effettuando questo conteggio anche sugli altri due server. Creo pertanto una seconda connessione su uno dei secondari:

Codice: Seleziona tutto

conn2 = new Mongo(“localhost:27018”)
secondaryDB = conn2.getDB(“test”)
Se effettuiamo a questo punto l'operazione di lettura otteniamo un errore in quanto come ben sapete, di default tutte le operazioni di scrittura e lettura possono essere fatte soltanto sul Primario. Abilitiamo pertanto prima la lettura sul secondario al quale siamo connessi e poi effettuiamo il conteggio:

Codice: Seleziona tutto

conn2.setSlaveOk()
secondaryDB.coll.count()
Verifichiamo infine il funzionamento del meccanismo di elezione di un Primario. Se il primario per qualunque motivo va giù, uno dei secondari verrà automaticamente eletto a primario; fermiamo pertanto l’attuale primario:

Codice: Seleziona tutto

primaryDB.adminCommand({shutdown: 1})
Verifichiamo pertanto il cambio del primario attraverso la connessione creata in precedenza:

Codice: Seleziona tutto

secondaryDB.status()
Roberto
Amministratore
Messaggi: 161
Iscritto il: 19/12/2009, 19:30

Re: [MongoDB] Replica Set in ambiente di Test e Sviluppo

Messaggio da Roberto »

Vi mostro adesso una variante della configurazione utilizzata in precedenza che prevede un architettura formata da 2 Server ed 1 Arbitro; giusto per completezza di informazione vi ricordo che l'Arbitro ha esclusivamente funzione in fase di votazione, esso non memorizza alcun dato della vostra base di dati ed in produzione va installato sempre su una macchina indipendente.

Il procedimento e' tale e quale a quello visto in precedenza, ma al posto del terzo server va configurato l'arbitro predisponendo una nuova directory per i suoi dati:

Codice: Seleziona tutto

mkdir –p /srv/mongodb/arbitro
Eseguiamo la relativa istanza mongo server:

Codice: Seleziona tutto

mongod --port 30000 --dbpath /srv/mongodb/arbitro --replSet rs0
Ci connettiamo adesso alla prima istanza Server:

Codice: Seleziona tutto

mongo --port 27017
Creiamo la variabile di configurazione come visto in precedenza ed inizializziamo il Replica Set; nel momento in cui dobbiamo aggiungere i membri al replica set, al posto del terzo server aggiungiamo l'arbitro nel seguente modo:

Codice: Seleziona tutto

rs.addArb(“<hostname>:30000”)
A questo punto abbiamo il nostro Replica Set configurato e funzionante e possiamo effettuare normalmente tutte le operazioni viste in precedenza.

Ing. Roberto Basile
Rispondi