MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Разбиране на издръжливостта и безопасността при запис в MongoDB

Издръжливостта е „D“ в свойствата на „ACID“ (A – атомарност, C – последователност, I – изолация), популяризирана от традиционните системи за управление на релационни бази данни (RDBMS). Трайността е гаранцията, че писмените данни са запазени и ще оцелеят завинаги. NoSQL бази данни като MongoDB дават на разработчиците фин контрол върху издръжливостта на техните извиквания за запис. Това позволява на разработчиците да избират различни модели за издръжливост, безопасност и производителност за различни класове данни. Това обаче също натоварва разработчика да разпознава и разбира нюансите на различните опции за безопасност при запис. В тази публикация ще разгледаме различните опции за безопасност при запис, предоставени в драйвера на Java.

На езика на MongoDB това се нарича „Загриженост за писане“. Притесненията при писане варират от „слабо“ до „силно“. Слабите опасения при запис могат да доведат до по-висока пропускателна способност, но осигуряват по-малко безопасност на данните, а силните опасения при запис са обратно.

Драйверът на Java ви позволява да зададете вашите опции за безопасност при запис, като използвате няколко телескопични конструктора. Ето конструктора с всички опции:

WriteConcern(int w, int wtimeout, boolean fsync, boolean j, boolean continueOnError)

Както можете да видите, този конструктор има много опции. За да се улесни разработчиците, са предоставени „тагове“ за общи стойности за проблеми при запис – Unacknowledged, Acknowledged, Journalled, Fsynced и Replica Acknowledged. Всеки таг се съпоставя с определено извикване на горния конструктор.

Непотвърден режим MongoDB

Това е режимът „изстреляйте и забравите“. Драйверът на MongoDB не се опитва да потвърди получаването на операции за запис. Например, ако вашата услуга MongoDB не работи и използвате този режим, всички грешки се игнорират тихо и данните ви се губят. Очевидно трябва да използвате този режим само за данни с ниска стойност, където пропускателната способност на запис е по-важна от загубата на определено количество данни. Този режим може да бъде зададен по следния начин:

new WriteConcern(0) / WriteConcern.UNACKNOWLEDGED

Потвърден режим MongoDB

Това е режимът на запис по подразбиране за MongoDB. В този режим драйверът на MongoDB се опитва да потвърди получаването на операции по запис на сървъра, позволявайки на драйвера да улови всякакви мрежови грешки, грешки при дублирани ключове и т.н. Това обаче не гарантира, че данните се записват на диска. Ако сървърът на MongoDB се срине след потвърждение на записа, но преди да го запише на диск, данните се губят. Този режим може да бъде зададен по следния начин:

new WriteConcern(1) / WriteConcern.ACKNOWLEDGED

Режим за запис в MongoDB

В този режим сървърът на MongoDB потвърждава записа само след като записва данните в дневника. Когато използвате този режим, дори ако сървърът се срине при рестартиране на сървъра, данните се прилагат отново от дневника. Очевидно е, че воденето на дневник трябва да бъде активирано, за да работи това. Всички производствени системи трябва да имат активирано водене на журнали и можете да научите повече за това в нашата публикация Трябва ли да активирате журналирането на MongoDB?

В сценарий с набор от реплики, опасенията за записване в журнал се отнасят само за основния. По подразбиране дневникът се записва на диск на всеки 100 мс. Когато посочите запис с опцията journaled, дневникът се записва на диска за 30 мс. Така че, ако посочите j:true за всяко записване, вашата пропускателна способност ще бъде максимум 1000/30 =33,3 записа/сек. Ако искате по-добра пропускателна способност, ще трябва да групирате актуализациите си и да зададете j:true за последната актуализация на партидата. Този режим може да бъде зададен по следния начин:

WriteConcern( 1, 0, false, true ) / WriteConcern.JOURNALLED

Fsynced MongoDB режим

В този режим сървърът на MongoDB потвърждава записа само след като записът е записан на диск. Този режим може да бъде зададен по следния начин:

new WriteConcern(true) / WriteConcern.FSYNCED

Реплика на потвърден режим на MongoDB

Предишните режими за безопасност при запис се прилагат само за един сървър. Когато изпълнявате набори от реплики, имате възможността да контролирате колко реплики трябва да бъдат написани, преди да се считат за успешни. Например, със загриженост за запис от „w:2″, записът трябва да бъде записан на един първичен и поне един вторичен, преди да се счита за успешен. Това намалява пропускателната способност, но ви осигурява по-добра безопасност. Ако не сте наясно с броя на репликите предварително, можете да използвате маркера WriteConcern.MAJORITY, за да гарантирате, че данните се записват в по-голямата част от репликите. Това е най-сигурната опция в MongoDB. Ако ще използвате тази опция, също така не забравяйте да зададете стойността „wtimeout“, за да посочите колко време трябва да изчака командата, преди да върне грешка:

new WriteConcern(2)/ REPLICA_ACKNOWLEDGED
new Majority()/ WriteConcern.MAJORITY

Следните тагове са оттеглени (или планират да бъдат) – ERRORS_IGNORED, NORMAL, SAFE, FSYNC_SAFE, JOURNAL_SAFE, REPLICAS_SAFE. Моля, използвайте по-новите опции вместо тези опции. Както винаги, ако имате някакви коментари или въпроси, моля, свържете се с нас на [email protected].


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Програмиране на база данни на Python с MongoDB за начинаещи

  2. Как да спрете изграждането на Runaway Index в MongoDB

  3. mongoose :намерете данни чрез цикъл върху масив от модели

  4. Как да направя вложено $lookup търсене в MongoDB?

  5. mongodb/mongoose findMany - намерете всички документи с идентификатори, изброени в масив