$30 off During Our Annual Pro Sale. View Details »

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

yy_yank
November 21, 2021

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

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

yy_yank

November 21, 2021
Tweet

More Decks by yy_yank

Other Decks in Programming

Transcript

  1. Debeziumで変更データキャプチャを学ぼ

    JJUG CCC 2021 Fall
    #jjug_ccc_c #jjug_ccc
    @yy_yank

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. ● 変更データキャプチャについて知りたい人
    ● Debeziumに興味がある人
    ● データ移行や同期などの良い方法がないか探している

    ● 「モノリスからマイクロサービスへ」を読んだ人
    対象聴講者

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. ● CDC(Change Data Caputure)変更データキャプチャ
    ● Consumer Driven Contractではない
    ● Debeziumの場合、データベースのトランザクションログ
    を読み込むことで変更を検知し、イベントを発火する(大
    体の変更データキャプチャはその形式な気がします)
    変更データキャプチャとは
    1. 変更データキャプチャについて

    View Slide

  10. ● OSSだと、割とDebezium一択なんじゃないかと思う
    参考:CDC(チャンジデータキャプチャ)ツールにどんなも
    のがあるかのメモ
    https://yyyank.blogspot.com/2021/08/research-change-data-caputure-tool.html
    変更データキャプチャのツール
    1. 変更データキャプチャについて

    View Slide

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

    View Slide

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

    View Slide

  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. 変更データキャプチャについて

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. 要するにKafka?


    View Slide

  21. はい


    View Slide

  22. ● DebeziumはKafka Connectプラグイン(といっても過言ではない気がする)
    ● Kafka ConnectのソースコネクタがDBのトランザクションログを読む
    ● Kafka Connectに登録されたDebeziumのソースコネクタがKafkaにメッセージ
    をpublishする
    ● あとはKafkaのイベントを好きにsubscribeすれば良い
    (Kafka Connectのシンクコネクタでも良いし、Kafkaのコンシューマーでよしなに
    subscribeしても良い)
    Debeziumの仕組み
    2. Debeziumとは

    View Slide

  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とは

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. という妄想です


    View Slide

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

    View Slide

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

    View Slide

  34. ● Spring Boot
    ● Spring Kafka
    ● Spring JDBC
    ● Kotlin
    サンプルリポジトリの技術要素
    3. ケーススタディ

    View Slide

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

    View Slide

  36. 実際のサンプルを見てみましょう


    View Slide

  37. DEMO


    View Slide

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

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

    View Slide

  39. なんとなく雰囲気つかめました
    か?


    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. 自分の知識不足による誤りなどあれば教
    えていただけると幸いです。

    適宜、資料修正します。


    連絡先

    twitter @yy_yank


    View Slide