2013-05-04 3 views
11

Ich schreibe eine NoSQL-Datenbank-Engine und möchte Funktionen bereitstellen, die den Entwicklern helfen, ihre Anwendung auf eine neue Version zu aktualisieren, ohne den Betrieb der Website zu stoppen, d. H. 0% Ausfallzeit während des Upgrades. Also meine Frage ist, was sind die Methoden oder das allgemeine Design einer Webanwendung, wenn sie rund um die Uhr ausgeführt wird und ihre Datenbankstruktur sehr oft ändert? Alle Beispiele oder Erfolgsgeschichten würden sehr geschätzt werden.Anwendungs-Upgrade in einer Hochverfügbarkeitsumgebung

+0

Aus Interesse, warum schreiben Sie eine NoSQL-Datenbank-Engine? Sind keine der vorhandenen für Ihre Bedürfnisse geeignet? – hertzsprung

+0

bedenken Sie, dass es keinen Schaden gibt, wenn Sie ein Feld nur hinzufügen, wenn Sie eins entfernen ... –

+0

Alle Datenbanken sind langsam. Ich schreibe eine sehr schnelle Engine, die ein INSERT in etwa 2.000 Taktzyklen, das wäre etwa 20 Millionen INSERTs pro Sekunde auf einem durchschnittlichen Laptop-Computer – Nulik

Antwort

1

Die Datenbankstruktur ist eng mit den Geschäftsregeln verbunden, so dass das einzige Szenario, in dem sich die Datenbank häufig ändert, in der Entwicklungsphase eines Projekts liegt.

In einer Produktionsumgebung wird angenommen, dass die Anwendung bereits in Bezug auf Geschäftsregeln stabil ist, daher wird angenommen, dass Änderungen an der Struktur der Datenbank selten sind. Daher denke ich, dass es sehr schwierig sein wird, für diesen Fall ausgearbeitete Lösungen zu finden.

Es gibt natürlich naive Ansätze wie das Erstellen einer exakten Kopie der Datenbank vor dem Upgrade, das Wechseln der Anwendung zum Ausführen auf der Kopie, das Aktualisieren und dann das Zurückschalten.

Ansonsten kann ich an nichts anderes denken.

+0

machen würde sagen, zum Beispiel, Handy veraltet und niemand benutzt es mehr, sondern wir kommunizieren durch Gedanken. Facebook muss nun die Handynummer löschen und ein neues Feld namens "Gedankenverdau" hinzufügen, mit dem Sie verschlüsselte Gedanken austauschen können. Wie aktualisierst du Facebook in ein paar Sekunden, wenn es 1 Million Anfragen pro Sekunde gibt? Das Zeug über Prod und Dev-Umgebungen, die wir bereits kennen – Nulik

+0

Facebook ist ein verteiltes System. Das ist eine andere Sache komplett. –

+0

Außerdem ändert Ihr Szenario nicht "seine Datenbankstruktur sehr oft" –

2

Mit NoSQL - und speziell einer dokumentenorientierten Datenbank - können Sie dies mit der Versionierung erreichen.

Betrachten Sie MongoDB, die alles als Dokumente speichert.

MongoDB ermöglicht es Ihnen, eine Sammlung (eine Gruppe von Dokumenten) zu haben, wo das Schema für jedes Dokument unterschiedlich sein kann.

Angenommen, Sie dieses Dokument für einen Benutzer haben:

{ "_id" : 100, "firstName" : "John", "lastName" : "Smith" }

Sie könnten auch als Dokument in der gleichen Sammlung haben dies:

{ "_id" : 123, "firstName" : "John", "lastName" : "Smith", "hasFoo" : false }

Verschiedene Schemata, aber beide in der gleichen Sammlung. Offensichtlich unterscheidet sich dies sehr von einer traditionellen relationalen Datenbank.

Die Lösung besteht darin, jedem Dokument, das die Schemaversion hat, ein Feld hinzuzufügen. Dann suchen Sie Ihre Anwendung bei jeder Abfrage nach dieser Version.

Eine MongoDB Abfrage könnte wie folgt aussehen:

users.find({ "version" : 3 }).limit(10);

Das ist nur alle Benutzer zurückgibt, die Schema-Version "3" verwenden. Sie können neuere Schemas einfügen, ohne die vorhandene Site zu beeinträchtigen, und alte Schemaversionen, die nicht mehr nützlich sind, langsam löschen.

2

Sie werden ein verteiltes System aufbauen. Es gibt keinen Ausweg, da Sie mehrere Maschinen benötigen, um sich mit Neustarts zu beschäftigen.

Die Entwicklung eines verteilten Systems bedeutet, dass Sie einige Entscheidungen treffen müssen.Pick 2 von:

  1. Haltbarkeit
  2. Verfügbarkeit
  3. Strong Consistancy

Systeme wie S3, haben sich entschieden, 1 & 2 und den Preis dafür bezahlt von # 3 zu Gunsten der "Eventual Consistancy" zu opfern . Es gibt eine great paper on S3, die Sie lesen können. Andere Datenbanklösungen wie DynamoDB haben unterschiedliche Kompromisse gewählt.

Sie werden Load Balancer benötigen. Andernfalls bleiben Sie bei Kunden, die sich direkt mit Ihrem Dienst verbinden, was aus verschiedenen Gründen schwierig ist. Mit einem Load Balancer können Sie einen Computer in Ihrer Flotte neu starten, ohne dass Ausfallzeiten entstehen. Neustarts, wie wir alle wissen, sind eine Tatsache des Lebens.

Doing, was Sie beschreiben, ist sehr hart. Tatsächlich würde ich sagen, dass es ein unmögliches Problem für einen einzelnen Entwickler ist.

Sie sind weit, weit, weit eher auf Ihrem Produkt eine bestehende NoSQL-Datenbank und verbringt Ihre Zeit bessere Ergebnisse zu erzielen working ....

2

Wenn ein Unternehmen in geographischer Verteilung investieren Datenbank. Wie Failover-Toleranz; Es klingt traditionell, aber die Datenreplikation (oder Datenspeicherreplikation) wäre kein Problem für den Routingverkehr.

Option 2: - Verwendung von Caching (benutzerdefinierte Entwicklung) & Radfahren. ex: - 1 Uhr morgens bis 2 Uhr morgens Snapshot 1 der Datenbank (sagen wir server1/Datenzentrum 1) 1:59 am server2/Datenzentrum 2 besteht aus neuen Datenbankarchitektur (neue Felder, neue Tabellen usw.) und @ 2am alle Verkehrsroute durch Rechenzentrum 2.

Radfahren Grundlage der Snapshot kann eine Lösung sein, zu prüfen.

1

Wenn viele Webserver in einer Produktionsumgebung auf diese Datenbank zugreifen und Sie eine inkompatible Codeänderung haben (die ein Feld entfernt und ein neues Feld hinzufügt), würde ich die mehrstufige Lösung empfehlen. Es ist ein bisschen Arbeit, aber Sie riskieren keine Ausfallzeiten, wenn ein Detail schief geht.

Erster Schritt die Anwendung erweitern, so dass die alte und die neue Version geschrieben wird, implementieren, dass Version

Zweiter Schritt convert so weit wie möglich die alten Datenfeldwerte in das neue Datenfeld (Mai Zeit nehmen).

Dritter Schritt die Anwendung nur ändern, das neue Feld zu lesen, stellen Sie es

Vierter Schritt das alte Feld

Fünfter Schritt entfernen Sie das Schreiben der alten Feldwerte Werte entfernen Code, stellen Sie es bereit.

0

Der einzige mögliche Fall, in dem dies erreicht werden kann, ist, wenn Sie eine vollständig zustandslose Anwendung haben. Der Begriff zustandslos umfasst sowohl Anwendungsdaten als auch Anwendungsstruktur. Denken Sie daran, dass das Upgrade die Definition der Geschäftsobjekte zusätzlich zu den Daten ändern kann.Angesichts der Tatsache, dass eine solche zustandslose Anwendung aus offensichtlichen Gründen nicht praktikabel ist, gibt es keinen praktischen Weg, um eine Null-Ausfallzeit für allgemeine Upgrades zu erreichen. Für jede Anwendung, die nicht zustandslos ist, werden die Live-Benutzer (in der Mid-Tier) Business-Objektdefinitionen und Geschäftsdaten zwischengespeichert. Ein Upgrade kann nicht nur neue Geschäftsdaten, sondern auch neue Geschäftsobjektdefinitionen garantieren. Die zwischengespeicherten Daten von Live-Benutzern können immer zu potenziellen Inkonsistenzen mit dem neuen Schema führen. Live-Benutzer können daher nicht migriert werden, es sei denn, Sie können sowohl die Daten als auch die Metadaten (Geschäftsdefinitionen) migrieren, die im Mid-Tier zwischengespeichert werden. Wenn Sie den Mid-Tier-Cache wegblasen, werden die Live-Benutzer davon betroffen. Sie können in Erwägung ziehen, Livebenutzern zu erlauben, weiterhin mit der alten Datenbank zu arbeiten und Datenänderungen später in die neue Datenbank migrieren/zusammenführen. Aber das ist auch ein kompliziertes Problem zu lösen. Jetzt ist es möglich, zu beschränken, was bei einem Zero-Downtime-Upgrade ohne Auswirkungen auf Live-Benutzer zulässig ist. Nach dem Upgrade der Datenbank werden die Live-Benutzer nur zu schreibgeschützten Benutzern, wenn sie sich abmelden und erneut mit dem neuen Schema anmelden .

Verwandte Themen