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
650
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
220
R2DBCでAPIの高速化をしようとしてやめた話
yyyank
0
890
サーバーサイドKotlinという選択肢とユーザベース
yyyank
0
240
Javaプログラマのための頑張らないGo入門
yyyank
0
16
Other Decks in Programming
See All in Programming
14 Years of iOS: Lessons and Key Points
seyfoyun
1
770
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
190
Symfony Mapper Component
soyuka
2
730
Full stack testing :: basic to basic
up1
1
930
CSC305 Lecture 26
javiergs
PRO
0
140
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
330
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
Criando Commits Incríveis no Git
marcelgsantos
2
170
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
3
860
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
第5回日本眼科AI学会総会_AIコンテスト_3位解法
neilsaw
0
170
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
450
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
40
7.1k
Gamification - CAS2011
davidbonilla
80
5.1k
Side Projects
sachag
452
42k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
510
Docker and Python
trallard
41
3.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.2k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
For a Future-Friendly Web
brad_frost
175
9.4k
Why Our Code Smells
bkeepers
PRO
335
57k
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