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:
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:
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:
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:
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:
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:
Verifichiamo pertanto il cambio del primario attraverso la connessione creata in precedenza: