定期的にまとめて取るバッチと、DB の変更ログを読んでほぼリアルタイムに取る CDC。
分析に使うデータの多くは、業務システムの DB(注文・会員など)にあります。分析のために業務 DB へ直接重い集計を投げると本番のサービスが遅くなるので、DWH(データウェアハウス。分析用のデータベース)に写してから使います。
この「どうやって写すか」で、データの鮮度・本番への負荷・削除を取りこぼすかどうかが決まります。
業務 DB からデータを取り込む方法は大きく2つです。バッチは、決まった時刻にテーブルの全部か差分を SELECT して取ってくる方法です。CDC(Change Data Capture、変更データの取り込み)は、DB が内部で書いている変更のログ(MySQL の binlog、PostgreSQL の WAL)を読み、INSERT・UPDATE・DELETE を1件ずつほぼリアルタイムで流す方法です。Debezium などの道具や、クラウドの取り込みサービスを使います。
| バッチ(全件・差分) | CDC | |
|---|---|---|
| 鮮度 | 取る間隔しだい(1時間〜1日) | 数秒〜数分 |
| 業務 DB への負荷 | 大きな SELECT が走る(レプリカから取るのが基本) | ログを読むだけなので小さい |
| 削除 | 差分のバッチでは取れない | 削除のイベントとして届く |
| 途中の変化 | 取った時点の値だけ(間の変化は消える) | 変化を全部残せる |
| 作りと運用 | 簡単 | 仕組みが複雑。遅延・ログの保持・スキーマ変更を監視 |
CDC では、読んだ変更をいったん Kafka に流すことがよくあります。Kafka は、メッセージを順番に溜めておき、複数の受け手がそれぞれ自分のペースで読める仕組み(メッセージブローカー)です。DWH の側が止まっても変更は Kafka に残るので、あとから追いつけます。
Kafka の仕組み(トピック・パーティション・オフセット)
下の「ブラウザで試す」の図は CDC の流れです。アプリが DB を更新すると MySQL が binlog に書き、Debezium のコネクタが「レプリカのふり」をして binlog を読み、Kafka のトピックに送ります。シンクがそれを読んで DWH に主キーで MERGE するので、同じ変更が2回届いても結果は同じです。アプリには手を入れていない点と、コネクタもシンクもどこまで読んだかを記録しているので止まっても続きから再開できる点に注目してください。
面接ではこう答える
業務 DB からの取り込みは、決まった時刻に SELECT で全件か差分を取るバッチと、MySQL の binlog や PostgreSQL の WAL のような変更ログを読んで INSERT・UPDATE・DELETE を流す CDC に分かれます。バッチは作りが簡単ですが、鮮度は取る間隔しだいで、差分では削除や途中の変化を取りこぼします。CDC は数秒から数分の鮮度で削除も届き、業務 DB への負荷も小さい一方、仕組みが複雑で、遅れやログの保持の監視が要ります。
Dataとの関わり取り込みの設計の最初の判断で、鮮度と運用の手間のどちらを取るかを利用者と決めるときに使います。
ネットワーク図を読み込んでいます…