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

Streaming von Datenbankänderungen mit Debezium

Streaming von Datenbankänderungen mit Debezium

Debezium (Substantiv | de·be·zi·um | /dɪ:ˈbɪ:ziːəm/) – Geheimzutat für Change Data Capture

Die Aktualisierung von Caches und Volltextindizes, die Synchronisation von Daten zwischen verschiedenen Microservices, die Erstellung von optimierten Lesemodellen in CQRS-Architekturen, Datentransfers vom operativen System zu Analytics-Tools — dies sind nur einige der Use Cases, die durch das Streamen von Änderungen aus Datenbanken heraus ermöglicht werden.

Der Vortrag führt in das Konzept von Change Data Capture (CDC) ein und beleuchtet, wie dieses mittels Debezium (http://debezium.io) umgesetzt werden kann, einer auf Apache Kafka basierenden Open-Source-CDC-Lösung.

Wir werden betrachten, wie Debezium alle Änderungen aus Datenbanken wie MySQL, PostgreSQL und MongoDB erfasst, wie man auf die entsprechenden Ereignisse in Beinahe-Echtzeit reagieren kann und wie Debezium die Korrektheit und Vollständigkeit der Daten auch dann sicherstellt, falls einmal etwas schief geht, etwa weil eine Zieldatenbank vorübergehend ausfällt.

Präsentation bei der JUG Münster: http://www.jug-muenster.de/streaming-von-datenbankaenderungen-mit-debezium-21-3-2018-1517/

Gunnar Morling

March 21, 2018
Tweet

More Decks by Gunnar Morling

Other Decks in Programming

Transcript

  1. Streaming von Datenbankänderungen Streaming von Datenbankänderungen mit Debezium mit Debezium

    Gunnar Morling Gunnar Morling @gunnarmorling @gunnarmorling 1
  2. Agenda Agenda Use Cases für Change Data Streams Change Data

    Streams erstellen Change Data Capture mit Kafka (Connect) Debezium Demo #Debezium @gunnarmorling 2
  3. Gunnar Morling Gunnar Morling Open Source Software Engineer bei Red

    Hat Debezium Hibernate Spec Lead für Bean Validation 2.0 Weitere Projekte: ModiTect, MapStruct [email protected] @gunnarmorling http://in.relation.to/gunnar-morling/ #Debezium @gunnarmorling 3
  4. Change Data Capture Change Data Capture Worum geht's? Worum geht's?

    Event-Stream mit allen Daten- und Schemaänderungen einer DB @gunnarmorling Apache Kafka DB 1 #Debezium ? 4
  5. CDC Use Cases CDC Use Cases Datenreplikation Datenreplikation Daten aus

    einer DB an eine andere übertragen Analytics-System oder DWH befüllen Daten an andere Teams übermitteln @gunnarmorling Apache Kafka DB 1 DB 2 #Debezium 5
  6. CDC Use Cases CDC Use Cases Microservice-Architekturen Microservice-Architekturen Propagation von

    Daten zwischen verschiedenen Services ohne Kopplung Jeder Service hält lokal seine optimierte Datensicht @gunnarmorling Order Item Stock App Lokale DB Lokale DB Lokale DB App App 6 Item-Änderungen Stock-Änderungen #Debezium
  7. CDC Use Cases CDC Use Cases Weitere Weitere Caches aktualisieren

    oder invalidieren Aktualisierung von Volltext-Indices via Elasticsearch, Solr etc. CQRS Read-Modelle Streaming Queries @gunnarmorling #Debezium 7
  8. Wie Change Streams erstellen? Wie Change Streams erstellen? Mögliche Ansätze

    Mögliche Ansätze Dual Write Fehlerbehandlung? Race Conditions möglich Polling Wie veränderte Datensätze finden? Wie Löschungen erkennen? https://www.confluent.io/blog/using-logs-to-build-a-solid- data-infrastructure-or-why-dual-writes-are-a-bad-idea/ @gunnarmorling #Debezium 9
  9. Wie Change Streams erstellen? Wie Change Streams erstellen? Die Lösung:

    Monitoring der DB Die Lösung: Monitoring der DB Log-Files der DB auslesen Bei Ausfällen nur Verzögerungen aber keine Inkonsistenzen Transparent für schreibende Anwendungen @gunnarmorling #Debezium 10
  10. Database Logs Database Logs Details Details Anwendungen schreiben in die

    DB DB trägt Änderungen in Log-Dateien ein und aktualisiert dann die Tabellen Logs genutzt für TX Recovery, Replikation etc. MySQL: binlog Postgres: write-ahead log MongoDB op log Perfekte Quelle für CDC! @gunnarmorling #Debezium 11
  11. Apache Kafka Apache Kafka Perfekte Basis für CDC-Pipelines Perfekte Basis

    für CDC-Pipelines Messages haben einen Key Garantierte Ordnung (pro Partition) Pull-basiert Log Compaction Horizontale Skalierbarkeit @gunnarmorling #Debezium 12
  12. @gunnarmorling Kafka Connect Kafka Connect Framework für Source- und Sink-Konnektoren

    Offset-Verwaltung Typsystem und Schema-Support Clustering Großes Ökosystem von Konnektoren #Debezium 13
  13. @gunnarmorling Postgres MySQL Apache Kafka Kafka Connect Kafka Connect #Debezium

    CDC-Topologie mit Kafka Connect CDC-Topologie mit Kafka Connect 15
  14. @gunnarmorling Postgres MySQL Apache Kafka Kafka Connect Kafka Connect DBZ

    PG DBZ MySQL #Debezium CDC-Topologie mit Kafka Connect CDC-Topologie mit Kafka Connect 16
  15. @gunnarmorling Postgres MySQL Kafka Connect Kafka Connect Apache Kafka DBZ

    PG DBZ MySQL Elasticsearch ES Connector 17 #Debezium CDC-Topologie mit Kafka Connect CDC-Topologie mit Kafka Connect
  16. CDC-Event-Struktur CDC-Event-Struktur Schlüssel (PK der Tabelle) und Wert Payload: Vorher-/Nachher-Zustand,

    Source-Info JSON Lesbar Verbose Optional: Schema in jeder Nachricht Avro Kompakte Binärrepräsentation Nutzt Confluent Schema Registry { "schema": { ... }, "payload": { "before": null, "after": { "id": 1004, "first_name": "Anne", "last_name": "Kretchmar", "email": "[email protected]" }, "source": { "name": "dbserver1", "server_id": 0, "ts_sec": 0, "file": "mysql­bin.000003", "pos": 154, "row": 0, "snapshot": true, "db": "inventory", "table": "customers" }, "op": "c", "ts_ms": 1486500577691 } } @gunnarmorling #Debezium 18
  17. Initiale Snapshots Initiale Snapshots TX Logs können zum Startzeitpunkt des

    Konnektors unvollständig sein Erstellung eines Snapshots der Tabellen (übermittelt INSERT-Events) Danach Lesen der Logs @gunnarmorling #Debezium 19
  18. Debezium Debezium Aktuell: 0.7.x (basierend auf Kafka 1.0) Umfangreiche Typunterstützung

    (PostGIS etc.) Nutzbar auf Amazon RDS Monitoring via JMX Im Produktiv-Einsatz bei Trivago, WePay und anderen Rege Community @gunnarmorling #Debezium 21
  19. Message-Transformationen Message-Transformationen Bearbeitung einzelner Events via SMTs Bearbeitung einzelner Events

    via SMTs Use Cases: Extraktion Konvertierung Routing Anwendbar auf Source- oder Sink-Seite Verfügbar in Debezium: Logical Table Router Event Flattening SMT @gunnarmorling #Debezium 23
  20. Ausblick Ausblick Debezium 0.8/0.9 Support für Oracle Debezium 0.x Support

    für SQL Server, Infinispan als Sink Installation via OpenShift-Servicekatalog Reactive Streams-Support Debezium 1.x Event-Aggregation, Bausteine für deklarativen CQRS-Support Roadmap: http://debezium.io/docs/roadmap/ @gunnarmorling #Debezium 25.1
  21. Ausblick Ausblick Reactive Streams Reactive Streams @gunnarmorling #Debezium Configuration config

    = ...; Flowable<ChangeEvent<String>> stream = ReactiveEngine.create() .withConfiguration(config) .withOffsetCommitPolicy(OffsetCommitPolicy.periodic(config)) .asType(AsJson.class) .build() .stream(); stream.subscribe(System.out::println); 25.2
  22. Probiert es selber aus Probiert es selber aus Docker-Images für

    alle Komponenten Umfangreiches Tutorial Docker Compose Set-up Anleitung für OpenShift OpenShift-Lernszenario http://debezium.io/docs/tutorial/ https://github.com/debezium/debezium-examples/ http://debezium.io/docs/openshift/ https://learn.openshift.com/middleware/debezium-getting- started/ @gunnarmorling #Debezium 26
  23. Zusammenfassung Zusammenfassung Debezium: CDC für diverse DBs Transparentes Aufsetzen von

    Change Data Streams Funktioniert zuverlässig auch im Fehlerfall Keine "Dual-Write"-Problematik Clients setzen nach Ausfall am letzten Offset fort Alles ist Open Source (Apache License v2) Contributions herzlich willkommen! @gunnarmorling #Debezium 27
  24. Ressourcen Ressourcen Website Quellcode, Beispiele, Compose-Set-up etc. Diskussionen, Hilfe Aktuelle

    Neuigkeiten @debezium http://debezium.io/ https://github.com/debezium https://groups.google.com/forum/ #!forum/debezium @gunnarmorling #Debezium 28
  25. 29