sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB Write Concern:3 Must Know Caveats

„Zájem o psaní“ v MongoDB popisuje úroveň potvrzení zápisu, kterou od něj můžete očekávat. Je to poměrně důležité nastavení, které si musíte pamatovat při operacích zápisu, a jeho chování je užitečné pochopit, zejména v distribuovaných nasazeních MongoDB (tj. sady replik a sdílené clustery). V tomto příspěvku diskutujeme o 3 problémech při používání MongoDB zápisu.

Zápis MongoDB

Dokumentace MongoDB definuje starost o zápis jako „úroveň potvrzení požadovaná od MongoDB pro operace zápisu do samostatného mongoda nebo do sad replik nebo do sharded clusterů.

Zjednodušeně řečeno, obava o zápis je známkou „trvanlivosti“ předávané spolu s operacemi zápisu do MongoDB. Abychom to objasnili, podívejme se na syntaxi:

{ w: <value>, j: <boolean>, wtimeout: <number> }
Where*,
 w can be an integer | "majority" | , it represents the number of members that must acknowledge the write. Default value is 1.
 j Requests that a write be acknowledged after it is written to the on-disk journal as opposed to just the system memory. Unspecified by default.
wtimeout specifies timeout for the applying the write concern. Unspecified by default.

* Podrobnou syntaxi naleznete v dokumentaci Write Concern Specification.

* Další informace o různých „značkách“, které můžete použít pro běžné hodnoty obav při zápisu, naleznete v našem blogu Porozumění trvanlivosti a bezpečnosti zápisu v MongoDB.

Příklad:

db.inventory.insert(
    { sku: "abcdxyz", qty : 100, category: "Clothing" },
    { writeConcern: { w: 2, j: true, wtimeout: 5000 } }
)

Výše uvedený problém se zápisem lze číst následovně:  potvrďte tento zápis, když „alespoň 2 členové sady replik jej zapsali do svých deníků do 5000 ms nebo vrátí chybu '. Hodnota zájmu o zápis pro možnost byla většina, což znamená „ržádá o potvrzení, že operace zápisu se rozšířily do většiny hlasovacích uzlů, včetně primárního.

#MongoDB Write Concern – 3 upozornění, která musíte vědět Kliknutím na Tweet

Význam zájmu o psaní je zřejmý. Zvýšení hodnot w zvyšuje latenci zápisů a zároveň snižuje pravděpodobnost jejich ztráty. Výběr správných hodnot pro obavy ze zápisu závisí na požadavcích na latenci a trvanlivost prováděných zápisů.

Na základě toho, co je problém psaní, přejděme ke třem upozorněním, na která je třeba pamatovat při používání starostí s psaním.

UPOZORNĚNÍ 1: Nastavení obav o zápis u sad replik bez wtimeout může způsobit blokování zápisů na neurčito

Většinová definice (použitelná MongoDB 3.0 a novější) výše uvádí, že potvrzení je vyžadováno od většiny „hlasovacích uzlů“. Všimněte si, že „Pokud nezadáte wtimeout a úroveň obav o zápis je nedosažitelná, operace zápisu se zablokuje na dobu neurčitou. “

To může mít neočekávané důsledky, například uvažte sadu replik 2+1 (tj. primární, sekundární a arbitr). Pokud dojde k výpadku vaší jediné čtené repliky, pak budou všechny zápisy s možností „většina“ zablokovány na dobu neurčitou. Totéž se stane, pokud je volba w nastavena na 2. Dalším extrémním příkladem je případ sady replik 3+2 (primární, 2 sekundární a 2 arbitry, nedoporučená konfigurace). Všechny „většinové“ zápisy se zablokují, i když je jeden datový uzel nedostupný, protože většinové číslo je v tomto případě 3.

Nejjednodušším způsobem, jak tento problém zmírnit, je vždy zadat hodnotu wtimeout, aby dotaz mohl vypršet, pokud nelze vynutit problém se zápisem. V případě takových chyb časového limitu však MongoDB nezruší již úspěšné zápisy provedené některým členům před vypršením časového limitu.

V současné době také neexistuje žádné nastavení, které by zajistilo, že zápis dosáhne většiny uzlů, které jsou aktuálně dosažitelné, takže buďte opatrní při nastavení hodnoty obavy o zápis w na základě požadované topologie trvanlivost a dostupnost.

UPOZORNĚNÍ 2: Můžete přijít o data, i když je většina

Zdá se intuitivní, že jakmile zápis potvrdí většina hlasujících členů, jeho trvanlivost je zaručena. To však není tento případ! Pamatujte, že když není volba j specifikována, zápis je potvrzen hned po zapsání do paměti.

Takový zápis tedy může být ztracen, pokud šílený výpadek napájení vyřadí většinu uzlů, do kterých se zápis rozšířil (a před syncPeriodSecs, tj. před tím, než mohl být vyprázdněn do disk).

Aby byla zajištěna trvanlivost zápisů, je nejlepší nevypínat žurnálování v databázi a nastavit možnost j na true. Ve skutečnosti, počínaje MongoDB 3.6, --nojournal příznak byl zastaralý pro členy sady replik používající úložiště WiredTiger.

S hodnotou w „většina“ a volbou j nespecifikovanou u sady replik závisí přesné chování trvanlivosti na hodnotě konfigurace sady replik writeConcernMajorityJournalDefault. Je-li nastaveno na hodnotu true (a je-li povoleno žurnálování), uznává zápisy poté, co byly zapsány do žurnálů většiny hlasujících členů.

Ostatně:I když je žurnálování zapnuté, vaše zápisy se mohou v úložišti MMAPv1 ztratit, pokud během trvání commitIntervalMs dojde k výpadku. Úložný modul WiredTiger na druhé straně vynutí synchronizaci souborů žurnálu, když obdrží zápis s možností j nastavenou na hodnotu true. A i když je j nastaveno na hodnotu false, může být potvrzený „většinový“ zápis do nejnovějšího nasazení založeného na WiredTiger ztracen pouze tehdy, když většina datových uzlů se zhroutí současně.

UPOZORNĚNÍ 3: w:0 při nastavení j:true nezlepší výkon zápisu

To se dá snadno uvažovat, jakmile se nad tím zamyslíte, ale stejně snadno se na to zapomene. Nastavení volby w na 0 se obvykle provádí za účelem zápisu do databáze způsobem „zapomeň a zapomeň“ – když důvěřujete databázové infrastruktuře a záleží vám více na latenci než na trvanlivosti každého zápisu. Pokud však nastavíte volbu j na hodnotu true, bude vaše volba w fakticky přepsána, protože databáze zajistí, že zápis bude zapsán do žurnálu na disku, než se vrátí.

Pokud používáte obavy týkající se zápisu k zaručení úspěchu vašich operací zápisu, nezapomeňte si zapamatovat tato tři zásadní upozornění! Jsme tu, abychom vám pomohli, takže se neváhejte spojit s jakýmikoli dotazy prostřednictvím Twitteru nebo e-mailu.


  1. Nelze spustit MongoDB jako službu

  2. Rozsah stránkování MongoDB

  3. Jak deaktivovat Redis RDB a AOF?

  4. Použití .sort s PyMongem