MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verständnis von Haltbarkeit und Schreibsicherheit in MongoDB

Dauerhaftigkeit ist das „D“ in den „ACID“-Eigenschaften (A – Atomicity, C – Consistency, I – Isolation), populär durch traditionelle relationale Datenbankverwaltungssysteme (RDBMS). Haltbarkeit ist die Garantie, dass schriftliche Daten gespeichert wurden und dauerhaft erhalten bleiben. NoSQL-Datenbanken wie MongoDB geben Entwicklern eine detaillierte Kontrolle über die Dauerhaftigkeit ihrer Schreibaufrufe. Dies ermöglicht Entwicklern, unterschiedliche Haltbarkeits-, Sicherheits- und Leistungsmodelle für unterschiedliche Datenklassen auszuwählen. Dies erlegt dem Entwickler jedoch auch die Last auf, die Nuancen der verschiedenen Schreibsicherheitsoptionen zu erkennen und zu verstehen. In diesem Beitrag sehen wir uns die verschiedenen Optionen für die Schreibsicherheit an, die im Java-Treiber bereitgestellt werden.

Im MongoDB-Jargon heißt dies „Write Concern“. Schreibbedenken reichen von „schwach“ bis „stark“. Schwache Schreibprobleme können zu einem höheren Durchsatz führen, bieten aber weniger Datensicherheit und starke Schreibprobleme sind umgekehrt.

Der Java-Treiber ermöglicht es Ihnen, Ihre Schreibsicherheitsoptionen mit mehreren Teleskopkonstruktoren anzugeben. Hier ist der Konstruktor mit allen Optionen:

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

Wie Sie sehen können, hat dieser Konstruktor viele Optionen. Um Entwicklern die Arbeit zu erleichtern, werden „Tags“ für gängige Schreibanliegenswerte bereitgestellt – Unacknowledged, Acknowledged, Journalled, Fsynced und Replica Acknowledged. Jedes Tag wird einem bestimmten Aufruf des obigen Konstruktors zugeordnet.

Unbestätigter MongoDB-Modus

Dies ist der „Fire and Forget“-Modus. Der MongoDB-Treiber versucht nicht, den Empfang von Schreibvorgängen zu bestätigen. Wenn beispielsweise Ihr MongoDB-Dienst ausgefallen ist und Sie diesen Modus verwenden, werden alle Fehler stillschweigend ignoriert und Ihre Daten gehen verloren. Natürlich sollten Sie diesen Modus nur für Daten mit geringem Wert verwenden, bei denen der Schreibdurchsatz wichtiger ist als der Verlust einer bestimmten Datenmenge. Dieser Modus kann wie folgt angegeben werden:

new WriteConcern(0) / WriteConcern.UNACKNOWLEDGED

Bestätigter MongoDB-Modus

Dies ist der Standard-Schreibmodus für MongoDB. In diesem Modus versucht der MongoDB-Treiber, den Empfang von Schreibvorgängen auf dem Server zu bestätigen, wodurch der Treiber Netzwerkfehler, doppelte Schlüsselfehler usw. erkennen kann. Dies garantiert jedoch nicht, dass Daten auf der Festplatte gespeichert werden. Wenn der MongoDB-Server nach dem Bestätigen des Schreibvorgangs abstürzt, aber bevor er auf die Festplatte übertragen wird, gehen die Daten verloren. Dieser Modus kann wie folgt angegeben werden:

new WriteConcern(1) / WriteConcern.ACKNOWLEDGED

Journaled MongoDB-Modus

In diesem Modus bestätigt der MongoDB-Server den Schreibvorgang erst, nachdem er die Daten an das Journal übergeben hat. Wenn Sie diesen Modus verwenden, werden die Daten aus dem Journal erneut angewendet, selbst wenn der Server beim Neustart des Servers abstürzt. Offensichtlich muss Journaling aktiviert sein, damit dies funktioniert. Auf allen Produktionssystemen sollte Journaling aktiviert sein. Weitere Informationen dazu finden Sie in unserem Beitrag „Sollen Sie MongoDB-Journaling aktivieren?“

In einem Replikatsatz-Szenario gelten die Bedenken hinsichtlich des Journaling-Schreibens nur für das primäre. Standardmäßig wird das Journal alle 100 ms auf die Festplatte geschrieben. Wenn Sie einen Schreibvorgang mit der Journaled-Option angeben, wird das Journal in 30 ms auf die Platte geschrieben. Wenn Sie also für jeden Schreibvorgang j:true angeben, beträgt Ihr Durchsatz maximal 1000/30 =33,3 Schreibvorgänge/Sek. Wenn Sie einen besseren Durchsatz wünschen, müssen Sie Ihre Updates stapeln und j:true für das letzte Update des Stapels festlegen. Dieser Modus kann wie folgt angegeben werden:

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

Fsynced MongoDB-Modus

In diesem Modus bestätigt der MongoDB-Server den Schreibvorgang erst, nachdem der Schreibvorgang auf die Festplatte geschrieben wurde. Dieser Modus kann wie folgt angegeben werden:

new WriteConcern(true) / WriteConcern.FSYNCED

Anerkannter Replikat-MongoDB-Modus

Die vorherigen Schreibsicherheitsmodi gelten nur für einen einzelnen Server. Wenn Sie Replikatsätze ausführen, haben Sie die Möglichkeit zu steuern, wie viele Replikate Ihr Schreibvorgang geschrieben werden muss, bevor er als erfolgreich gilt. Bei einem Write Concern von „w:2“ muss der Schreibvorgang beispielsweise in einen primären und mindestens einen sekundären geschrieben werden, bevor er als erfolgreich gilt. Das verringert den Durchsatz, gibt Ihnen aber mehr Sicherheit. Wenn Sie die Anzahl der Replikate vorher nicht kennen, können Sie mit dem WriteConcern.MAJORITY-Tag sicherstellen, dass die Daten in der Mehrzahl der Replikate gespeichert werden. Dies ist die sicherste Option in MongoDB. Wenn Sie diese Option verwenden, achten Sie auch darauf, den Wert „wtimeout“ festzulegen, um anzugeben, wie lange der Befehl warten soll, bevor er einen Fehler zurückgibt:

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

Die folgenden Tags wurden verworfen (oder sollen es werden) – ERRORS_IGNORED, NORMAL, SAFE, FSYNC_SAFE, JOURNAL_SAFE, REPLICAS_SAFE. Bitte verwenden Sie statt dieser Optionen die neueren Optionen. Wenn Sie Kommentare oder Fragen haben, wenden Sie sich bitte wie immer an [email protected].