Sind Datenbankschemamigrationen in Produktionsumgebungen ein Problem?


13

In Diskussionen über NoSQL vs SQL-Datenbanken höre ich manchmal, dass Unternehmen es vorziehen, NoSQL-Datenbanken ohne Schema zu verwenden, da es problematisch ist, das Schema auf eine neue Version zu migrieren. Aber ist das wirklich ein großes Problem bei Upgrades? Sind relationale Datenbanken für solche Operationen schlecht?

Ich habe diesen Blogeintrag im MongoDB-Blog gelesen: Warum Schemaless?

Antworten:


20

Nur weil Ihre NoSql-Datenbank kein Schema im herkömmlichen Sinne hat, heißt das nicht, dass es kein logisches Schema gibt, mit dem Sie sich bei Änderungen befassen müssen. Im Fall einer typischen App, die MongoDb verwendet, erwartet Ihr Code höchstwahrscheinlich, dass sich bestimmte Felder des json-Objekts auf bestimmte Weise verhalten. Wenn Sie das Verhalten ändern, möchten Sie möglicherweise die bereits in der Datenbank vorhandenen Daten aktualisieren. Mit herkömmlichen RDBMS war dies ein weitgehend gelöstes Problem - Sie mussten nur die zugrunde liegenden Tabellen ÄNDERN. Aber mit diesen neuen NoSQL-Datenbanken haben Sie die Entscheidung: Schreiben Sie ein Skript, um alle Ihre Objekte zu mungeen und zu aktualisieren? Oder fügen Sie Code hinzu, um zwischen Versionen im laufenden Betrieb zu konvertieren? Wenn ja, wie lange unterstützen Sie v1-Objekte? Für immer? Bis v3?

Ich füge hinzu, dass das im MongoDb-Blog-Beitrag verwendete Beispiel ein wenig vereinfacht und sehr einfach zu handhaben ist, wenn Sie einen anständigen Aktualisierungsprozess haben, unabhängig davon, um welches RDBMS es sich handelt. das Hinzufügen eines Feldes tut selten weh. Es ist, wenn Sie sich entscheiden, Ihr NameFeld zu teilen, FirstNameund LastNamedie Dinge werden spannend.


Bei herkömmlichen RDBMS ist dies KEIN gelöstes Problem. Sie müssen weiterhin alle Daten aktualisieren, außer das Schema zu aktualisieren. Dieser Teil ist sowohl für SQL als auch für NoSQL gleich.
Kawing-Chiu

3
@ kawing-chiu RDBMSes, die ihr Geld wert sind, haben eine transaktionale DDL, was sie zu einem gelösten Problem macht. Schemaänderungen und Korrekturen der Daten in einer einzelnen Transaktion, die rückgängig gemacht werden kann.
Blrfl

19

Aber ist das wirklich ein großes Problem bei Upgrades?

Es kann sein.

Einige Organisationen sind - gut - desorganisiert und leisten bei der Schemamigration sehr schlechte Arbeit.

  1. "Migrationswochenende". Stoppen Sie die Server. Sichern und exportieren Sie alle Daten. Erstellen Sie das neue Schema (häufig durch Ändern des vorhandenen Schemas). Laden Sie die Daten neu oder versuchen Sie, sie neu zu strukturieren.

  2. "Kontinuierliches Tweaken". Ändern Sie Tabellen in dem von SQL zulässigen Umfang. Ohne die Reihenfolge der durchgeführten ALTER zu verfolgen. Es ist nicht möglich, zu einer früheren Schema-Version zurückzukehren. Erstellen Sie bei Bedarf neue Tabellen aus vorhandenen Tabellen, und passen Sie hoffentlich alle Anwendungen an, um die neuen Tabellen zu verwenden. Aber - mangels guter Qualitätssicherung - lassen Sie die alten Tabellen "nur für den Fall".

  3. "Volle Panik". Verhindern Sie einfach Schemaänderungen. Machen Sie einen großen Gestank. Behaupten Sie, das Risiko sei zu hoch. Blockiere alle Bemühungen in diese Richtung. Nehmen Sie das Schema als Geisel, bis Sie gezwungen sind, einen vernünftigeren Ansatz zu wählen.

Sind relationale Datenbanken für solche Operationen schlecht?

Jedes Schema ist schwierig zu migrieren.

Das größte Problem ist nicht technisch.

Es ist semantisch.

Ein Hauptgrund für eine Schemaänderung ist, dass das vorherige Schema nicht sehr gut mit der Problemdomäne übereinstimmt. Da sich die Semantik geändert hat, müssen sich die Datenbank (und die Anwendungen) ändern. Manchmal sind dies tiefgreifende Änderungen, die ein Überdenken der Funktionsweise der Anwendungen mit den Daten erfordern.

Das Überarbeiten der Datenbanksemantik kann sehr schwierig sein.

Was Leute anstelle von Schemaänderungen tun, ist einfach, das physikalische Schema zu missbrauchen. Sie beginnen, falsche Daten in vorhandene Felder zu laden, weil sie können. In einem Feld "Kommentar" werden plötzlich wichtige Kundenverwaltungsinformationen angezeigt, gefolgt von "//" und dem eigentlichen Kommentar. Das wächst zu Datenstücken "Feld 1 - Feld 2 // Kommentar". Die Benutzer verfügen über eine Kalkulationstabelle, die diese zusätzlichen Daten aus dem Kommentarfeld extrahiert, da die "echte" Anwendungssoftware ein zu schwer zu änderndes Schema hatte, das die IT nicht ändern wollte.


9
Ich fühle mich dreckig, nachdem ich das gelesen habe.
Michael Borgwardt

3
+1 für eine große Wendung; msgstr "das Schema als Geisel nehmen". Eine gute Analogie. Dort gewesen, das erlebt.
Warren P

1
Aber die Anwendung muss trotzdem aktualisiert werden, hilft also wirklich eine Schemaless-Datenbank?
Jonas

1
@Jonas: Deine Frage ist vage. Aber. Wenn Sie das restriktive SQL-Schema entfernen, haben Sie weniger zu tun. Also trivial: "Ja, es hilft." Sie haben immer Anwendungsänderungen. Anwendungsänderungen ohne Schemaänderungen wären weniger arbeitsaufwendig. Richtig? Oder fragst du etwas anderes?
S.Lott

3

Wir aktualisieren Produktionsdatenbanken ohne Probleme, indem wir Tabellen und (nullfähige) Spalten hinzufügen. Frühere Versionen der Anwendung funktionieren problemlos mit der aktualisierten Datenbank, sie verweisen nur nicht auf die neuen Inhalte. Wir vermeiden es, Tabellen oder Spalten zu entfernen oder die Art und Weise zu ändern, in der vorhandene Daten gespeichert werden. Wenn dies jedoch erforderlich ist, erstellen wir entsprechende Konvertierungsskripten. Unabhängig davon, ob Ihre Datenbank über ein deklariertes typsicheres Schema verfügt oder nicht, erfordern Änderungen in der Datenstruktur eine Datenkonvertierung und Anwendungsaktualisierungen, um mit der neuen Struktur interagieren zu können.


1

Es hängt davon ab, ob.

Erstens, wenn Sie eine wirklich große Datenbank haben, die sich über mehrere Computer erstreckt, wird alles (nicht nur Datenbankaktualisierung) schmerzhaft sein. (egal wie viel Sie im Voraus geplant haben).

Zweitens ist das Aktualisieren einer Datenbank NICHT nur eine Sache der Datenbank - es hängt auch von dem größeren System ab, zu dem die Datenbank gehört. Dies umfasst auch die Datenbankbereitstellung (viele Datenbankserver, mehrere Rechenzentren, Master-Slave-Setups usw.).

Der Schmerz kann gelindert werden, indem Sie die Systemkomponenten so architektonisch gestalten, dass sie alle das DB-Schema-Änderungsereignis in gewisser Weise kennen. Dies bedeutet, dass das gesamte System gegenüber Schemaänderungen tolerant sein und auf "gesunde" Weise darauf reagieren kann.

Sie können sich ein von Facebook entwickeltes Hilfsprogramm zur Behebung von MySQL-Schema-Updates ansehen.

Außerdem gibt es bewährte Standardmethoden wie das Aktivieren des Master-Schreibschutzes, das Ändern von Slaves oder das Erstellen von Entwicklungskopien usw.

In jedem Fall ist ein vollständiges Backup und eine umfangreiche Testsuite ein MUSS. Nur dann können Sie sicher und zuverlässig Änderungen vornehmen.


Aber die Anwendung muss trotzdem aktualisiert werden, hilft also wirklich eine Schemaless-Datenbank?
Jonas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.