Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DMS を使って MySQL のデータを Snowflake に同期する

C9ceeecd7454954e4f93ee2a1cbbf386?s=47 DragonTaro1031
December 10, 2021
440

DMS を使って MySQL のデータを Snowflake に同期する

社内の勉強会で話した内容です。

C9ceeecd7454954e4f93ee2a1cbbf386?s=128

DragonTaro1031

December 10, 2021
Tweet

Transcript

  1. DMS を使って MySQL のデータを Snowflake に同期する AI事業本部 AirTrack 宮川竜太朗

  2. お話する内容 1. DMS とは 2. MySQL と Snowflake を同期するアーキテクチャ 3.

    View で MySQL テーブルを復元する 4. DMS の課題点と改善ポイント
  3. 1. DMS とは

  4. DMS とは - Database Migration Service - データベースの移行をや継続的なレプリケートに利用 - DB

    → DB のレプリケート - 外部 DB や RDS の binlog を整形して s3 に収集吐き出すことも - 専用のインスタンスを立ててタスクを実行
  5. DMS の概要図

  6. s3 への抽出のログフォーマット 以下のテーブルを例に紹介します。

  7. - カラムの情報のみ - ヘッダーなし - /[table名]/LOADXXXX.csv csv の場合(初回ロード時)

  8. - 同じくヘッダーなし - 処理の種類とその時のスナップショット - /[table名]/YYYY/MM/DD/xxx.csv - 先頭に処理の種類が付与 - I:

    Insert - U: Update - D: Delete - Insert して Update すると左のように csv の場合(レプリケート時)
  9. parquet の場合 - ターゲットエンドポイントを設定することで利用可 能 - csv 同様に - 初回ロード時は全テーブルデータのみ

    - レプリケーション時は テーブルデータ + オペレーションタイプ - parquet なのでもちろんカラムのデータも ※ json で表示
  10. 2. MySQL と Snowflake を同期する アーキテクチャ

  11. MySQL と Snowflake を同期するアーキテクチャ

  12. 3. View で MySQL テーブルを復元する

  13. View で MySQL を再現する手順 1. DMS でタスクを定期実行する 2. ログテーブルを作成する 3.

    初回データを Snowflake に一気に入れる 4. SnowPipe で s3 のログデータを継続的に取り込む 5. View でログデータの順序から現在の状態を再現する
  14. DMS でタスクを定期実行する - レプリケーションインスタンス - 移行タスクを実行するための専用インスタンス - ソースエンドポイント - MySQL

    - binlog_format を RAW にするなど制約あり - ターゲットエンドポイント - s3 - パスとファイルフォーマットの指定
  15. MySQL と Snowflake を同期するアーキテクチャ

  16. DMS でタスクを定期実行する - ソース・ターゲット・レプリケーションインスタンスを指定 - 対象テーブルのフィルター - 移行タイプの選択(既存の移行とレプリケートを今回は選択)

  17. ログテーブルを作成する - View を構築するためのメタデータも必要 - 何のアクション(Insert or Update or ...)なのか

    - 変更が加えられた順序をどう保証するのか - 順序を保証するためにログ作成時間とログファイルの行数を取る - DMS のファイル名 (metadata$file_name) から日付をパース - 行数は metadata$file_row_number
  18. ログテーブルを作成する

  19. 初回データを Snowflake に一気に入れる - 初回ロード分に関しては I や U はつかない -

    type: ‘L’ として取り込む
  20. SnowPipe で継続的に取り込む - s3 に吐かれたログデータを Snowflake に取り込む - 初回ロード分を除く -

    実行されたアクションの取り込み - メタデータの取り込み - ファイル作成日 - 行番号
  21. SnowPipe で継続的に取り込む

  22. 生ログから View を構築する - それぞれのログがレコードのスナップショット - メタデータから最新の状態を判断して取り出す

  23. 以下のデータを想定 DMSタスク 作成

  24. 生ログから View を構築する

  25. 4. DMS の課題点と改善ポイント

  26. DMS の課題点と改善ポイント - csv で s3 に吐かれるため変更に弱い - parquet を指定するオプションがあるが頭が回ってなかった

    - 停止・再開の挙動がよくわからない - チェックポイントがあるがトランザクション中なら壊れるらしい - 毎回新しい DMS タスクとテーブルを作った方が安全では? - エラーが起きたときの対応方法が掴めていない - 今のところエラーなく動いてくれてるからいいけど。。
  27. おまけ

  28. ちなみに Firebase なら。。 - Firestore のデータをポチポチで BQ に同期してくれます!? - しかも

    view も自動で構築してくれます!? - レコード自体は json で入れられるのでパースが面倒だが。。 - スキーマがないからそうするしかないよね