MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB self-hosted

Probabilmente stai ospitando il tuo MongoDB su un provider di servizi cloud affidabile, ad esempio Atlas, perché vuoi davvero concentrarti sulla tua idea e delegare tutte le sottili aree di gestione delle chiavi come networking, archiviazione, accesso, ecc.

All'inizio sembra tutto a posto fino a quando la tua piccola idea non inizia a trasformarsi in un business e il costo inizia a salire alle stelle. Anche se non è così, questo post ti fornirà comunque una panoramica generale delle complessità tecniche coinvolte (e dei soldi risparmiati!) Se dovessi migrare a una soluzione self-hosted.

A proposito, di quanti risparmi stiamo parlando? Facciamo un rapido confronto tra un Atlante istanza e un MongoDB self-hosted su AWS .

Atlante (~$166/mese)

$ 0,23/ora in base ai requisiti sopra selezionati (~ cloud.mongodb.com)



AWS (~$36/mese)

$ 0,0416/ora per l'istanza e prezzi aggiuntivi in ​​base al tipo di EBS e allo storage (~ calculator.aws)

Si tratta di un risparmio di quasi 4,5 volte solo in termini di infrastruttura!

Ora che conosci i principali perché e stai ancora leggendo questo post, senza ulteriori indugi, tuffiamoci nella tecnologia.

Contorno

  1. Configurazione dell'infrastruttura
  2. Configurazione di MongoDB
  3. Migrazione collettiva
  4. Delta-sync per colmare la latenza dello switch di connessione (non applicabile ai cluster obsoleti)

Poiché l'intero contenuto può essere un po' estenuante in un posto, lo dividerò in 2 post correlati.

1. Allestimento dell'infrastruttura

Di seguito menzionerò la guida per la configurazione di un'istanza che esegue RedHat Enterprise Linux 8 su AWS. Questo perché MongoDB generalmente funziona meglio con il file system xfs. Ecco un articolo per capirlo meglio.

Fai girare un'istanza EC2

Ho usato un t3.small istanza fornita con 2 vCPU e 2 GB di RAM anche se puoi selezionare qualsiasi istanza di tua scelta.

È consigliabile che il database abbia accesso ad almeno 1 GB di RAM e 2 core reali poiché ciò influisce direttamente sulle prestazioni durante la memorizzazione nella cache e i meccanismi di concorrenza gestiti dal motore predefinito WiredTiger . Puoi leggere ulteriori informazioni sulle note di produzione relative ai requisiti di RAM e CPU qui .

Panoramica della configurazione:

  • OS:Redhat Enterprise Linux 8 (basato su Intel x64)
  • Tipo di istanza:t3.small
  • Archiviazione:10 GB (os) + 30 GB (dati) + 3GB (registri) di EBS ovvero 3 volumi separati

Presumo che tu abbia familiarità con la creazione di una VM su AWS.

Ora, una volta che l'istanza è in esecuzione, assegna un IP elastico ad esso e quindi eseguire semplicemente un accesso remoto nella macchina.

Avremo bisogno dell'IP elastico per impostare il nome host pubblico per l'istanza

$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>

Monta volumi aggiuntivi

Abbiamo aggiunto 2 volumi EBS aggiuntivi oltre a Root FS per dati e log che devono ancora essere montati (Ricordi 30Gb e 3Gb? ). Puoi elencare i blocchi di volume usando,

$ sudo lsblk

I volumi aggiuntivi verranno elencati subito dopo il blocco principale (fare riferimento alle frecce)

Nell'immagine sopra, puoi vedere che i volumi aggiuntivi sono denominati

  1. xvdb (30 Gb di spazio per memorizzare i dati)
  2. xvdc (3 Gb di spazio per archiviare i registri)

Ora creiamo i file system in quei volumi.

$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc

-L è un'opzione alias per impostare l'etichetta del volume

E poi monta i volumi.

$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb

Affinché queste modifiche si riflettano, è necessario riavviare il sistema. Quindi, ora abbiamo anche bisogno della persistenza della partizione in modo che in caso di riavvio non intenzionale non perdiamo la memoria del database.

Possiamo ottenere ciò specificando le regole di montaggio nel file fstab. Puoi leggere di più a riguardo qui.

Prima di ciò, copiamo l'UUID delle partizioni sopra (perché sono uniche e non cambieranno al riavvio del sistema )

$ sudo blkid

Copia gli UUID elencati per /dev/xvdb e /dev/xvdc . Fare riferimento a "ETICHETTA" per l'identificazione del blocco

Ora apri il /etc/fstab archiviare e incollare la configurazione nel seguente formato.

UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0

Aggiorna nome host

Il nome host verrà utilizzato per identificare il server del database sulla rete. Puoi utilizzare l'IP elastico sopra assegnato o Nome di dominio (se disponibile). Apri il /etc/hostname archiviare e aggiungere la voce. Ad es.

ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...

Aggiorna i limiti del processo (facoltativo)

Questo è facoltativamente richiesto per controllare il numero massimo di connessioni accettabili mantenendo stabile il sistema. Apri il /etc/security/limits.conf file e aggiungi le seguenti voci.

* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000

Ora che tutti i prerequisiti infra correlati sono stati ordinati, riavvia l'istanza e procediamo all'installazione di MongoDB.

1. Configurazione di MongoDB

Aggiungi la sorgente Repo

Crea un file /etc/yum.repos.d/mongodb-org.4.2.repo e aggiungi i seguenti dettagli del repository del pacchetto.

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

Ora installiamo MongoDB.

$ sudo yum -y install mongodb-org

Crea directory e permessi di configurazione

MongoDB per impostazione predefinita utilizza i seguenti percorsi per archiviare i dati e i registri interni:

/var/lib/mongo → Dati
/var/log/mongodb → Registri

Crea le directory

$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb

Modifica le autorizzazioni di utenti e gruppi

$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod

Crea un utente amministratore

Il demone/servizio mongod deve essere prima in esecuzione prima di procedere alla creazione di un utente. Usiamo la configurazione predefinita (memorizzata in /etc/mongod.conf ) per ora e avvia il processo del demone.

$ sudo -u mongod mongod -f /etc/mongod.conf

Il comando precedente avvierà il demone mongod in modalità fork (impostazione predefinita).

Ora accediamo al server e creiamo il nostro primo utente amministratore.

Apri una conchiglia mongo

$ mongo

Utilizza il database "admin" per creare l'amministratore root

> use admin

Crea l'utente amministratore

> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})

Crea un utente normale

> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})

Chiudi il server per ora. Ripartiremo con la configurazione modificata

> db.shutDownServer()

Configurazione dell'autenticazione

Qui abiliteremo l'autenticazione del database e modificheremo l'indirizzo di collegamento affinché il nostro server sia accessibile nel pubblico dominio. Apri /etc/mongod.conf e apporta le modifiche seguenti.

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 # accessible on the network address
security:
  authorization: enabled # creds will be required for making db operations

Salva la configurazione e riavvia il server.

$ sudo -u mongod mongod -f /etc/mongod.conf

Test di accesso

Puoi verificare se le credenziali funzionano utilizzando,

$ mongo -u admin -p password

Questo è tutto sulla configurazione iniziale! Resta sintonizzato per il mio prossimo post correlato sul processo di migrazione dettagliato e suggerimenti su come mantenere il DB pronto per la produzione.

PS Grazie a Piyush Kumar per aver contribuito a curare questo post!