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

Ottimizzazione del tuo ambiente Linux per MongoDB

Le prestazioni di MongoDB dipendono da come utilizza le risorse sottostanti. Memorizza i dati su disco e in memoria. Utilizza le risorse della CPU per eseguire operazioni e una rete per comunicare con i suoi client. Dovrebbero esserci risorse adeguate per sostenerne la vivacità generale. In questo articolo discuteremo vari requisiti di risorse per il sistema di database MongoDB e come possiamo ottimizzarli per ottenere le massime prestazioni.

Requisiti per MongoDB

Oltre a fornire risorse su larga scala come RAM e CPU al database, l'ottimizzazione del sistema operativo può anche migliorare le prestazioni in una certa misura. Le utilità significative richieste per creare un ambiente MongoDB includono:

  1. Spazio su disco sufficiente
  2. Memoria adeguata
  3. Eccellente connessione di rete.

Il sistema operativo più comune per MongoDB è Linux, quindi vedremo come ottimizzarlo per il database.

Condizione di riavvio.

Esistono molte tecniche di ottimizzazione che possono essere applicate a Linux. Tuttavia, poiché alcune modifiche vengono apportate senza riavviare l'host, è sempre consigliabile riavviare dopo aver apportato le modifiche per assicurarsi che vengano applicate. In questa sezione, le implementazioni di ottimizzazione di cui parleremo sono:

  1. Stack di rete
  2. Demone NTP
  3. Limite utenti Linux
  4. File system e Opzioni
  5. Sicurezza
  6. Memoria virtuale

Stack di rete

Come qualsiasi altro software, un'eccellente connessione di rete fornisce una migliore interfaccia di scambio per richieste e risposte con il server. Tuttavia, MongoDB non è favorito con le regolazioni di rete del kernel predefinite di Linux. Come mostra il nome, questa è una disposizione di molti livelli che possono essere classificati in 3 principali:Area utente, Area del kernel e Area del dispositivo. L'area utente e l'area del kernel sono indicate come host poiché i loro compiti sono eseguiti dalla CPU. L'area del dispositivo è responsabile dell'invio e della ricezione di pacchetti attraverso un'interfaccia chiamata Network Interface Card. Per prestazioni migliori con l'ambiente MongoDB, l'host dovrebbe essere limitato a un limite di interfaccia di rete di 1 Gbps. In questo caso, ciò che dovremmo ottimizzare sono le impostazioni relative alla velocità effettiva che includono:

  1. net.core.somaxconn (aumenta il valore)
  2. net.ipv4.tcp_max_syn_backlog (aumenta il valore)
  3. net.ipv4.tcp_fin_timeout (riduci il valore)
  4. net.ipv4.tcp_keepalive_intvl (riduci il valore)
  5. net.ipv4.tcp_keepalive_time (riduci il valore)

Per rendere permanenti queste modifiche, crea un nuovo file /etc/sysctl.d/mongodb-sysctl.conf se non esiste e aggiungi queste righe.

net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096

Quindi esegui il comando come utente root /sbin/sysctl -p per applicare le modifiche in modo permanente.

Demone NTP

Network Time Protocol (NTP) è una tecnica per la quale un orologio software di un sistema Linux viene sincronizzato con i server dell'ora Internet. MongoDB, essendo un cluster, dipende dalla coerenza temporale tra i nodi. Per questo motivo, è importante che l'NTP venga eseguito in modo permanente sugli host MongoDB. L'importanza della configurazione NTP è garantire il servizio continuo del server per un certo periodo di tempo dopo una disconnessione dalla rete. Per impostazione predefinita, l'NTP è installato sul lato client, quindi per MongoDB per installare l'NTP su un sistema Linux con sapore Debian/Ubuntu, basta eseguire il comando:

$ sudo apt-get install ntp

Puoi visitare ntp.conf per vedere la configurazione del demone NTP per diversi sistemi operativi.

Limite utenti Linux

A volte un errore lato utente può avere un impatto sull'intero server e sistema host. Per evitare ciò, il sistema Linux è progettato per assumere alcuni limiti delle risorse di sistema relativi ai processi eseguiti in base all'utente. Ciò essendo evidente, non sarà appropriato distribuire MongoDB su tali configurazioni di sistema predefinite poiché richiederebbe più risorse rispetto alla fornitura predefinita. Inoltre, MongoDB è spesso il processo principale per utilizzare l'hardware sottostante, quindi sarà predominante ottimizzare il sistema Linux per tale utilizzo dedicato. Il database può quindi sfruttare appieno le risorse disponibili.

Tuttavia, non sarà conveniente disabilitare questi vincoli di limite o impostarli su uno stato illimitato. Ad esempio, se si verifica una carenza di memoria CPU o RAM, un piccolo errore può degenerare in un problema enorme e causare il fallimento di altre funzionalità, ad esempio SSH, che è fondamentale per risolvere il problema iniziale.

Per ottenere stime migliori, è necessario comprendere i requisiti dei vincoli a livello di database. Ad esempio, stimando il numero di utenti che faranno richieste al database e il tempo di elaborazione. Puoi fare riferimento a Cose chiave da monitorare per MongoDB. Un limite più preferibile per max-user-processes e open-file è 64000. Per impostare questi valori, crea un nuovo file se non esiste come /etc/security/limits.d e aggiungi queste righe

mongod       soft        nofile       64000
mongod       hard        nofile       64000
mongod       soft        nproc        64000
mongod       hard        nproc        64000

Per poter applicare queste modifiche, riavvia il tuo mongod poiché le modifiche si applicano solo alle nuove shell.

File system e opzioni

MongoDB utilizza 3 tipi di filesystem, ext3, ext4 e XFS per i dati del database su disco. Per il motore di archiviazione WiredTiger impiegato per la versione MongoDB maggiore di 3, è meglio utilizzare XFS piuttosto che ext4 che si ritiene crei alcuni problemi di stabilità mentre ext3 viene evitato anche a causa delle sue scarse prestazioni di pre-allocazione. MongoDB non utilizza la tecnica del file system predefinita per eseguire un aggiornamento dei metadati del tempo di accesso come altri sistemi. È quindi possibile disabilitare gli aggiornamenti del tempo di accesso per risparmiare sulla piccola quantità di attività di I/O del disco utilizzata da questi aggiornamenti.

Questo può essere fatto aggiungendo un flag noatime al campo delle opzioni del file system nel file etc/fstab per il disco che serve i dati MongoDB.

$ grep "/var/lib/mongo" /proc/mounts
/dev/mapper/data-mongodb /var/lib/mongo ext4 rw, seclabel, noatime, data=ordered 0 0

Questa modifica può essere realizzata solo al riavvio o al riavvio di MongoDB.

Sicurezza

Tra le numerose funzionalità di sicurezza di un sistema Linux, a livello di kernel c'è Security-Enhanced Linux. Questa è un'implementazione del controllo di accesso obbligatorio a grana fine. Fornisce un collegamento alla politica di sicurezza per determinare se un'operazione deve procedere. Sfortunatamente, molti utenti Linux impostano questo modulo di controllo accessi solo per avvisare o lo disabilitano completamente. Ciò è spesso dovuto ad alcune battute d'arresto associate come un errore di autorizzazione imprevista negata. Questo modulo, per quanto molte persone lo ignorino, svolge un ruolo importante nel ridurre gli attacchi locali al server. Con questa funzione abilitata e le modalità corrispondenti impostate su positivo, fornirà uno sfondo sicuro per il tuo MongoDB. Pertanto, dovresti abilitare la modalità SELinux e anche applicare la modalità Enforcing specialmente all'inizio della tua installazione. Per modificare la modalità SELinux in Enforcing:eseguire il comando

$ sudo setenforce Enforcing

Puoi controllare la modalità SELinux in esecuzione eseguendo

$ sudo getenforce
Multiplenines Diventa un DBA MongoDB - Portare MongoDB in produzioneScopri cosa devi sapere per distribuire, monitorare, gestire e ridimensionare MongoDBScarica gratuitamente

Memoria virtuale

Rapporto sporco

MongoDB utilizza la tecnologia cache per migliorare il recupero rapido dei dati. In questo caso, vengono create pagine sporche e sarà necessaria della memoria per contenerle. Il rapporto sporco diventa quindi la percentuale della memoria di sistema totale che può contenere pagine sporche. Nella maggior parte dei casi, i valori predefiniti sono compresi tra (25 - 35)%. Se questo valore viene superato, le pagine vengono salvate su disco e hanno l'effetto di creare una pausa dura. Per evitare ciò, puoi impostare il kernel in modo che scarichi sempre i dati attraverso un altro rapporto denominato dirty_background_ratio il cui valore è compreso tra (10% - 15%) su disco in background senza necessariamente creare la pausa dura.

L'obiettivo qui è garantire prestazioni di query di qualità. È quindi possibile ridurre il rapporto di sfondo se il sistema di database richiede una grande memoria. Se è consentita una pausa dura, potresti avere dati duplicati o alcuni dati potrebbero non essere registrati durante quel periodo. È inoltre possibile ridurre le dimensioni della cache per evitare che i dati vengano scritti frequentemente su disco in piccoli batch che potrebbero aumentare la velocità effettiva del disco. Per controllare il valore attualmente in esecuzione puoi eseguire questo comando:

$ sysctl -a | egrep “vm.dirty.*_ratio”

e ti verrà presentato qualcosa del genere.

vm.dirty_background_ratio = 10
vm.dirty_ratio = 20

Scambiabilità

È un valore compreso tra 1 e 100 da cui è possibile influenzare il comportamento del gestore della memoria virtuale. L'impostazione su 100 implica lo scambio forzato su disco e l'impostazione su 0 indica al kernel di eseguire lo scambio solo per evitare problemi di memoria insufficiente. L'intervallo predefinito per Linux è compreso tra 50 e 60, di cui non è appropriato per i sistemi di database. Nel mio test, l'impostazione del valore tra 0 e 10 è ottimale. Puoi sempre impostare questo valore in /etc/sysctl.conf

vm.swappiness = 5

Puoi quindi controllare questo valore eseguendo il comando

$ sysctl vm.swappiness

Per applicare queste modifiche, esegui il comando /sbin/sysctl -p oppure puoi riavviare il sistema.