Dopo il successo dello sviluppo dell'applicazione e prima di dedicarti alla produzione di MongoDB, fai i conti con queste rapide linee guida per garantire un flusso regolare ed efficiente e per ottenere prestazioni ottimali.
1) Opzioni di implementazione
Selezione dell'hardware giusto
Per prestazioni ottimali, è preferibile utilizzare SSD anziché HDD. È necessario fare attenzione se lo spazio di archiviazione è locale o remoto e prendere le misure di conseguenza. È meglio utilizzare RAID per la protezione dei difetti hardware e lo schema di ripristino, ma non fare affidamento su di esso completamente, poiché non offre alcuna protezione contro guasti avversi. Per l'esecuzione su dischi, RAID-10 è adatto in termini di prestazioni e disponibilità che spesso mancano in altri livelli RAID. L'hardware giusto è l'elemento costitutivo della tua applicazione per prestazioni ottimizzate ed evitare grandi debacle.
Hosting su cloud
È disponibile una gamma di fornitori di cloud che offrono host di database MongoDB preinstallati. La selezione della scelta migliore è il passo fondamentale affinché la tua applicazione cresca e faccia la prima impressione sul mercato di riferimento. MongoDB Atlas è una delle possibili scelte che offre una soluzione completa per l'interfaccia cloud con funzionalità come la distribuzione dei tuoi nodi e uno snapshot dei tuoi dati archiviati in Amazon S3. ClusterControl è un'altra buona opzione disponibile per una facile distribuzione e scalabilità. Che offre una varietà di funzionalità come l'aggiunta e la rimozione semplici di nodi, il ridimensionamento delle istanze e la clonazione del cluster di produzione. Puoi provare ClusterControl qui senza essere addebitato. Altre opzioni disponibili sono RackSpace ObjectRocket e MongoStitch.
2) RAM
Gli elementi a cui si accede di frequente vengono memorizzati nella cache nella RAM, in modo che MongoDB possa fornire tempi di risposta ottimali. La RAM di solito dipende dalla quantità di dati che intendi archiviare, dal numero di raccolte e dagli indici. Assicurati di avere abbastanza RAM per ospitare i tuoi indici, altrimenti influenzerà drasticamente le prestazioni delle tue applicazioni in produzione. Più RAM significa meno errori di pagina e tempi di risposta migliori.
3) Indicizzazione
Per le applicazioni che includono richieste di scrittura croniche, l'indicizzazione svolge un ruolo fondamentale. Secondo i documenti MongoDB:
"Se un'operazione di scrittura modifica un campo indicizzato, MongoDB aggiorna tutti gli indici che hanno il campo modificato come chiave"
Quindi, fai attenzione quando scegli gli indici poiché potrebbero influire sulle prestazioni del tuo DB.
Esempio di indicizzazione:voce di esempio nel database del ristorante
{
"address": {
"building": "701",
"street": "Harley street",
"zipcode": "71000"
},
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Bombay Bakery",
"restaurant_id": "187521"
}
-
Creazione di un indice su un singolo campo
> db.restaurants.createIndex( { "cuisine": 1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Nell'esempio precedente viene creato l'indice di ordine crescente sul campo cucina.
-
Creazione di un indice su più campi
> db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
Qui viene creato l'indice composto sui campi della cucina e del codice postale. Il numero -ve definisce l'ordine decrescente.
4) Preparati alla frammentazione
MongoDB partiziona i dati in macchine diverse usando un meccanismo noto come sharding. Non è consigliabile aggiungere il partizionamento orizzontale all'inizio a meno che non ti aspetti set di dati pesanti. Ricorda di mantenere in linea le prestazioni delle tue applicazioni, hai bisogno di una buona chiave di partizionamento orizzontale, in base ai tuoi modelli di dati poiché influisce direttamente sul tempo di risposta. Il bilanciamento dei dati tra gli shard è automatico. Tuttavia, è meglio essere preparati e avere un piano adeguato. Così puoi consolidare ogni volta che la tua applicazione lo richiede.
5) Best practice per la configurazione del sistema operativo
- File system XFS
- È un file system di journaling a 64 bit altamente scalabile e ad alte prestazioni. Migliora le prestazioni di I/O consentendo un numero inferiore e maggiore di operazioni di I/O.
- Inserisci il limite del descrittore di file.
- Disabilita le pagine enormi trasparenti e la memoria ad accesso non uniforme (NUMA).
- Modifica il tempo di conservazione TCP predefinito in 300 secondi (per Linux) e 120 secondi (per Azure).
Prova questi comandi per modificare il tempo di mantenimento predefinito;
Per Linux
sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>
Per Windows
Digita questo comando nel prompt dei comandi come amministratore, dove
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>
6) Garantire un'elevata disponibilità utilizzando la replica
L'avvio della produzione senza replica può causare improvvisi arresti anomali dell'app. La replica si occupa del problema se un nodo si guasta. Gestisci le operazioni di lettura e scrittura per le tue istanze MongoDB secondarie in base alle tue esigenze applicative.
Tieni a mente queste cose durante la replica:
- Per un'elevata disponibilità, distribuisci il tuo set di repliche in un minimo di tre data center.
- Assicurati che le istanze MongoDB abbiano 0 o 1 voti.
- Garantire la connettività di rete bidirezionale completa tra tutte le istanze MongoDB.
Esempio di creazione di un set di repliche con 4 istanze MongoDB locali:
-
Creazione di 4 istanze MongoDB locali
Innanzitutto, crea directory di dati
mkdir -p /data/m0 mkdir -p /data/m1 mkdir -p /data/m2 mkdir -p /data/m3
-
Avvia 4 istanze locali
mongod --replSet cluster1 --port 27017 --dbpath /data/m0 mongod --replSet cluster2 --port 27018 --dbpath /data/m1 mongod --replSet cluster1 --port 27019 --dbpath /data/m2 mongod --replSet cluster1 --port 27020 --dbpath /data/m3
-
Aggiungi le istanze al cluster e avvia
mongo myhost:34014 myConfig = {_id: ‘cluster1’, members: [ {_id: 0, host: ‘myhost1:27017’}, {_id: 1, host: ‘myhost2:27018’}, {_id: 2, host: ‘myhost3:27019’}, {_id: 3, host: ‘myhost4:27020’}] } rs.initiate(myConfig);
Misure di sicurezza
7) Macchine sicure
Le porte aperte sulle macchine che ospitano MongoDB sono vulnerabili a vari attacchi dannosi. Più di 30mila database MongoDB sono stati compromessi in un attacco ransomware a causa del ritardo nella corretta configurazione della sicurezza. Durante la produzione, chiudi le porte pubbliche del server MongoDB. Tuttavia, dovresti mantenere una porta aperta per scopi SSh.
Abilitazione dell'autenticazione sull'istanza MongoDB:
-
Avvia il file mongod.conf nel tuo editor preferito.
-
Aggiungi queste righe alla fine del file di configurazione.
security: authorization: enabled
-
Aggiungi queste righe alla fine del file di configurazione.
service mongod restart
-
Conferma lo stato
service mongod status
Limitazione dell'accesso esterno
Apri di nuovo il file mongod.conf per impostare IP limitati per accedere al tuo server.
bind_ip=127.0.0.1
Aggiungendo questa riga, significa che puoi accedere al tuo server solo tramite 127.0.0. (che è localhost). Puoi anche aggiungere più IP nell'opzione di collegamento.
bind_ip=127.0.0.1,168.21.200.200
Significa che puoi accedere da localhost e dalla tua rete privata.
8) Protezione con password
Per aggiungere un ulteriore livello di sicurezza alle tue macchine, abilita il controllo degli accessi e applica l'autenticazione. Nonostante il fatto che tu abbia limitato il server MongoDB ad accettare connessioni dal mondo esterno, esiste ancora la possibilità che script dannosi entrino nel tuo server. Quindi, non essere riluttante a impostare un nome utente/password per il tuo database e assegnare le autorizzazioni richieste. Il controllo dell'accesso abilitato consentirà agli utenti solo di eseguire azioni determinate dai loro ruoli.
Di seguito sono riportati i passaggi per creare un utente e assegnare l'accesso al database con ruoli specifici.
In primo luogo creeremo un utente (in questo caso è admin) per gestire tutti gli utenti e i database e quindi creeremo un proprietario di database specifico con privilegi di lettura e scrittura solo su un'istanza di database MongoDB.
Crea un utente amministratore per gestire altri utenti per le istanze del database
-
Apri la tua shell Mongo e passa al database di amministrazione:
use admin
-
Crea un utente per il database di amministrazione
db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
-
Autentica l'utente appena creato
db.auth("admin", "admin_password")
-
Creazione di un utente di istanza specifico:
use database_1 db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
-
Ora verifica se un utente è stato creato con successo o meno.
db.auth("user_1", "your_password") show collections
Questo è tutto! Hai protetto correttamente le istanze del database con un'autenticazione adeguata. Puoi aggiungere tutti gli utenti che vuoi seguendo la stessa procedura.
9) Crittografia e protezione dei dati
Se stai utilizzando Wiredtiger come motore di archiviazione, puoi utilizzare la sua configurazione di crittografia a riposo per crittografare i tuoi dati. In caso contrario, la crittografia dovrebbe essere eseguita sull'host utilizzando un file system, dispositivi o crittografia fisica.
10) Monitora la tua distribuzione
Una volta terminata la distribuzione di MongoDB in produzione, è necessario tenere traccia dell'attività delle prestazioni per prevenire possibili problemi iniziali. È possibile adattare una serie di strategie per monitorare le prestazioni dei dati nell'ambiente di produzione.
-
MongoDB include utilità, che restituiscono statistiche sulle prestazioni e sull'attività dell'istanza. Le utilità vengono utilizzate per individuare i problemi e analizzare le normali operazioni.
-
Usa mongostat per conoscere la disposizione dei tipi di operazioni e la pianificazione della capacità.
-
Per il monitoraggio dei rapporti e delle attività di lettura e scrittura, si consiglia mongotop.
mongotop 15
Questo comando restituirà l'output dopo ogni 15 secondi.
ns total read write 2018-04-22T15:32:01-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
ns total read write 2018-04-22T15:32:16-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
MongoDB Monitoring Service (MMS) è un'altra opzione disponibile che monitora il tuo cluster MongoDB e ti consente di avere una visione delle attività di distribuzione della produzione.
E naturalmente c'è ClusterControl di Manynines, il sistema di automazione e gestione dei database open source. ClusterControl consente una facile distribuzione di cluster con impostazioni di sicurezza automatizzate e semplifica la risoluzione dei problemi del database fornendo un'automazione di gestione di facile utilizzo che include la riparazione e il ripristino di nodi danneggiati, aggiornamenti automatici e altro ancora. Puoi iniziare con la sua Community Edition (gratuita per sempre), con la quale puoi distribuire e monitorare MongoDB, nonché creare consulenti personalizzati per ottimizzare i tuoi sforzi di monitoraggio su quegli aspetti specifici della tua configurazione. Scaricalo gratuitamente qui.