$30 off During Our Annual Pro Sale. View Details »

Streaming von Datenbankänderungen mit Debezium (JUG Saxony Day)

Streaming von Datenbankänderungen mit Debezium (JUG Saxony Day)

Caches und Suchindizes aktualisieren, Daten zwischen Microservices synchronisieren, Lesemodelle in CQRS-Architekturen erstellen, Datentransfers vom operativen System zu Analytics-Tools - nur einige der Use Cases, die das Streaming von Änderungen aus Datenbanken ermöglicht.

Der Vortrag führt in das Konzept von Change Data Capture (CDC) ein und beleuchtet, wie dieses mit Debezium realisiert werden kann, einer auf Apache Kafka basierenden Open-Source-CDC-Lösung. Wir betrachten, wie Debezium Änderungen aus Datenbanken wie MySQL, PostgreSQL und MongoDB erfasst, wie man auf Change Data Events in Beinahe-Echtzeit reagieren kann und wie Debezium die Korrektheit und Vollständigkeit der Daten sicherstellt, auch falls einmal etwas schief geht, etwa weil der Message-Broker vorübergehend ausfällt.

Gunnar Morling

September 28, 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

    View Slide

  2. Agenda
    Agenda
    Use Cases für Change Data Streams
    Change Data Streams erstellen
    Change Data Capture mit Kafka (Connect)
    Debezium
    Demo
    #Debezium @gunnarmorling

    View Slide

  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
    @gunnarmorling
    [email protected]
    http://in.relation.to/gunnar-morling/
    #Debezium @gunnarmorling

    View Slide

  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
    ?

    View Slide

  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

    View Slide

  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
    Auch: Monolithenextraktion
    @gunnarmorling
    Order Item Stock
    App
    Lokale DB Lokale DB Lokale DB
    App App
    Item-Änderungen
    Stock-Änderungen
    #Debezium

    View Slide

  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
    UI-Live-Updates
    @gunnarmorling
    #Debezium

    View Slide

  8. Change Streams
    Change Streams
    erstellen
    erstellen

    View Slide

  9. 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

    View Slide

  10. Wie Change Streams erstellen?
    Wie Change Streams erstellen?
    Die Lösung: Monitoring der DB
    Die Lösung: Monitoring der DB
    DB trägt Änderungen in Log-Dateien ein und aktualisiert dann die Tabellen
    Verwendet für Transaktions-Recovery, Replikation etc.
    Log-Dateien = Perfekte Basis für CDC
    MySQL: Binlog; Postgres: Write-Ahead Log; MongoDB Op Log
    Transparent für schreibende Applikationen
    Verzögerungen möglich, aber keine Inkonsistenzen
    @gunnarmorling
    #Debezium

    View Slide

  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)
    Persistent und pull-basiert
    Log Compaction
    Horizontale Skalierbarkeit
    @gunnarmorling
    #Debezium

    View Slide

  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

    View Slide

  13. CDC-Topologie mit Kafka Connect
    CDC-Topologie mit Kafka Connect
    @gunnarmorling
    Postgres
    MySQL
    Apache Kafka
    #Debezium

    View Slide

  14. @gunnarmorling
    Postgres
    MySQL
    Apache Kafka
    Kafka Connect Kafka Connect
    #Debezium
    CDC-Topologie mit Kafka Connect
    CDC-Topologie mit Kafka Connect

    View Slide

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

    View Slide

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

    View Slide

  17. 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

    View Slide

  18. 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

    View Slide

  19. Debezium-Konnektoren
    Debezium-Konnektoren
    MySQL
    Postgres
    MongoDB
    Oracle (Tech Preview, XStream-basiert)
    SQL Server (Tech Preview)
    Geplant
    Cassandra?
    MariaDB?
    @gunnarmorling
    #Debezium

    View Slide

  20. Debezium
    Debezium
    Aktuell: 0.8/0.9 (basierend auf Kafka 2.0)
    Einheitliche Eventstruktur
    Umfangreiche Typunterstützung (PostGIS etc.)
    Nutzbar auf Amazon RDS
    Monitoring via JMX
    Gemeinsame Optionen (Filter etc.)
    Im Produktiv-Einsatz bei Trivago, WePay, BlaBlaCar und anderen
    Rege Community
    @gunnarmorling
    #Debezium

    View Slide

  21. Demo
    Demo

    View Slide

  22. 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

    View Slide

  23. Demo
    Demo

    View Slide

  24. Ausblick
    Ausblick
    Debezium 0.9
    Weiterentwicklung Oracle und SQL Server
    Alternative zu XStreams für Oracle
    Debezium 0.x
    Installation via OpenShift-Servicekatalog
    Reactive Streams-Support
    Caching via Infinispan
    Debezium 1.x
    Standalone Server, Support für Kinesis, Pulsar etc.
    Event-Aggregation, Bausteine für deklarativen CQRS-Support
    @gunnarmorling
    #Debezium

    View Slide

  25. 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

    View Slide

  26. Probiert es selber aus
    Probiert es selber aus
    Docker-Images für alle Komponenten
    Umfangreiches Tutorial
    Docker Compose Set-up
    Anleitung für OpenShift
    Strimzi (Kafka auf Kubernetes/OpenShift)
    http://debezium.io/docs/tutorial/
    https://github.com/debezium/debezium-examples/
    http://debezium.io/docs/openshift/
    http://strimzi.io/
    @gunnarmorling
    #Debezium

    View Slide

  27. Ressourcen
    Ressourcen
    Website:
    Quellcode, Beispiele, Compose-Set-up etc.
    Diskussionen, Hilfe
    Roadmap
    @debezium
    http://debezium.io/
    https://github.com/debezium
    https://groups.google.com/forum/
    #!forum/debezium
    http://debezium.io/docs/roadmap/
    @gunnarmorling
    #Debezium

    View Slide

  28. View Slide