MongoDB: Replica set (HA)
Come configurare un replica set ad alta disponibilità
Un replica set è un gruppo di nodi MongoDB che lavorano insieme per garantire alta disponibilità e migliori prestazioni duplicando i dati su più server. Con un replica set, il database rimane accessibile anche se uno dei nodi va offline e si possono gestire più richieste distribuendo il carico di lavoro.
Esempio di un replica set con 3 nodi
In una configurazione ad alta disponibilità, se un nodo si disconnette, i dati restano comunque disponibili tramite gli altri nodi. Anche le prestazioni migliorano perché tutte le operazioni di scrittura vengono indirizzate al nodo primario, mentre le letture possono essere distribuite sui nodi secondari.
Se è la prima volta che utilizza i replica set, può consultare la documentazione ufficiale di MongoDB per ulteriori informazioni.
Come funzionano i replica set
Per configurare un replica set, sono necessari almeno tre nodi MongoDB:
- Un nodo funge da primary, gestendo tutte le operazioni di scrittura e, per impostazione predefinita, anche quelle di lettura.
- Gli altri nodi sono secondaries. Replicano continuamente i dati dal primary quasi in tempo reale.
Se un nodo secondario diventa indisponibile, l'applicazione continua a funzionare normalmente. Quando il secondario si riunisce al cluster, sincronizza i dati mancanti e si aggiorna rispetto al resto del replica set.
Se il nodo primario si guasta, il replica set avvia automaticamente un'elezione per selezionare un nuovo primary. Questo processo richiede solitamente circa 10 secondi. Durante questo intervallo, il replica set è in sola lettura. Una volta eletto il nuovo primary, tutte le operazioni riprendono normalmente.
Esempio di un'elezione
Come iniziare con un replica set MongoDB
Per creare un replica set su Stackhero, sono necessarie almeno tre istanze MongoDB. Ecco una guida passo-passo:
- Avvii le sue tre (o più) istanze MongoDB dal dashboard di Stackhero.
- Dopo che le istanze sono attive, aggiorni la loro configurazione dal dashboard:
- Imposti la stessa password admin su ogni istanza.
- Attivi l'opzione Attiva replica set.
- Scelga un nome del replica set e una chiave segreta che tutti i nodi condivideranno. (Nota: Il nome del replica set non può essere modificato dopo la creazione. Se ha dubbi,
rs-1è un buon valore predefinito.)
Ricordi che TUTTE le istanze devono avere una configurazione identica (password admin, nome del replica set e chiave segreta del replica set).
Una volta salvata la configurazione, dovrà definire tutti i membri del replica set all'interno di MongoDB. Ecco come procedere:
- Può utilizzare questo comando per connettersi tramite la Mongo CLI:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true
Se non ha installato la Mongo CLI, può utilizzare l'immagine Docker ufficiale con questo comando:
> docker run -it mongo /bin/bash
Questo comando apre una shell dove può eseguire direttamente i comandi Mongo.
- Dopo la connessione, può inizializzare il replica set con il seguente comando. Ricordi di sostituire
_idcon il nome scelto per il replica set e di aggiornare i nomi host dei membri secondo necessità:
rs.initiate({
_id: "rs-1",
members: [
{ _id: 0, host: "<XXXXXX>.stackhero-network.com:27017" },
{ _id: 1, host: "<XXXXXX>.stackhero-network.com:27017" },
{ _id: 2, host: "<XXXXXX>.stackhero-network.com:27017" }
]
})
Se il comando va a buon fine, vedrà una risposta simile a { "ok" : 1 }.
- Se desidera consultare la configurazione del replica set, può eseguire:
rs.conf()
È sufficiente applicare questa configurazione su un solo nodo. Gli altri nodi vengono aggiornati automaticamente.
Il suo replica set MongoDB dovrebbe ora essere operativo.
Verificare lo stato del replica set MongoDB
Per aiutarla a monitorare lo stato del replica set, abbiamo creato uno script Node.js che controlla lo stato ogni secondo. Può trovare questo script sul nostro repository GitHub.
Screenshot dello script
Risoluzione dei problemi
Gestire l'errore: "network error while attempting to run command 'isMaster' on host"
Se visualizza questo errore, di solito è perché la crittografia TLS non è stata abilitata. Può risolvere aggiungendo il flag tls=true all'URL di connessione. Ad esempio:
mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true