Životnost je „D“ ve vlastnostech „ACID“ (A – atomicita, C – konzistence, I – izolace), které jsou popularizovány tradičními systémy pro správu relačních databází (RDBMS). Trvanlivost je zárukou, že zapsaná data byla uložena a trvale přežijí. Databáze NoSQL, jako je MongoDB, poskytují vývojářům podrobnou kontrolu nad trvanlivostí jejich volání zápisu. To umožňuje vývojářům vybrat si různé modely odolnosti, bezpečnosti a výkonu pro různé třídy dat. To však také klade zátěž na vývojáře, aby rozeznal a pochopil nuance různých možností zabezpečení zápisu. V tomto příspěvku se podíváme na různé možnosti zabezpečení zápisu poskytované v ovladači Java.
V jazyce MongoDB se tomu říká „Zájem o psaní“. Obavy při psaní se liší od „slabých“ po „silné“. Problémy se slabým zápisem mohou vést k vyšší propustnosti, ale poskytují menší bezpečnost dat a silné obavy ze zápisu jsou naopak.
Ovladač Java vám umožňuje určit možnosti zabezpečení zápisu pomocí několika teleskopických konstruktorů. Zde je konstruktor se všemi možnostmi:
WriteConcern(int w, int wtimeout, boolean fsync, boolean j, boolean continueOnError)
Jak vidíte, tento konstruktor má spoustu možností. Aby to vývojářům usnadnilo, jsou pro běžné hodnoty zájmu o zápis poskytnuty „tagy“ – Unacknowledged, Acknowledged, Journalled, Fsynced a Replica Acknowledged. Každá značka se mapuje na určité vyvolání výše uvedeného konstruktoru.
Nepotvrzený režim MongoDB
Toto je režim „vypal a zapomeň“. Ovladač MongoDB se nepokouší potvrdit příjem operací zápisu. Pokud například nefunguje vaše služba MongoDB a používáte tento režim, všechny chyby budou tiše ignorovány a vaše data budou ztracena. Je zřejmé, že byste tento režim měli používat pouze pro data s nízkou hodnotou, kde je propustnost zápisu důležitější než ztráta určitého množství dat. Tento režim lze specifikovat následovně:
new WriteConcern(0) / WriteConcern.UNACKNOWLEDGED
Potvrzený režim MongoDB
Toto je výchozí režim zápisu pro MongoDB. V tomto režimu se ovladač MongoDB pokouší potvrdit příjem operací zápisu na server, což umožňuje ovladači zachytit jakékoli chyby sítě, chyby duplicitních klíčů atd. To však nezaručuje uložení dat na disk. Pokud se server MongoDB po potvrzení zápisu zhroutí, ale před jeho odesláním na disk se data ztratí. Tento režim lze specifikovat následovně:
new WriteConcern(1) / WriteConcern.ACKNOWLEDGED
Režim MongoDB v deníku
V tomto režimu server MongoDB potvrdí zápis až po odeslání dat do žurnálu. Při použití tohoto režimu se data z žurnálu znovu použijí, i když se server po restartu zhroutí. Aby to fungovalo, musí být samozřejmě povoleno žurnálování. Všechny produkční systémy by měly mít povoleno žurnálování a více se o tom můžete dozvědět v našem příspěvku Měli byste povolit žurnálování MongoDB?
Ve scénáři sady replik se problémy se zápisem do žurnálu vztahují pouze na primární. Ve výchozím nastavení se žurnál odesílá na disk každých 100 ms. Když zadáte zápis pomocí volby journaled, žurnál se uloží na disk za 30 ms. Pokud tedy zadáte j:true pro každý zápis, vaše propustnost bude maximálně 1000/30 =33,3 zápisů/s. Pokud chcete lepší propustnost, budete muset dávkovat aktualizace a nastavit j:true pro poslední aktualizaci dávky. Tento režim lze specifikovat následovně:
WriteConcern( 1, 0, false, true ) / WriteConcern.JOURNALLED
Režim Fsynced MongoDB
V tomto režimu server MongoDB potvrdí zápis až po zápisu na disk. Tento režim lze specifikovat následovně:
new WriteConcern(true) / WriteConcern.FSYNCED
Replika potvrzena MongoDB režim
Předchozí bezpečnostní režimy zápisu platí pouze pro jeden server. Když spustíte sady replik, máte možnost řídit, kolik replik musí být zapsáno, než bude váš zápis považován za úspěšný. Například při problému zápisu „w:2“ je třeba zápis zapsat do jednoho primárního a alespoň jednoho sekundárního, než bude považován za úspěšný. To snižuje propustnost, ale poskytuje lepší bezpečnost. Pokud si předem nejste vědomi počtu replik, můžete použít značku WriteConcern.MAJORITY, abyste zajistili uložení dat ve většině replik. Toto je nejbezpečnější možnost v MongoDB. Pokud se chystáte použít tuto možnost, nezapomeňte také nastavit hodnotu „wtimeout“, která označuje, jak dlouho má příkaz čekat, než vrátí chybu:
new WriteConcern(2)/ REPLICA_ACKNOWLEDGED new Majority()/ WriteConcern.MAJORITY
Následující značky byly zastaralé (nebo se plánují být) – ERRORS_IGNORED, NORMAL, SAFE, FSYNC_SAFE, JOURNAL_SAFE, REPLICAS_SAFE. Místo těchto možností použijte novější možnosti. Jako vždy, pokud máte nějaké připomínky nebo dotazy, kontaktujte nás na adrese [email protected].