MongoDB utilizza un diario su disco per garantire le operazioni di scrittura e fornire resilienza agli arresti anomali. MongoDB crea anche un journal per ogni scrittura che include l'esatta posizione del disco e i byte modificati durante la scrittura. Pertanto, se si verifica un arresto anomalo del server, il journal può essere utilizzato per riprodurre eventuali scritture che non sono state ancora scritte sui file di dati.
MongoDB utilizza i file mappati in memoria per scrivere i tuoi dati su disco. Per impostazione predefinita, i file di dati MongoDB vengono scaricati su disco ogni 60 secondi. Usano anche file mappati in memoria per il journal e, per impostazione predefinita, il journal viene scaricato su disco ogni 100 ms. Poiché i file di dati finali vengono scaricati su disco ogni 60 secondi, non è necessario che il journal tenga traccia delle scritture per più di un minuto. Per maggiori dettagli sulla meccanica del journaling, fare riferimento alla documentazione ufficiale. Per capire più in dettaglio come funziona la mappatura delle viste, puoi consultare il blog di Kristina.
Journaling Scrivi preoccupazione
>db.data.insert({"name":"testentry"}); >db.runCommand({"getLastError":1, "j":true});
Quando attivi l'inserimento nel diario di MongoDB, hai anche la possibilità di specificare un problema di scrittura in MongoDB di "Journaled" per le tue operazioni MongoDB. Ciò implica che MongoDB conferma l'operazione di scrittura solo dopo aver eseguito il commit nel journal. Tuttavia, questo ha uno svantaggio:quando si specifica "j":true con getLastError, MongoDB attenderà circa 1/3 del commit del journal interno prima di eseguire il commit dei dati del journal. L'intervallo di commit del journal predefinito è 100 ms, quindi MongoDB aspetterà 30 ms e eseguirà il commit dei dati. Ciò significa essenzialmente che su un singolo thread, puoi ottenere solo circa 33,3 scritture al secondo e la procedura consigliata è quella di raggruppare le tue scritture. Ad esempio, se hai 50 scritture, usa l'impostazione "j":true solo sull'ultima scrittura:questo riconoscerà che tutte le 50 scritture precedenti sono state eseguite.
Riepilogo
Ogni istanza MongoDB di produzione dovrebbe essere eseguita con l'inserimento nel journal abilitato. Se non hai abilitato il journaling e il tuo server o il processo MongoDB si arresta in modo anomalo, MongoDB non sarà in grado di garantire l'integrità dei dati. Dovrai eseguire un'operazione di "riparazione" sul database, il cui completamento, a seconda della quantità di dati, potrebbe richiedere alcune ore. Spegnilo solo se sai davvero cosa stai facendo. In ScaleGrid, tutte le nostre istanze seguono la configurazione delle best practice di MongoDB e il journaling è attivato per impostazione predefinita.