Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JUG Hannover: Datenbank Schemaänderungen mit Ze...

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

JUG Hannover: Datenbank Schemaänderungen mit Zero Downtime

Seit Kubernetes ist es einfach geworden, neue Versionen eines Microservices ohne Downtime zu deployen.
Refactorings gehören dabei zum alltäglichen Handwerk eines Entwicklers. Im Datenbankumfeld wird aber bereits die Umbenennung eines Feldes zur Herausforderung.
Wann ist der richtige Zeitpunkt zur Schemaänderung?
Denn entweder kann die alte oder die neue Version des Services nicht mit dem neuen Schema arbeiten.

Also doch wieder im Wartungsfenster den Microservice herunter fahren und die Datenbank migrieren? Oder einen Read-only Modus in den Service einbauen, um so den potentiellen Datenverlust zu vermeiden?

Nicht nötig, denn in diesem Talk werden Rezepte vorgestellt, eine Schemaänderung ohne Downtime oder Datenverlust zu meistern.

Es wird gezeigt, wie Datenbankmigrationen getestet werden können.

Dabei wird der Talk durch Beispiele und Fallstricke aus der Praxis veranschaulicht.

Avatar for Carsten Birkelbach

Carsten Birkelbach

September 23, 2019

More Decks by Carsten Birkelbach

Other Decks in Programming

Transcript

  1. MOTIVATION WARUM ZERO DOWNTIME DEPLOYMENTS? ▸ Anforderungen der Kunden gestiegen

    ▸ Internationales Geschäft braucht 24/7 ▸ Manchmal auch, weil es „modern“ ist
  2. MOTIVATION WARUM SCHEMA ÄNDERUNGEN ▸ Code refactoring alltäglich ▸ Änderungen

    durch wachsende Anforderungen ▸ Unterschiede zwischen Modell und Datenbank klein halte ▸ Insbesondere im Support ein Problem
  3. WELCHE FEHLER KÖNNEN PASSIEREN? ▸ Fehler in alter Version nach

    Schemaänderung ▸ Datenverlust durch lost updates ▸ Gefährlich, da oft nicht erkannt
  4. WELCHE SCHEMAÄNDERUNGEN GIBT ES? ▸ Spalten hinzufügen ▸ Spalten löschen

    ▸ Spaltennamen ändern ▸ Constraints ändern ▸ Typen ändern ▸ [Enums ändern]
  5. WAS SOLLTE ICH BERÜCKSICHTIGEN? ▸ Falls Zero Downtime nicht wirklich

    notwendig ist: Wartungsfenster nutzen, um Datenbankänderungen zu machen! ▸ Werkzeug benutzen, um Schemaänderungen automatisiert durchzuführen ▸ Schemaänderungen mit Sourcecode versionieren ▸ Jede Datenbankänderungen auf produktionsnahen Stages und auf Produktion in gleicher Reihenfolge durchführen ▸ Möglichst häufig kleine Änderungen
  6. WAS SOLLTE ICH BERÜCKSICHTIGEN? ▸ Jedes Schema muss zur Version

    vor und nach der Änderung passen! 1.0 1.1 SCHEMA 1.0 SCHEMA 1.1 SCHEMAÄNDERUNG
  7. SPALTEN HINZUFÜGEN ▸ Risiken: ▸ Änderungen, die in neuer Version

    passieren, können durch alte Version verloren gehen ▸ Lösung: ▸ Neue Spalten erst benutzen, wenn die alte Version nicht mehr aktiv ▸ Durch Feature-Flags oder zwei Versionen
  8. SPALTEN LÖSCHEN ▸ Risiken: ▸ Alte Version versucht in gelöschte

    Spalten zu schreiben ▸ Lösung: ▸ Spalten erst löschen, wenn diese nicht mehr genutzt werden
  9. SPALTEN UMBENENNEN ▸ Risiken: ▸ Datenverluste durch neue und alte

    Versionen möglich ▸ Alte Version kann nicht mehr schreiben ▸ Lösung:
  10. CONSTRAINTS ÄNDERN ▸ Risiken ▸ Alte Version verletzt Constraint ▸

    Alte Version erwartet Daten, die diese Bedingung erfüllen ▸ Lösung: ▸ Constraint erst einführen oder löschen, wenn Vorgängerversion diese Änderung erfüllen kann bzw. erwartet
  11. TYP ÄNDERN ▸ Risiken ▸ Alte Version erfüllt Typ nicht

    ▸ Alte Version erwartet Daten von anderem Typ ▸ Lösung: ▸ Typ erst ändern, wenn alte Version diese verarbeiten kann ▸ Bei komplexen Änderungen ähnlich wie bei Umbenennung vorgehen!
  12. ENUM ÄNDERN ▸ Risiken ▸ Alte Version kennt Wert eines

    hinzugefügten Enums nicht ▸ Neue Version kennt Wert eines alten Enums nicht ▸ Lösung: ▸ Enum erst benutzen, wenn alte Version damit umgehen kann ▸ Enum erst löschen, wenn sicher nicht mehr verwendet ▸ Enums fehlertolerant mappen
  13. KOMPLEXE ÄNDERUNGEN ▸ Neue Tabelle/Collection erstellen ▸ Mapping zwischen alter

    und neuer Struktur definieren ▸ Script zur Migration der Daten schreiben ▸ Daten nur migrieren, falls noch nicht im Ziel vorhanden ▸ Script muss nicht schnell laufen
  14. TESTEN ▸ Migrationskonzept durch Team infrage stellen lassen ▸ Mapper

    durch Property Based Testing prüfen ▸ Zufälliges Objekt mappen und wieder zurück ▸ v1 -> v2 -> v1’ ▸ v1 == v1’ ▸ Verifikationsschritt nach Migration (Wir haben Zeit!) ▸ Lasttest, um sicher zu gehen, dass das Zero Downtime Deployment wirklich keinen Datenverlust oder andere Fehler verursacht ▸ Aussagekräftige Alerts definieren (immer eine gute Idee)