MySQLとは

MySQLはOracle社が提供するRDBMSのひとつで、オープンソースソフトウェアであるため導入コストの低さから社内のデータベースとして採用している企業もあるかと思います。ですが近年クラウド型のDWH(データウェアハウス)サービスが次々と登場し、安価な運用コストながらデーベースの管理コストをベンダー側に負担してもらうことができ、またデータ量の増加に伴うデータベースの拡張も容易になってきました。

ただし従来のMySQLをベースにした運用から、DWHサービスを中心とした運用へのシフトにはMySQLからDWHへのデータ統合が簡単に行えなければあまり意味がありません。

また、一度データパイプラインが構築できたとしてもデータの更新のたびにMySQLのデータを丸ごと転送していてはMySQL、DWH双方のパフォーマンスを低下させます。

概要

そこで今回はtrocco®のCDC形式転送機能を利用し、MySQLbinlogのうち変更が生じたデータだけをGoogle BigQueryへ自動で転送、データベースをアップデータとするという仕組みをほとんどノーコードでやってみたいと思います。

MySQLのデータをGoogel BigQueryへ転送

1-0. CDCとは?

今回はMySQLのbinlogをCDC形式(Change Data Capture = 変更データキャプチャ)で転送します。
CDC形式の転送により、初回の転送のみデータを全件転送するもののそれ以後はMySQL上に生じた差分データのみ転送するため転送量の削減・転送の高速化を図ることができます。

データ転送に伴うデータベースへの負荷を抑えつつバッチ処理でデータ同期を行いたいときには、CDC形式での転送がベストではないでしょうか。

なおCDC形式の形式の転送と全件転送との比較はを表にすると以下のようになります。

全件転送CDC
trocco転送量(初回実行時)ソーステーブルの全データソーステーブルの全データ
trocco転送量(2回目以降)ソーステーブルの全データ更新ログのみ(※1)
スキーマ変更発生時
(列追加等)
自動追従自動追従
データ削除(DELETE)の挙動物理削除論理削除
データ更新(UPDATE)の挙動物理更新物理更新
BigQueryスキャン量なし現在のBigQuery上のテーブル全量+更新ログ
データソースDBへの負荷低(初回転送時のみ全量のため高負荷)

※1 INSERT,DELETE,DDL文については1行文、UPDATE文については更新前後の2行分

trocco®でCDC転送を行う際には

  1. trocco®がMySQLのbinlogをGoogle BigQuery上に転送
  2. binlogのデータから重複を排除し、それぞれのレコードの最新のレコードの集合を作成
  3. ↑の集合を現在のGoogle BigQueryテーブルとマージし、マージ後のテーブルで置換する
    という手順を踏んでいます。

CDC転送の詳細な手順についてはこちらのドキュメントの「テクニカルオーバービュー」の項をご参照ください。

2-1. MySQLのパラメータ設定

trocco®のドキュメントを参照しつつ、MySQLのパラメータ設定を行います。

image.png

binlogの設定を反映させるためにはDBの再起動が必要です。
DBを再起動して次のステップに進みます。

2-2. MySQLの権限設定

trocco®のドキュメントを参照しつつ、MySQLの権限設定を行います。

ここではSELECTとREPLICATION CLIENTの2つの権限を設定します。

image.png

2-3. Primary Keyの設定

転送元のテーブルにはPrimary Keyが設定されている必要があります。
ここでは既に設定されているものとして、割愛します。

その他、trocco®で転送する際の必須条件などについてはこちらのドキュメントを参照してください。

これにてMySQL側での設定は完了です。
続いてtrocco®の設定を行います。

3-0. trocco®に登録

はじめにtrocco®のアカウントが必要です。
無料トライアルも実施しているので、前もって申し込み・登録をしておきましょう。
https://trocco.io/lp/index.html
(申し込みの際にこちらの記事を見たという旨を記載して頂ければスムーズにご案内できます)

3-1. 転送元・転送先を決定

trocco®にアクセスし、ダッシュボード画面から「転送設定を作成」のボタンを押します。

貼り付けた画像_2021_02_09_18_45.png

転送元にMySQL binlog、転送先にGoogle BigQueryを選択し、「この内容で作成」ボタンを押します。

貼り付けた画像_2021_02_09_17_13.png

設定画面になるので、必要な情報を入力していきます。

3-2. MySQLとの連携設定

転送設定の名前とメモを入力します。

image.png

転送設定の名前を決めたら、「転送元の設定」内の「接続情報を追加」ボタンを押し、MySQLの接続情報の設定を行います。

貼り付けた画像_2021_02_09_17_16.png

接続設定の名前・ホスト・ポート・ユーザー名・パスワードを入力します。

貼り付けた画像_2021_02_18_16_34.png

接続確認をしたのち、設定の保存をします。

貼り付けた画像_2021_02_09_17_20.png

再度転送設定画面に戻り、「接続情報を読み込む」ボタンを押すと、作成した接続情報が選択できるかと思います。

image.png

3-3. MySQLからのデータ抽出設定

これでMySQLとの連携は完了です。
次にMySQLの取得データを設定します。

まずは必須項目の「データベース名」「テーブル」をセレクトボックスの中から選択します。

image.png

スキーマ追従の有効/無効を指定します。

image.png

スキーマ追従が有効になっている場合、

  • クエリにRENAME COLUMNが含まれている場合、変更後の名前でデータ連携される
  • クエリにADD COLUMNが含まれている場合、追加したテーブルが自動で転送されるようになる

といった挙動になります。

最後に接続確認が通るか確認します。

image.png

MySQLとの接続が確認できました。以上でMySQL側の設定は完了です。
次は転送先のGoogle BigQueryの設定を行っていきましょう。

3-4. 転送先Google BigQueryの設定

基本的には転送元と同じ要領です。
「接続情報を追加」ボタンからGoogle BigQueryの接続設定を行い、データベース・テーブル・データセットのロケーションを指定します。

貼り付けた画像_2021_02_09_18_17.png

MySQLとの接続同様Google BigQueryについても接続テストを行います。

image.png

接続が確認できたためこれで入力は完了です。保存して次に進みましょう。

3-5. カラム名・データ型の確認

「データプレビュー」の画面でカラム名・データ型の確認を行います。
MySQLの各データはtrocco®の方でデータ型を判断し、自動的にGoogle BigQueryのデータ型に変換されます。

データ型についてはこちらのドキュメントをご参照ください。

image.png

問題なければ転送設定の詳細画面に移ります。

貼り付けた画像_2021_02_09_18_35.png

3-6. 初回転送

CDCは変更データのみを転送する方式ですが、初回だけは全件転送をする必要があります。
このステップでは、手動で全件転送を行います。

右上にある「実行」ボタンを押します。

貼り付けた画像_2021_02_09_18_35.png

「全件転送を行う」にチェックマークを入れて、「ジョブを実行」を押します。

貼り付けた画像_2021_02_09_18_37.png

転送完了まで待ちます。

貼り付けた画像_2021_02_09_18_39.png

転送が成功しました。これで初回の全件転送は完了です。

貼り付けた画像_2021_02_09_18_40.png

続いてCDC転送の設定をします。
転送設定の詳細画面に戻りましょう。

3-7. スケジュール設定

「スケジュール・トリガー設定」タブを開きます。

貼り付けた画像_2021_02_09_18_42.png

以下のように実行スケジュールを設定することで、転送を自動化することが出来ます。

貼り付けた画像_2021_02_09_18_47.png

3-8. 通知設定

必須の設定ではないですが、ジョブの実行ステータスに応じてEmailやSlackに通知を行うことが出来ます。転送の成功/失敗時の通知だけでなく、転送ジョブが不自然に時間がかかっている場合や、転送は成功したもののデータの転送件数がゼロになってしまっている場合など様々なエラー管理に対応しています。

貼り付けた画像_2021_02_09_18_48.png

これで全ての設定が完了しました。
以後は設定したスケジュールに合わせてCDC転送が実行され、差分のデータがGoogle BigQueryに統合されるようになります。

4-1. 転送結果の確認

trocco®での設定のみで転送が完了しているため、Google BigQuery側で操作は特に必要ありません。

最後に設定に従ってGoogle BigQueryにデータの統合ができているか確認してみます。

image.png
MySQLのコンソール画面から今回転送したデータを表示
image.png
Google BigQuery側で転送したデータを確認

両方とも同じデータが入っていることが確認できます。

元のテーブルにいくつか変更を加えて、Gogle BigQuery側でどのように表示されるのかを確認してみましょう。

  • id=1 のcommentをUPDATE
  • id=2 の行を削除
  • 新たに「NewColumn」のカラムを追加

この3点が変更されています。

image.png
MySQL側のデータをアップデート

このようにMySQLのテーブルに変更を加えたうえでCDC転送を行い、Google BigQuery側のコンソール画面から再度データを確認します。

image.png

先ほどのクエリで変更した部分がGoogle BigQueryでも反映されていることが分かります。
また削除したカラムは_trocco_deletedカラムがtrueになっています。

今回はtrocco®の設定で「スキーマ追従」の設定を有効にしているのでカラムの追加が反映されていますが、スキーマ追従が無効の場合には反映されないのでご注意ください。

まとめ

いかがでしたでしょうか。trocco®を利用することで簡単にMySQLのデータを取得し、DWH(今回はGoogle BigQuery)に統合することが出来ました。
MySQLを活用している企業の方はぜひデータtrocco®をご検討ください。

またtrocco®は、無料トライアルを実施しているので、この機会にぜひ一度お試しください。
(申し込みの際にこちらの記事を見たという旨を記載して頂ければその後のご案内がスムーズに行えます。)

データ分析基盤構築サービスtrocco
hirokazu.kobayashi

慶應義塾大学卒業後、2014年より株式会社リブセンスへ入社。データエンジニアとして同社分析基盤立ち上げをリードする。2017年より現職primeNumberに入社。自社プロダクト「systemN」におけるSpark/Redshift活用等のデータエンジニアリング業務を行うかたわら、データ統合業務における工数削減が課題だと感じ、データ統合を自動化するサービス「trocco®」を立ち上げる。