0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GCP DataStream で MySQL→BigQuery を CDC 連携したときの挙動

Last updated at Posted at 2025-09-27

GCP DataStream で MySQL → BigQuery を CDC 連携した話

概要

GCP Datastream は、変更データキャプチャ(CDC)とレプリケーションをサポートするサーバーレスサービスです。ソース DB の変更をほぼリアルタイムで取得し、BigQuery や Cloud Storage 等に書き出せます。
Datastream の概要(公式ドキュメント)

職場で、Aurora MySQL ==Datastream==> BigQuery をやったのでご紹介。
雑にかいたメモをChatGPTに書き直させて推敲しました。

使った感想や細かい挙動の記事が少ないので書きました。
あくまで目安にしてください。

DataStreamの説明や、細かい解説は公式ドキュメントを見てください。

前準備:MySQL 側の設定(バイナリログ有効化など)

DatastreamでCDCを行うには、MySQLにバイナリログの記録を設定します。
Aurora MySQL での設定方法

  • レプリケーション用ユーザー(REPLICATION SLAVE 権限など)の作成
  • binlog_format を ROW にする(再起動が必要)

一番大変なのはDBの再起動です。
本番データベースだと本番システムが止まります。当たり前ですが・・・

連携方法

レコードの連携方法は
追記モードマージモード、があります。

前者は1分程度で連携され、スキャンコストはかかりません。BigQueryには変更のあったレコードがすべて記載されます。後者はソーステーブルと投入先テーブルが全く同じになります。ただしデータ投入時にマージが行われ、スキャンコストがかかります。

前者の追記モードのほうがお財布とココロに優しいでしょう。職場では追記モードを採用しました

連携時の負荷

DataStreamで連携を開始すると

  1. ソースデータのデータがBigQueryにすべて投入されます(バックフィル)
  2. その後は CDC モード(追記モード/変更追従モード)で常時差分を取り込見ます

1の負荷は負荷5%程度のライターインスタンス(DataStreamはライターから連携します、リーダーからではありません。)が30%ぐらいまで負荷が上がりました。

2千万行程度のテーブルが2つ、あとは数百万行程度のテーブルがいくつかです。バックフィルの時間は1時間程度、負荷が高かったのは10分程度でした。バックフィルは負荷を上げすぎないように数個ずつテーブルを読んでいました。

バックフィル後にCDCでの逐次連携が始まります。CloudWatchのグラフを見ただけでは何も起こっていないと思うほど低負荷。

新しいレコードは変更からだいたい数分でBigQueryに到着するようです。

BigQuery にリアルタイムでレプリケーションする(クイックスタート)

良かった点

  • 料金
    なかなか安いです

  • 設定がかんたん
    コンソールをポチポチするだけで連携開始できます。あとはほぼ放置。

  • CDC連携の負荷が小さい
     バックフィル後、差分データの取込みだけになると、ソース DB やネットワークにかかる負荷はほぼ無視できるレベルに落ち着きました。

  • 連携停止・再開が容易
     ストリームを止めて、あとから再開することもできます。再開すると、停止していた期間のレコードもきちんと入ります。音楽プレーヤーをとめておいて後で聞く感じ。ただし、バイナリログが正常に維持されていることが前提です。

悪かったところ

  • パラメーター設定
    変更事態はかんたんですが、DBの再起動が必要なので調整が大変です。ですがやる価値は十分あります。

  • パーティション化が必要」
    DataStreamはパーティション化したテーブルを作成してくれません。
    そのままクエリーし始めるとフルスキャンになります。
    自分でパーティション化したテーブルを作成して、データを移す必要があります。
    (スキーマと名前が一致していれば問題なく新しいテーブルに連携してくれます。)

    「日付カラムのないテーブル」などはPARTITIONTIMEを使うなど特別な配慮が必要でした

  • 命名に融通がきかない
    dbtベストプラクティス通りの名前に・・・・・できません。
    あきらめましょう。
    命名は二種類のどちらかからしか選べません。

  • 設定が煩雑
    各種パラメーターの変更や、DBユーザーへの権限変更などが必要です。
    それぞれは簡単な変更ですが数が多く、パターンも多いのでヌケモレがでます。
    連携対象が多い場合はまとめて設定項目を変えたりせずに、
    一人が一つずつのDBを連携していったほうが楽です。

良くも悪くもなところ

何が何でもエラーを出さないようになっています。追記モード時にスキーマ変更を行ういかのとおりになります
(すべての新しいカラムを追加する、という設定にした場合)

変化 Datastream 側で起こること
カラム追加 新しいカラムが自動で BigQuery 側に追加される
カラム削除 削除されたカラムは BigQuery 側では消えず、値が入らなくなるだけ
カラム名変更 新しい名前のカラムが追加。旧名カラムには値が入らなくなる
カラム名を変更して戻す 新しい名前のカラムが追加。戻した旧名カラムに値が入る。新カラムはそのまま

結構クセがありますがなかなか使えます。

データ基盤作成に使うことが多いと思います。
ただもっと気軽に「DBのバッチが重いので、DataStreamでBigQueryにデータを同期。バッチをBigQueryで実行する」などの気軽な利用もいいかなと思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?