Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Debeziumで変更データキャプチャを学ぼう #jjug_ccc
Search
yy_yank
November 21, 2021
Programming
0
620
Debeziumで変更データキャプチャを学ぼう #jjug_ccc
JJUG CCC 2021 Fallの 「15:00 ~ 15:50 Debeziumで変更データキャプチャを学ぼう」の資料です
yy_yank
November 21, 2021
Tweet
Share
More Decks by yy_yank
See All by yy_yank
結局、リファクタリングって何なのか 〜掃除から紐解くリファクタリング〜(refactoring vs room cleaning)
yyyank
0
210
R2DBCでAPIの高速化をしようとしてやめた話
yyyank
0
830
サーバーサイドKotlinという選択肢とユーザベース
yyyank
0
230
Javaプログラマのための頑張らないGo入門
yyyank
0
15
Other Decks in Programming
See All in Programming
OpenTelemetryでRailsのパフォーマンス分析を始めてみよう(KoR2024)
ymtdzzz
4
1.6k
Vue.js学習の振り返り
hiro_xre
2
130
Tuning GraphQL on Rails
pyama86
2
1k
JaSST 24 九州:ワークショップ(は除く)実践!マインドマップを活用したソフトウェアテスト+活用事例
satohiroyuki
0
260
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
390
Modern Angular: Renovation for Your Applications
manfredsteyer
PRO
0
210
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
230
Progressive Web Apps für Desktop und Mobile mit Angular (Hands-on)
christianliebel
PRO
0
110
プロジェクト新規参入者のリードタイム短縮の観点から見る、品質の高いコードとアーキテクチャを保つメリット
d_endo
1
1k
offers_20241022_imakiire.pdf
imakurusu
2
360
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
150
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
23
11k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Building an army of robots
kneath
302
42k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Unsuck your backbone
ammeep
668
57k
Learning to Love Humans: Emotional Interface Design
aarron
272
40k
A Tale of Four Properties
chriscoyier
156
23k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Done Done
chrislema
181
16k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
A Modern Web Designer's Workflow
chriscoyier
692
190k
Transcript
Debeziumで変更データキャプチャを学ぼ う JJUG CCC 2021 Fall #jjug_ccc_c #jjug_ccc @yy_yank
#jjug_ccc_c #jjug_ccc でつぶやいてください ハッシュタグ TODO ハッシュタグ
自己紹介 やんく(@yy_yank) こいつです ・(株)ユーザベースのプログラマ ・JJUG CCC登壇5回目? ・iconはsakuraエディタなのに ・vim使う ・Java,Kotlin,Goが好き
• このセッションは個人の感想です。所属企業のう んぬんかんぬんではありません。 NOTE
• 変更データキャプチャについて知りたい人 • Debeziumに興味がある人 • データ移行や同期などの良い方法がないか探している 人 • 「モノリスからマイクロサービスへ」を読んだ人 対象聴講者
• Debezium完全に理解した、自分でも使えそう!と思っ てもらいたい • 変更データキャプチャを使えば移行元のコードベース に手を加えずに変更を検知できる 今日のセッションで伝えたいこと
1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ
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. 変更データキャプチャについて
1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ
https://debezium.io/ • RedHatがサポートするオープンソースプロジェクト • データベースの行レベルの変更をキャプチャする分散サービスのセット • 日本語のREADMEがある https://github.com/debezium/debezium/blob/master/README_JA.md Debeziumの概要 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/ChangeD ataSender.java
Embedded Engineもある 2. Debeziumとは
https://debezium.io/documentation/reference/connectors/inde x.html MySQL、PostgreSQL、SQL Server、Oracle、DB2、 Mongo DB、Cassandra (Incubating)、Vitess (Incubating) 対応しているデータベース 2.
Debeziumとは
1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ
https://github.com/yyYank/2021-fall-debezium-s ample こちらのリポジトリにサンプルコードがあります 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. ケーススタディ
なんとなく雰囲気つかめました か?
1. 変更データキャプチャについて 2. Debeziumとは 3. ケーススタディ まとめ アジェンダ アジェンダ
• 変更データキャプチャを使うことで、データの同期がや りやすくなる • バッチとサヨナラも可能かもしれない • Debeziumを使う ≒ Kafkaと付き合う •
Kafkaが嫌ならEmbedded Engineという手もある まとめ
• 非同期と付き合う ≒ トレーサビリティが必要になる • 異常系の考慮が必要(書き込み失敗、リトライetc...) • データ移行は段階的に • 同時実行やフィーチャーフラグなどで慎重に
まとめ
自分の知識不足による誤りなどあれば教 えていただけると幸いです。 適宜、資料修正します。 連絡先 twitter @yy_yank