Marvin Pascale

[B.Log]

28 Febbraio 2024

Mongodb Single Node

MongoDB

In questo articolo vedremo come installare MongoDB in configurazione nodo singolo.

Pre-requisiti

  • Una macchina con RHEL 9 o compatibile (es: Rocky Linux, Almalinux, …);
  • XFS come file system per il disco dati;
  • un’accesso con utente con privilegiato.

Mani in pasta

Di seguito i passaggi da seguire per essere pronti ad assorbire carichi di lavoro elevati.

Desidero ribadire che non mi assumo alcuna responsabilità per errori, danni o qualsiasi conseguenza derivante dall’uso delle informazioni fornite in questo articolo. L’uso delle informazioni fornite è a vostro rischio e pericolo. E’ sempre consigliabile avere un approccio cauto e informato, preferibilmente con il supporto di un professionista del settore.

Aggiunta del Repository MongoDB

  1. Configurare il repository MongoDB: crea un file ‘mongodb.repo’ in ‘/etc/yum.repos.d/’:

    # tee /etc/yum.repos.d/mongodb.repo <<EOF
    [mongodb-org-7.0]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
    EOF
    
  2. Installare MongoDB: aggiorna il tuo sistema e installa MongoDB 7.0 con ‘yum’ o ‘dnf’

    # dnf update -y
    # dnf install -y mongodb-org
    
  3. Avviare MongoDB: abilita e avvia il servizio MongoDB

    # systemctl enable --now mongod
    
  4. Verificare l’installazione: controlla lo stato del servizio MongoDB per assicurarti che sia in esecuzione correttamente

    # systemctl status mongod
    

Configurazione di Sicurezza

  1. Creazione dell’utente amministratore: Accedi al prompt di MongoDB e crea un utente amministratore

    # mongosh
    ...
    use admin
    db.createUser({
    user: "admin",
    pwd: "password_sicura",
    roles: [{ role: "root", db: "admin" }]
    })
    
  2. Modifica del file di configurazione (‘mongod.conf’): edita il file ‘/etc/mongod.conf’ per esporre il servizio e abilitare l’autenticazione

...
net:
  port: 27017
  bindIp: 0.0.0.0

security:
  authorization: "enabled"
...
  1. Riavviare MongoDB: per applicare le modifiche, riavvia il servizio

    # systemctl restart mongod
    

Configurazione per la produzione

  • Configurazione del Firewall: se il firewall è attivo, apri la porta 27017 (o la porta configurata per MongoDB)

    # firewall-cmd --add-port=27017/tcp --permanent
    # firewall-cmd --reload
    
  • Tuning del Sistema: modifica il file ‘/etc/sysctl.conf’ per migliorare le prestazioni, aggiungendo

    vm.swappiness=1
    fs.file-max=64000
    net.ipv4.tcp_keepalive_time=300
    

    Applica le modifiche con sysctl -p.

Disabilitare il THP

Disabilitare il Transparent Huge Pages (THP) può essere vantaggioso per il funzionamento di MongoDB. MongoDB e molte altri database non beneficiano del THP; anzi, può ridurre le prestazioni a causa del modo in cui gestiscono la memoria.

Il THP può migliorare le prestazioni per applicazioni che beneficiano dell’allocazione di grandi pagine di memoria. Tuttavia, MongoDB raccomanda di disabilitarlo poiché può causare problemi e incidere negativamente sulle prestazioni, inclusa una gestione meno efficiente della memoria e possibili rallentamenti.

Vediamo come fare.

Creiamo un servizio /etc/systemd/system/disable-thp.service

[Unit]
Description=Disable Transparent Huge Pages (THP)
After=sysinit.target local-fs.target
Before=mongod.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'

[Install]
WantedBy=basic.target

e lo impostiamo per l’avvio automatico:

# systemctl daemon-reload  && systemctl enable disable-thp.service

In alternativa è possibile modificare il boot

editiamo il file /etc/default/grub

cerchiamo la sezione GRUB_CMDLINE_LINUX e aggiungiamo in coda il parametro transparent_hugepage=never

es:

GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0 transparent_hugepage=never"

e aggiorniamo la configurazione di GRUB

legacy:

# grub2-mkconfig -o /boot/grub2/grub.cfg

EFI:

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

NB: In entrambi i casi dobbiamo riavviare il server.

Per verificare che sia disattivato possiamo leggere il valore di transparent_hugepage/enabled

cat /sys/kernel/mm/transparent_hugepage/enabled

l’output deve essere [never].

Limiti

  • Numero di file aperti: MongoDB mantiene molte connessioni di rete e file di dati aperti. Se il limite predefinito sul numero di file aperti (nofile) è troppo basso, MongoDB potrebbe non funzionare correttamente, portando a errori come “Too many open files”;
  • numero di thread: MongoDB utilizza thread per gestire le connessioni in entrata. Se il limite sui thread (nproc) è troppo basso, potresti vedere degradazioni delle prestazioni o il rifiuto di nuove connessioni;
  • dimensione della memoria stack: MongoDB potrebbe richiedere più memoria stack di quella predefinita, specialmente per operazioni complesse o in ambienti con carichi di lavoro elevati.

Come modificare i limiti per l’utente MongoDB

Per modificare i limiti, è necessario editare il file /etc/security/limits.conf o creare un file specifico per l’utente in /etc/security/limits.d/. Ecco come si potrebbe configurare:

editiamo il file /etc/security/limits.d/mongodb.conf

# Aggiungi le seguenti righe alla fine del file
mongodb soft nofile 64000
mongodb hard nofile 64000
mongodb soft nproc 64000
mongodb hard nproc 64000
mongodb soft stack 16384

Cosa Impostare

  • nofile: 64000 è un valore comunemente raccomandato per sistemi di produzione, ma potresti doverlo aumentare in base al tuo carico di lavoro specifico;
  • nproc: simile a nofile, 64000 è un punto di partenza, ma valuta le tue esigenze specifiche;
  • stack: 16384 (espresso in kilobyte) è un buon punto di partenza per la dimensione della memoria stack, ma potrebbe essere necessario regolarlo.

Considerazioni

  • Testa le modifiche: prima di applicare questi cambiamenti in un ambiente di produzione, testali in uno di sviluppo o staging per assicurarti che non ci siano effetti collaterali indesiderati;
  • monitoraggio post-modifica: dopo aver applicato le modifiche, monitora attentamente il sistema per verificare che le prestazioni migliorino senza introdurre problemi di stabilità o sicurezza.

In conclusione, modificare i limiti per l’utente mongodb può essere utile per ottimizzare le prestazioni e l’affidabilità di MongoDB, ma è importante valutare attentamente le esigenze specifiche del tuo ambiente e testare le modifiche prima di implementarle in produzione.

Backup e Monitoraggio

  • Backup: implementa una strategia di backup regolare utilizzando mongodump o soluzioni di backup di terze parti;
  • monitoraggio: utilizza strumenti come MongoDB Atlas, Munin, o Nagios per monitorare le prestazioni e la salute del tuo database.

Conclusione

Hai ora configurato MongoDB 7 su un sistema basato su RHEL 9, con un minimo di attenzione alla sicurezza, gestione degli utenti, e ottimizzazione per la produzione. Ricorda di testare sempre la tua configurazione in un ambiente di sviluppo prima di decidere di andare in produzione.


Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.

Risorse: