Change Data Streaming für Microservices mit Debezium

Change Data Streaming für Microservices mit Debezium

Lose gekoppelte Microservices, unabhängig voneinander entwickelt und betrieben, erlauben die rasche Umsetzung neuer Geschäftsanforderungen. Damit verbunden sind aber auch Herausforderungen: Wie können Daten zwischen verschiedenen Microservices synchronisiert werden? Wie kann man einzelne Services schrittweise aus einem bestehenden monolithischen System extrahieren?

Eine Lösung ist die Publikation von Change Events aus der Datenbank eines Microservice. Dies ermöglicht nicht nur die Replikation von Datenänderungen zu anderen Microservices, Analytics-Systemen o.Ä., sondern auch die Aktualisierung von Volltext-Indizes und Caches oder die Erstellung optimierter Lesedatenmodelle in CQRS-Architekturen.

Der Vortrag stellt das Konzept von Change Data Capture (CDC) und Debezium vor, eine auf Apache Kafka basierende Open-Source-CDC-Lösung. Mit Debezium können Änderungen in Datenbanken wie MySQL, PostgreSQL, MongoDB, Oracle und SQL Server erfasst und als Events in Beinahe-Echtzeit publiziert werden. Dabei ist die Korrektheit und Vollständigkeit der Daten auch dann sichergestellt, falls einmal etwas schiefgeht, etwa weil der Message-Broker vorübergehend ausfällt.

In einer Live-Demo werden wir einen CDC-Datenstrom für die Datenbank eines Microservice aufgesetzt, ohne dass Änderungen am Service selbst erforderlich sind. Anschließend werden wir zeigen, wie verschiedene Consumer die Change Events nutzen können, etwa um eine zweite Datenbank oder einen Suchindex in Elasticsearch zu aktualisieren.

Slides eines Talks from JavaLand 2019 (https://programm.javaland.eu/2019/#/scheduledEvent/569883)

8e25c0ca4bf25113bd9c0ccc5d118164?s=128

Gunnar Morling

March 20, 2019
Tweet

Transcript

  1. Change Data Streaming für Change Data Streaming für Microservices mit

    Debezium Microservices mit Debezium Gunnar Morling Gunnar Morling @gunnarmorling @gunnarmorling
  2. Gunnar Morling Gunnar Morling Opensource-Softwareentwickler bei Red Hat Debezium Hibernate

    Spec Lead für Bean Validation 2.0 Gründer von MapStruct und Deptective gunnar@hibernate.org @gunnarmorling http://in.relation.to/gunnar-morling #Debezium @gunnarmorling
  3. Change Data Capture Change Data Capture Worum geht's? Worum geht's?

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

    anderer DB replizieren Datenversorgung für Analytics-Systems und DWH Daten an andere Teams übertragen #Debezium @gunnarmorling Apache Kafka DB 1 DB 2
  5. CDC Use Cases CDC Use Cases Weitere Weitere Auditing/Historisierung Cache-Updates

    und -Invalidierung Volltextsuche mittels Elasticsearch, Solr etc. CQRS-Lesemodelle UI Live-Updates Streaming Queries ermöglichen #Debezium @gunnarmorling
  6. Change Data Capture Change Data Capture mit Debezium mit Debezium

  7. Debezium Debezium Open-Source-Plattform für CDC Open-Source-Plattform für CDC Extrahiert Change

    Events aus den TX-Logs div. DBs Transparent für schreibende Applikationen Umfassende Typunterstützung (PostGIS etc.) Snapshots, Filter etc. Komplett open source, sehr aktive Community Aktuelle Version: 0.9 (basierend auf Kafka 2.0) In Produktion bei WePay, Trivago, BlaBlaCar etc. #Debezium @gunnarmorling
  8. Advantages of Log-based CDC Advantages of Log-based CDC Tailing the

    transaction log Tailing the transaction log All data changes are captured No polling delay or overhead Transparent to writing applications and models Can capture deletes Can capture old record state and further meta data Different formats/APIs, but Debezium deals with this #Debezium @gunnarmorling
  9. Change-Event-Struktur Change-Event-Struktur Schlüssel (PK der Tabelle) und Wert Payload: Before,

    After, Source Serialisierungsformate: JSON Avro (with Confluent Schema Registry) { "schema": { ... }, "payload": { "before": null, "after": { "id": 1004, "first_name": "Anne", "last_name": "Kretchmar", "email": "annek@noanswer.org" }, "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 } } #Debezium @gunnarmorling
  10. Debezium-Konnektoren Debezium-Konnektoren MySQL Postgres MongoDB SQL Server Oracle (Tech Preview,

    basierend auf XStream) Mögliche weitere: Cassandra? MariaDB? @gunnarmorling #Debezium
  11. #Debezium @gunnarmorling Postgres MySQL Apache Kafka CDC mit Debezium und

    Kafka Connect CDC mit Debezium und Kafka Connect
  12. #Debezium @gunnarmorling Postgres MySQL Apache Kafka Kafka Connect Kafka Connect

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

    DBZ PG DBZ MySQL CDC mit Debezium und Kafka Connect CDC mit Debezium und Kafka Connect
  14. #Debezium @gunnarmorling Postgres MySQL Kafka Connect Kafka Connect Apache Kafka

    DBZ PG DBZ MySQL Elasticsearch ES Connector CDC mit Debezium und Kafka Connect CDC mit Debezium und Kafka Connect
  15. Microservice Microservice CDC Patterns CDC Patterns

  16. Pattern: Datenaustausch für Pattern: Datenaustausch für Microservices Microservices Datenänderungen zwischen

    lose gekoppelten Services propagieren Jeder Service hält optimierte lokale Views #Debezium @gunnarmorling Order Item Stock App Local DB Local DB Local DB App App Item Changes Stock Changes
  17. Source DB (with "Events" table) Kafka Connect Apache Kafka DBZ

    Order Events Credit Worthiness Check Events Pattern: Outbox Pattern: Outbox Dual Writes vermeiden Dual Writes vermeiden #Debezium @gunnarmorling Order Service Shipment Service Customer Service ID Category Type Payload 123 Order OrderCreated { "id" : 123, ... } 456 Order OrderDetail- Canceled { "id" : 456, ... } 789 ... ... ... Id AggregateType AggregateId Type Payload ec6e Order 123 OrderCreated { "id" : 123, ... } 8af8 Order 456 OrderDetailCanceled { "id" : 456, ... } 890b Customer 789 InvoiceCreated { "id" : 789, ... } Outbox-Tabelle
  18. Pattern: Microservice-Extraktion Pattern: Microservice-Extraktion Migration von Monolithen zu Microservices Migration

    von Monolithen zu Microservices Microservice(s) für einzelne Komponenten erstellen Schreibzugriffe noch zum Monolithen Änderungen zum extrahierten Microservice streamen Neue Implementierung testen Schreibzugriffe zum Microservice, Schema weiterentwickeln #Debezium @gunnarmorling
  19. Pattern: Datenqualität sicherstellen Pattern: Datenqualität sicherstellen Unvollständige oder falsche Daten

    erkennen Unvollständige oder falsche Daten erkennen Permanent Datensatzanzahl vergleichen zwischen Quell- und Zielseite Alarm, wenn Schwellwert überschritten Jeden n-ten Datensatz Feld für Feld vergleichen z.B. im Laufe einer Woche alle Datensätze vergleichen #Debezium @gunnarmorling
  20. Pattern: SMTs nutzen Pattern: SMTs nutzen Single-Message-Transformationen Single-Message-Transformationen Geshardete Tabellen

    zu einem Topic aggregieren Kompatibilität nach Schemaänderungen gewährleisten Formatkonvertierungen, z.B. für Date/Time-Typen Zusammenspiel mit Sink-Konnektoren herstellen "after"-Feld extrahieren JSON-Struktur des MongoDB-Konnektors expandieren #Debezium @gunnarmorling
  21. Demo Demo

  22. Debezium auf Kubernetes Debezium auf Kubernetes AMQ Streams: Enterprise-Distribution für

    Apache Kafka AMQ Streams: Enterprise-Distribution für Apache Kafka Umfasst Container-Images für Apache Kafka, Connect, Zookeeper und MirrorMaker Operators für die Verwaltung von Clustern, Topics und Nutzern Kafka Consumer-, Producer- und Admin-Clients, Kafka Streams Support durch Red Hat Upstream Community: Strimzi #Debezium @gunnarmorling
  23. Zusammenfassung Zusammenfassung CDC ermöglicht vielfältige Use Cases wie Replikation, Datenaustausch

    zwischen Microservices u.v.m. Debezium: CDC für diverse Datenbanken Mitstreiter herzlichen willkommen! Lasst uns von Euren Feature Requests und Ideen wissen! #Debezium @gunnarmorling
  24. Ressourcen Ressourcen Website: Quellcode, Beispiele, Compose-Dateien etc. Mailingliste Strimzi (Kafka

    auf Kubernetes/OpenShift) News: @debezium http://debezium.io/ https://github.com/debezium https://groups.google.com/forum/ #!forum/debezium http://strimzi.io/ #Debezium @gunnarmorling
  25. None