Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

お話する内容 1. DMS とは 2. MySQL と Snowflake を同期するアーキテクチャ 3. View で MySQL テーブルを復元する 4. DMS の課題点と改善ポイント

Slide 3

Slide 3 text

1. DMS とは

Slide 4

Slide 4 text

DMS とは - Database Migration Service - データベースの移行をや継続的なレプリケートに利用 - DB → DB のレプリケート - 外部 DB や RDS の binlog を整形して s3 に収集吐き出すことも - 専用のインスタンスを立ててタスクを実行

Slide 5

Slide 5 text

DMS の概要図

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

- 同じくヘッダーなし - 処理の種類とその時のスナップショット - /[table名]/YYYY/MM/DD/xxx.csv - 先頭に処理の種類が付与 - I: Insert - U: Update - D: Delete - Insert して Update すると左のように csv の場合(レプリケート時)

Slide 9

Slide 9 text

parquet の場合 - ターゲットエンドポイントを設定することで利用可 能 - csv 同様に - 初回ロード時は全テーブルデータのみ - レプリケーション時は テーブルデータ + オペレーションタイプ - parquet なのでもちろんカラムのデータも ※ json で表示

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

View で MySQL を再現する手順 1. DMS でタスクを定期実行する 2. ログテーブルを作成する 3. 初回データを Snowflake に一気に入れる 4. SnowPipe で s3 のログデータを継続的に取り込む 5. View でログデータの順序から現在の状態を再現する

Slide 14

Slide 14 text

DMS でタスクを定期実行する - レプリケーションインスタンス - 移行タスクを実行するための専用インスタンス - ソースエンドポイント - MySQL - binlog_format を RAW にするなど制約あり - ターゲットエンドポイント - s3 - パスとファイルフォーマットの指定

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

ログテーブルを作成する - View を構築するためのメタデータも必要 - 何のアクション(Insert or Update or ...)なのか - 変更が加えられた順序をどう保証するのか - 順序を保証するためにログ作成時間とログファイルの行数を取る - DMS のファイル名 (metadata$file_name) から日付をパース - 行数は metadata$file_row_number

Slide 18

Slide 18 text

ログテーブルを作成する

Slide 19

Slide 19 text

初回データを Snowflake に一気に入れる - 初回ロード分に関しては I や U はつかない - type: ‘L’ として取り込む

Slide 20

Slide 20 text

SnowPipe で継続的に取り込む - s3 に吐かれたログデータを Snowflake に取り込む - 初回ロード分を除く - 実行されたアクションの取り込み - メタデータの取り込み - ファイル作成日 - 行番号

Slide 21

Slide 21 text

SnowPipe で継続的に取り込む

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

生ログから View を構築する

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

DMS の課題点と改善ポイント - csv で s3 に吐かれるため変更に弱い - parquet を指定するオプションがあるが頭が回ってなかった - 停止・再開の挙動がよくわからない - チェックポイントがあるがトランザクション中なら壊れるらしい - 毎回新しい DMS タスクとテーブルを作った方が安全では? - エラーが起きたときの対応方法が掴めていない - 今のところエラーなく動いてくれてるからいいけど。。

Slide 27

Slide 27 text

おまけ

Slide 28

Slide 28 text

ちなみに Firebase なら。。 - Firestore のデータをポチポチで BQ に同期してくれます!? - しかも view も自動で構築してくれます!? - レコード自体は json で入れられるのでパースが面倒だが。。 - スキーマがないからそうするしかないよね