Streaming von Datenbankänderungen mit Debezium fileAgenda Use Cases für Change Data Streams Change...
Transcript of Streaming von Datenbankänderungen mit Debezium fileAgenda Use Cases für Change Data Streams Change...
Streaming von DatenbankänderungenStreaming von Datenbankänderungen
mit Debeziummit Debezium
Gunnar MorlingGunnar Morling @gunnarmorling@gunnarmorling
AgendaAgenda
Use Cases für Change Data Streams
Change Data Streams erstellen
Change Data Capture mit Kafka (Connect)
Debezium
Demo
#Debezium @gunnarmorling
Gunnar MorlingGunnar 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
Change Data CaptureChange Data Capture
Worum geht's?Worum geht's?
Event-Stream mit allen Daten- und Schemaänderungen einer DB
@gunnarmorling
Apache Kafka
DB 1
#Debezium
?
CDC Use CasesCDC Use Cases
DatenreplikationDatenreplikation
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
CDC Use CasesCDC Use Cases
Microservice-ArchitekturenMicroservice-Architekturen
Propagation von Daten zwischenverschiedenen Services ohneKopplung
Jeder Service hält lokal seine optimierte Datensicht
Auch: Monolithenextraktion
@gunnarmorling
Order Item Stock
App
Lokale DB Lokale DB Lokale DB
App App
Item-ÄnderungenStock-Änderungen
#Debezium
CDC Use CasesCDC Use Cases
WeitereWeitere
Caches aktualisieren oder invalidieren
Aktualisierung von Volltext-Indices via Elasticsearch, Solr etc.
CQRS Read-Modelle
Streaming Queries
UI-Live-Updates
@gunnarmorling#Debezium
Change StreamsChange Streams
erstellenerstellen
Wie Change Streams erstellen?Wie Change Streams erstellen?
Mögliche AnsätzeMö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
Wie Change Streams erstellen?Wie Change Streams erstellen?
Die Lösung: Monitoring der DBDie 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
Apache KafkaApache Kafka
Perfekte Basis für CDC-PipelinesPerfekte Basis für CDC-Pipelines
Messages haben einen Key
Garantierte Ordnung (pro Partition)
Persistent und pull-basiert
Log Compaction
Horizontale Skalierbarkeit
@gunnarmorling#Debezium
@gunnarmorling
Kafka ConnectKafka Connect
Framework für Source- und Sink-Konnektoren
Offset-Verwaltung
Typsystem und Schema-Support
Clustering
Großes Ökosystem von Konnektoren
#Debezium
CDC-Topologie mit Kafka ConnectCDC-Topologie mit Kafka Connect
@gunnarmorling
Postgres
MySQL
Apache Kafka
#Debezium
@gunnarmorling
Postgres
MySQL
Apache KafkaKafka Connect Kafka Connect
#Debezium
CDC-Topologie mit Kafka ConnectCDC-Topologie mit Kafka Connect
@gunnarmorling
Postgres
MySQL
Apache KafkaKafka Connect Kafka Connect
DBZ PG
DBZMySQL
#Debezium
CDC-Topologie mit Kafka ConnectCDC-Topologie mit Kafka Connect
@gunnarmorling
Postgres
MySQL
Kafka Connect Kafka ConnectApache Kafka
DBZ PG
DBZMySQL
Elasticsearch
ES Connector
#Debezium
CDC-Topologie mit Kafka ConnectCDC-Topologie mit Kafka Connect
CDC-Event-StrukturCDC-Event-Struktur
Schlüssel (PK der Tabelle) und Wert
Payload: Vorher-/Nachher-Zustand, Source-Info
JSON
Lesbar
VerboseOptional: Schema in jeder Nachricht
Avro
Kompakte BinärrepräsentationNutzt 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": "mysqlbin.000003", "pos": 154, "row": 0, "snapshot": true, "db": "inventory", "table": "customers" }, "op": "c", "ts_ms": 1486500577691 } }
@gunnarmorling#Debezium
Initiale SnapshotsInitiale 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
Debezium-KonnektorenDebezium-Konnektoren
MySQL
Postgres
MongoDB
Oracle (Tech Preview, XStream-basiert)
SQL Server (Tech Preview)
Geplant
Cassandra?MariaDB?
@gunnarmorling#Debezium
DebeziumDebezium
Aktuell: 0.8/0.9 (basierend auf Kafka 2.0)
Einheitliche EventstrukturUmfangreiche Typunterstützung (PostGIS etc.)Nutzbar auf Amazon RDSMonitoring via JMXGemeinsame Optionen (Filter etc.)
Im Produktiv-Einsatz bei Trivago, WePay, BlaBlaCar und anderen
Rege Community
@gunnarmorling#Debezium
DemoDemo
Message-TransformationenMessage-Transformationen
Bearbeitung einzelner Events via SMTsBearbeitung einzelner Events via SMTs
Use Cases:
ExtraktionKonvertierungRouting
Anwendbar auf Source- oder Sink-Seite
Verfügbar in Debezium:
Logical Table RouterEvent Flattening SMT
@gunnarmorling#Debezium
DemoDemo
AusblickAusblick
Debezium 0.9
Weiterentwicklung Oracle und SQL Server
Alternative zu XStreams für Oracle
Debezium 0.x
Installation via OpenShift-ServicekatalogReactive Streams-SupportCaching via Infinispan
Debezium 1.x
Standalone Server, Support für Kinesis, Pulsar etc.Event-Aggregation, Bausteine für deklarativen CQRS-Support
@gunnarmorling#Debezium
ZusammenfassungZusammenfassung
Debezium: CDC für diverse DBs
Transparentes Aufsetzen von Change Data Streams
Funktioniert zuverlässig auch im Fehlerfall
Keine "Dual-Write"-ProblematikClients setzen nach Ausfall am letzten Offset fort
Alles ist Open Source (Apache License v2)
Contributions herzlich willkommen!
@gunnarmorling#Debezium
Probiert es selber ausProbiert 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
RessourcenRessourcen
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