streaming von datenbankänderungen mit debezium · 2018-10-17 · change data capture mit kafka...
TRANSCRIPT
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