JJUG CCC 2021 Fallの 「15:00 ~ 15:50 Debeziumで変更データキャプチャを学ぼう」の資料です
Debeziumで変更データキャプチャを学ぼうJJUG CCC 2021 Fall#jjug_ccc_c #jjug_ccc@yy_yank
View Slide
#jjug_ccc_c #jjug_cccでつぶやいてくださいハッシュタグ TODOハッシュタグ
自己紹介やんく(@yy_yank) こいつです・(株)ユーザベースのプログラマ・JJUG CCC登壇5回目?・iconはsakuraエディタなのに・vim使う・Java,Kotlin,Goが好き
● このセッションは個人の感想です。所属企業のうんぬんかんぬんではありません。NOTE
● 変更データキャプチャについて知りたい人● Debeziumに興味がある人● データ移行や同期などの良い方法がないか探している人● 「モノリスからマイクロサービスへ」を読んだ人対象聴講者
● Debezium完全に理解した、自分でも使えそう!と思ってもらいたい● 変更データキャプチャを使えば移行元のコードベースに手を加えずに変更を検知できる今日のセッションで伝えたいこと
1. 変更データキャプチャについて2. Debeziumとは3. ケーススタディまとめアジェンダアジェンダ
● CDC(Change Data Caputure)変更データキャプチャ● Consumer Driven Contractではない● Debeziumの場合、データベースのトランザクションログを読み込むことで変更を検知し、イベントを発火する(大体の変更データキャプチャはその形式な気がします)変更データキャプチャとは1. 変更データキャプチャについて
● OSSだと、割とDebezium一択なんじゃないかと思う参考:CDC(チャンジデータキャプチャ)ツールにどんなものがあるかのメモhttps://yyyank.blogspot.com/2021/08/research-change-data-caputure-tool.html変更データキャプチャのツール1. 変更データキャプチャについて
● 何らかの理由で変更のできないコードベース● 変更のしにくいコードベース● どこでDBデータが更新、削除、登録されているか分かりにくいコードベース→コードベースに手を加えることなく変更を検知できる!なぜ、変更データキャプチャか?1. 変更データキャプチャについて
● データ移行、データ同期などを考えたい場合例)● マイクロサービス化● DBリプレース● データの差分更新(キャッシュ、DB、Elasticsearch etc...)どういう時に変更データキャプチャを使う?1. 変更データキャプチャについて
● チェンジイベント(データ)に基づいているか、ドメインイベントに基づいているかの違いがある○ データに基づいているのであれば変更データキャプチャ○ ユーザーがどういった意図で操作したかといったドメイン知識が必要であればイベントソーシング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. 変更データキャプチャについて
● 結局、どれぐらいデータが同期されていない時間を許容するかという要件が大きい○ 1秒ごとに最新データが必要なのか○ 1日ごとにデータが最新化されれば良いのか変更データキャプチャ vs バッチ1. 変更データキャプチャについて
● データ量の問題○ データは増え続けるか○ バッチの実行時間は増え続けるか○ バッチのメンテは大変ではないか変更データキャプチャ vs バッチ1. 変更データキャプチャについて
https://debezium.io/● RedHatがサポートするオープンソースプロジェクト● データベースの行レベルの変更をキャプチャする分散サービスのセット● 日本語のREADMEがあるhttps://github.com/debezium/debezium/blob/master/README_JA.mdDebeziumの概要2. Debeziumとは
https://debezium.io/documentation/reference/1.7/architecture.html より引用Debeziumの仕組み(Source/Sinkコネクタ使う場合)2. Debeziumとは
https://debezium.io/documentation/reference/1.7/architecture.html より引用Debeziumの仕組み(Debezium Serverの場合)2. Debeziumとは
要するにKafka?
はい
● DebeziumはKafka Connectプラグイン(といっても過言ではない気がする)● Kafka ConnectのソースコネクタがDBのトランザクションログを読む● Kafka Connectに登録されたDebeziumのソースコネクタがKafkaにメッセージをpublishする● あとはKafkaのイベントを好きにsubscribeすれば良い(Kafka Connectのシンクコネクタでも良いし、Kafkaのコンシューマーでよしなにsubscribeしても良い)Debeziumの仕組み2. Debeziumとは
● Kafkaに依存するのではなくEmbedded Engineを使うことで変更を検知して、お好みのメッセージブローカーに送信することも出来る● 以下はAmazon Kinesisに変更イベントをpublishしている例https://github.com/debezium/debezium-examples/blob/master/kinesis/src/main/java/io/debezium/examples/kinesis/ChangeDataSender.javaEmbedded Engineもある2. Debeziumとは
https://debezium.io/documentation/reference/connectors/index.htmlMySQL、PostgreSQL、SQL Server、Oracle、DB2、Mongo DB、Cassandra (Incubating)、Vitess(Incubating)対応しているデータベース2. Debeziumとは
https://github.com/yyYank/2021-fall-debezium-sampleこちらのリポジトリにサンプルコードがあります3. ケーススタディ
● 音楽サイトのモノリスがあった○ 音楽配信、歌詞表示、ランキング、ECサイト、音楽系の独自記事などのコンテンツ○ アルバム関連のドメイン境界を分離してマイクロサービス化すると、今後の機能リリース的に嬉しいことがわかったのでマイクロサービス化ストーリー3. ケーススタディ
● 既存のモノリス側のエンドポイントから徐々にマイクロサービスへ移行することになった● これまでは単純なアルバムとトラック情報、そして曲ごとの五段階の評価(★3つなど)しかなかったストーリー3. ケーススタディ
● 今後マイクロサービスとしてアルバム情報とアルバムを気に入ってる人の情報を集計して別のアルバムや曲をレコメンドにしたり、レビューをさらに詳細にコメントを書けるようにしたり● アルバム関連のデータ移行をしたいが、音楽サイトの本番を止めるわけにはいかないストーリー3. ケーススタディ
● そこで、変更データキャプチャを使って徐々にデータを同期する!!!!ストーリー3. ケーススタディ
という妄想です
● 既存システム(モノリス)● 新しいマイクロサービス(album-api)登場人物3. ケーススタディ
● 変更データキャプチャを使ってモノリスDBからアルバムAPIにデータを同期する(変更をイベントを検知し、アルバムAPIのエンドポイントを叩いて登録、更新、削除の処理を行う)これだけです!単純な例でスミマセンサンプルリポジトリでやっていること3. ケーススタディ
● Spring Boot● Spring Kafka● Spring JDBC● Kotlinサンプルリポジトリの技術要素3. ケーススタディ
Dockerで動かしているもの● Kafka● Kafka Connect● Zookeeper● MySQL(モノリスDB)● MySQL(アルバムAPI用DB)サンプルリポジトリの技術要素3. ケーススタディ
実際のサンプルを見てみましょう
DEMO
● Kafkaのトピックはデータベースのテーブル毎に作成される● Kafka ConnectにDebeziumコネクタ登録するときの設定が間違っているとデータベースのテーブル毎にKafkaのトピックは作成されない● MySQLがbinlog = rowで行レベルでのbinlogを出力していないと、変更が検知できなくてDebeziumコネクタがKafkaのイベントをpublish出来ないDEMOで伝えたハマりどころ3. ケーススタディ
なんとなく雰囲気つかめましたか?
● 変更データキャプチャを使うことで、データの同期がやりやすくなる● バッチとサヨナラも可能かもしれない● Debeziumを使う ≒ Kafkaと付き合う● Kafkaが嫌ならEmbedded Engineという手もあるまとめ
● 非同期と付き合う ≒ トレーサビリティが必要になる● 異常系の考慮が必要(書き込み失敗、リトライetc...)● データ移行は段階的に● 同時実行やフィーチャーフラグなどで慎重にまとめ
自分の知識不足による誤りなどあれば教えていただけると幸いです。 適宜、資料修正します。 連絡先 twitter @yy_yank