Save 37% off PRO during our Black Friday Sale! »

Debeziumで変更データキャプチャを学ぼう #jjug_ccc

B5f0b0a84d9063dbe2cb2f1f6025f2f3?s=47 yy_yank
November 21, 2021

Debeziumで変更データキャプチャを学ぼう #jjug_ccc

JJUG CCC 2021 Fallの 「15:00 ~ 15:50 Debeziumで変更データキャプチャを学ぼう」の資料です

B5f0b0a84d9063dbe2cb2f1f6025f2f3?s=128

yy_yank

November 21, 2021
Tweet

Transcript

  1. Debeziumで変更データキャプチャを学ぼ う JJUG CCC 2021 Fall #jjug_ccc_c #jjug_ccc @yy_yank

  2. #jjug_ccc_c #jjug_ccc でつぶやいてください ハッシュタグ TODO ハッシュタグ

  3. 自己紹介 やんく(@yy_yank) こいつです ・(株)ユーザベースのプログラマ ・JJUG CCC登壇5回目? ・iconはsakuraエディタなのに ・vim使う ・Java,Kotlin,Goが好き

  4. • このセッションは個人の感想です。所属企業のう んぬんかんぬんではありません。 NOTE

  5. • 変更データキャプチャについて知りたい人 • Debeziumに興味がある人 • データ移行や同期などの良い方法がないか探している 人 • 「モノリスからマイクロサービスへ」を読んだ人 対象聴講者

  6. • Debezium完全に理解した、自分でも使えそう!と思っ てもらいたい • 変更データキャプチャを使えば移行元のコードベース に手を加えずに変更を検知できる 今日のセッションで伝えたいこと

  7. 1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ

  8. 1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ

  9. • CDC(Change Data Caputure)変更データキャプチャ • Consumer Driven Contractではない • Debeziumの場合、データベースのトランザクションログ

    を読み込むことで変更を検知し、イベントを発火する(大 体の変更データキャプチャはその形式な気がします) 変更データキャプチャとは 1. 変更データキャプチャについて
  10. • OSSだと、割とDebezium一択なんじゃないかと思う 参考:CDC(チャンジデータキャプチャ)ツールにどんなも のがあるかのメモ https://yyyank.blogspot.com/2021/08/research-change-data-caputure-tool.html 変更データキャプチャのツール 1. 変更データキャプチャについて

  11. • 何らかの理由で変更のできないコードベース • 変更のしにくいコードベース • どこでDBデータが更新、削除、登録されているか分か りにくいコードベース →コードベースに手を加えることなく変更を検知できる! なぜ、変更データキャプチャか? 1.

    変更データキャプチャについて
  12. • データ移行、データ同期などを考えたい場合 例) • マイクロサービス化 • DBリプレース • データの差分更新(キャッシュ、DB、Elasticsearch etc...)

    どういう時に変更データキャプチャを使う? 1. 変更データキャプチャについて
  13. • チェンジイベント(データ)に基づいているか、ドメインイベントに基づ いているかの違いがある ◦ データに基づいているのであれば変更データキャプチャ ◦ ユーザーがどういった意図で操作したかといったドメイン知識が 必要であればイベントソーシング https://rheb.hatenablog.com/entry/2020/02/10/event-sourcing-vs-cdc/ https://debezium.io/blog/2020/02/10/event-sourcing-vs-cdc/

    変更データキャプチャ vs イベントソーシング 1. 変更データキャプチャについて
  14. • 結局、どれぐらいデータが同期されていない時間を許 容するかという要件が大きい ◦ 1秒ごとに最新データが必要なのか ◦ 1日ごとにデータが最新化されれば良いのか 変更データキャプチャ vs バッチ

    1. 変更データキャプチャについて
  15. • データ量の問題 ◦ データは増え続けるか ◦ バッチの実行時間は増え続けるか ◦ バッチのメンテは大変ではないか 変更データキャプチャ vs

    バッチ 1. 変更データキャプチャについて
  16. 1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ

  17. https://debezium.io/ • RedHatがサポートするオープンソースプロジェクト • データベースの行レベルの変更をキャプチャする分散サービスのセット • 日本語のREADMEがある https://github.com/debezium/debezium/blob/master/README_JA.md Debeziumの概要 2.

    Debeziumとは
  18. https://debezium.io/documentation/reference/1.7/architecture.html より引用 Debeziumの仕組み(Source/Sinkコネクタ使う場合) 2. Debeziumとは

  19. https://debezium.io/documentation/reference/1.7/architecture.html より引用 Debeziumの仕組み(Debezium Serverの場合) 2. Debeziumとは

  20. 要するにKafka?


  21. はい


  22. • DebeziumはKafka Connectプラグイン(といっても過言ではない気がする) • Kafka ConnectのソースコネクタがDBのトランザクションログを読む • Kafka Connectに登録されたDebeziumのソースコネクタがKafkaにメッセージ をpublishする

    • あとはKafkaのイベントを好きにsubscribeすれば良い (Kafka Connectのシンクコネクタでも良いし、Kafkaのコンシューマーでよしなに subscribeしても良い) Debeziumの仕組み 2. Debeziumとは
  23. • Kafkaに依存するのではなくEmbedded Engineを使うことで変更を 検知して、お好みのメッセージブローカーに送信することも出来る • 以下はAmazon Kinesisに変更イベントをpublishしている例 https://github.com/debezium/debezium-examples/blob/master /kinesis/src/main/java/io/debezium/examples/kinesis/ChangeD ataSender.java

    Embedded Engineもある 2. Debeziumとは
  24. https://debezium.io/documentation/reference/connectors/inde x.html MySQL、PostgreSQL、SQL Server、Oracle、DB2、 Mongo DB、Cassandra (Incubating)、Vitess (Incubating) 対応しているデータベース 2.

    Debeziumとは
  25. 1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ

  26. https://github.com/yyYank/2021-fall-debezium-s ample こちらのリポジトリにサンプルコードがあります 3. ケーススタディ

  27. • 音楽サイトのモノリスがあった ◦ 音楽配信、歌詞表示、ランキング、ECサイト、音楽 系の独自記事などのコンテンツ ◦ アルバム関連のドメイン境界を分離してマイクロ サービス化すると、今後の機能リリース的に嬉し いことがわかったのでマイクロサービス化 ストーリー

    3. ケーススタディ
  28. • 既存のモノリス側のエンドポイントから徐々にマイクロ サービスへ移行することになった • これまでは単純なアルバムとトラック情報、そして曲 ごとの五段階の評価(★3つなど)しかなかった ストーリー 3. ケーススタディ

  29. • 今後マイクロサービスとしてアルバム情報とアルバム を気に入ってる人の情報を集計して別のアルバムや 曲をレコメンドにしたり、レビューをさらに詳細にコメン トを書けるようにしたり • アルバム関連のデータ移行をしたいが、音楽サイトの 本番を止めるわけにはいかない ストーリー 3.

    ケーススタディ
  30. • そこで、変更データキャプチャを使って徐々にデータ を同期する!!!! ストーリー 3. ケーススタディ

  31. という妄想です


  32. • 既存システム(モノリス) • 新しいマイクロサービス(album-api) 登場人物 3. ケーススタディ

  33. • 変更データキャプチャを使ってモノリスDBからアルバ ムAPIにデータを同期する (変更をイベントを検知し、アルバムAPIのエンドポイント を叩いて登録、更新、削除の処理を行う) これだけです!単純な例でスミマセン サンプルリポジトリでやっていること 3. ケーススタディ

  34. • Spring Boot • Spring Kafka • Spring JDBC •

    Kotlin サンプルリポジトリの技術要素 3. ケーススタディ
  35. Dockerで動かしているもの • Kafka • Kafka Connect • Zookeeper • MySQL(モノリスDB)

    • MySQL(アルバムAPI用DB) サンプルリポジトリの技術要素 3. ケーススタディ
  36. 実際のサンプルを見てみましょう


  37. DEMO


  38. • Kafkaのトピックはデータベースのテーブル毎に作成される • Kafka ConnectにDebeziumコネクタ登録するときの設定が間違っ ているとデータベースのテーブル毎にKafkaのトピックは作成されな い • MySQLがbinlog =

    rowで行レベルでのbinlogを出力していないと、 変更が検知できなくてDebeziumコネクタがKafkaのイベントを publish出来ない DEMOで伝えたハマりどころ 3. ケーススタディ
  39. なんとなく雰囲気つかめました か?


  40. 1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ

  41. • 変更データキャプチャを使うことで、データの同期がや りやすくなる • バッチとサヨナラも可能かもしれない • Debeziumを使う ≒ Kafkaと付き合う •

    Kafkaが嫌ならEmbedded Engineという手もある まとめ
  42. • 非同期と付き合う ≒ トレーサビリティが必要になる • 異常系の考慮が必要(書き込み失敗、リトライetc...) • データ移行は段階的に • 同時実行やフィーチャーフラグなどで慎重に

    まとめ
  43. 自分の知識不足による誤りなどあれば教 えていただけると幸いです。
 適宜、資料修正します。
 
 連絡先
 twitter @yy_yank