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で連携を開始すると
- ソースデータのデータがBigQueryにすべて投入されます(バックフィル)
- その後は 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で実行する」などの気軽な利用もいいかなと思いました。