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
730
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
250
R2DBCでAPIの高速化をしようとしてやめた話
yyyank
0
1.3k
サーバーサイドKotlinという選択肢とユーザベース
yyyank
0
300
Javaプログラマのための頑張らないGo入門
yyyank
0
29
Other Decks in Programming
See All in Programming
CSC305 Lecture 10
javiergs
PRO
0
260
技術的負債の正体を知って向き合う
irof
0
260
kiroとCodexで最高のSpec駆動開発を!!数時間で web3ネイティブなミニゲームを作ってみたよ!
mashharuki
0
920
なぜGoのジェネリクスはこの形なのか? - Featherweight Goが明かす設計の核心
qualiarts
0
260
CSC305 Lecture 11
javiergs
PRO
0
270
Webサーバーサイド言語としてのRustについて
kouyuume
1
4.9k
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
7
3.5k
ドメイン駆動設計のエッセンス
masuda220
PRO
2
280
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
490
contribution to astral-sh/uv
shunsock
0
540
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
4
900
Go言語はstack overflowの夢を見るか?
logica0419
0
610
Featured
See All Featured
For a Future-Friendly Web
brad_frost
180
10k
Agile that works and the tools we love
rasmusluckow
331
21k
Why Our Code Smells
bkeepers
PRO
340
57k
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
Statistics for Hackers
jakevdp
799
220k
Context Engineering - Making Every Token Count
addyosmani
8
300
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
353
21k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Scaling GitHub
holman
463
140k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
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