MongoDB používá žurnál na disku k zajištění operací zápisu a odolnosti proti pádu. MongoDB také vytváří žurnál pro každý zápis, který obsahuje přesné umístění disku a bajty, které se při zápisu změnily. Pokud tedy dojde k havárii serveru, žurnál lze použít k přehrání všech zápisů, které ještě nebyly zapsány do datových souborů.
MongoDB používá k zápisu dat na disk soubory mapované v paměti. Ve výchozím nastavení jsou datové soubory MongoDB vyprázdněny na disk každých 60 sekund. Pro žurnál také používají soubory mapované v paměti a ve výchozím nastavení je žurnál vyprázdněn na disk každých 100 ms. Protože konečné datové soubory jsou vyprázdněny na disk každých 60 sekund, žurnál nemusí sledovat zápisy déle než jednu minutu. Další podrobnosti o mechanismu žurnálování najdete v oficiální dokumentaci. Chcete-li podrobněji porozumět tomu, jak mapování zobrazení funguje, můžete se podívat na Kristinin blog.
Zápis do deníku
>db.data.insert({"name":"testentry"}); >db.runCommand({"getLastError":1, "j":true});
Když zapnete žurnálování MongoDB, máte také možnost zadat problém se zápisem v MongoDB na „Journaled“ pro vaše operace MongoDB. To znamená, že MongoDB potvrdí operaci zápisu až po potvrzení do žurnálu. Má to však nevýhodu – když zadáte „j“:true s getLastError, MongoDB počká asi 1/3 interního potvrzení žurnálu, než odevzdá data žurnálu. Výchozí interval potvrzení žurnálu je 100 ms – MongoDB tedy počká 30 ms a data odevzdá. To v podstatě znamená, že v jednom vlákně můžete získat pouze asi 33,3 zápisů za sekundu a doporučeným nejlepším postupem je dávkové zápisy. Máte-li například 50 zápisů, použijte nastavení „j“:true pouze na poslední zápis – tím potvrdíte, že všech předchozích 50 zápisů bylo provedeno.
Shrnutí
Každá produkční instance MongoDB by měla běžet s povoleným žurnálováním. Pokud nemáte povoleno žurnálování a váš server nebo proces MongoDB se zhroutí, MongoDB nebude schopen zajistit integritu dat. Budete muset provést operaci „opravy“ databáze, jejíž dokončení může v závislosti na množství dat trvat několik hodin. Vypínejte jej pouze tehdy, pokud opravdu víte, co děláte. Ve ScaleGrid se všechny naše instance řídí konfigurací osvědčených postupů MongoDB a ve výchozím nastavení mají žurnálování zapnuté.