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

Streaming von Datenbankänderungen mit Debezium (JUG Darmstadt)

Streaming von Datenbankänderungen mit Debezium (JUG Darmstadt)

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.

Gunnar Morling

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

    View full-size 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 full-size 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 full-size 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
    @gunnarmorling
    Order Item Stock
    App
    Lokale DB Lokale DB Lokale DB
    App App
    Item-Änderungen
    Stock-Änderungen
    #Debezium

    View full-size 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 full-size slide

  8. Change Streams
    Change Streams
    erstellen
    erstellen

    View full-size 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 full-size 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 full-size 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)
    Pull-basiert
    Log Compaction
    Horizontale Skalierbarkeit
    @gunnarmorling
    #Debezium

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size slide

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

    View full-size slide

  20. Debezium
    Debezium
    Aktuell: 0.8 (basierend auf Kafka 1.1)
    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 full-size slide

  21. 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 full-size slide

  22. Ausblick
    Ausblick
    Debezium 0.9
    Oracle Snapshotting, Support für SQL Server
    Debezium 0.x
    Alternative zu XStreams für Oracle (LogMiner)
    Installation via OpenShift-Servicekatalog
    Reactive Streams-Support
    Debezium 1.x
    Standalone Server, Support für Kinesis, Pulsar etc.
    Event-Aggregation, Bausteine für deklarativen CQRS-Support
    Roadmap: http://debezium.io/docs/roadmap/
    @gunnarmorling
    #Debezium

    View full-size slide

  23. 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 full-size slide

  24. 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 full-size slide

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

    View full-size slide