社内の勉強会で話した内容です。
DMS を使って MySQL のデータをSnowflake に同期するAI事業本部 AirTrack 宮川竜太朗
View Slide
お話する内容1. DMS とは2. MySQL と Snowflake を同期するアーキテクチャ3. View で MySQL テーブルを復元する4. DMS の課題点と改善ポイント
1. DMS とは
DMS とは- Database Migration Service- データベースの移行をや継続的なレプリケートに利用- DB → DB のレプリケート- 外部 DB や RDS の binlog を整形して s3 に収集吐き出すことも- 専用のインスタンスを立ててタスクを実行
DMS の概要図
s3 への抽出のログフォーマット以下のテーブルを例に紹介します。
- カラムの情報のみ- ヘッダーなし- /[table名]/LOADXXXX.csvcsv の場合(初回ロード時)
- 同じくヘッダーなし- 処理の種類とその時のスナップショット- /[table名]/YYYY/MM/DD/xxx.csv- 先頭に処理の種類が付与- I: Insert- U: Update- D: Delete- Insert して Update すると左のようにcsv の場合(レプリケート時)
parquet の場合- ターゲットエンドポイントを設定することで利用可能- csv 同様に- 初回ロード時は全テーブルデータのみ- レプリケーション時はテーブルデータ + オペレーションタイプ- parquet なのでもちろんカラムのデータも※ json で表示
2. MySQL と Snowflake を同期するアーキテクチャ
MySQL と Snowflake を同期するアーキテクチャ
3. View で MySQL テーブルを復元する
View で MySQL を再現する手順1. DMS でタスクを定期実行する2. ログテーブルを作成する3. 初回データを Snowflake に一気に入れる4. SnowPipe で s3 のログデータを継続的に取り込む5. View でログデータの順序から現在の状態を再現する
DMS でタスクを定期実行する- レプリケーションインスタンス- 移行タスクを実行するための専用インスタンス- ソースエンドポイント- MySQL- binlog_format を RAW にするなど制約あり- ターゲットエンドポイント- s3- パスとファイルフォーマットの指定
DMS でタスクを定期実行する- ソース・ターゲット・レプリケーションインスタンスを指定- 対象テーブルのフィルター- 移行タイプの選択(既存の移行とレプリケートを今回は選択)
ログテーブルを作成する- View を構築するためのメタデータも必要- 何のアクション(Insert or Update or ...)なのか- 変更が加えられた順序をどう保証するのか- 順序を保証するためにログ作成時間とログファイルの行数を取る- DMS のファイル名 (metadata$file_name) から日付をパース- 行数は metadata$file_row_number
ログテーブルを作成する
初回データを Snowflake に一気に入れる- 初回ロード分に関しては I や U はつかない- type: ‘L’ として取り込む
SnowPipe で継続的に取り込む- s3 に吐かれたログデータを Snowflake に取り込む- 初回ロード分を除く- 実行されたアクションの取り込み- メタデータの取り込み- ファイル作成日- 行番号
SnowPipe で継続的に取り込む
生ログから View を構築する- それぞれのログがレコードのスナップショット- メタデータから最新の状態を判断して取り出す
以下のデータを想定DMSタスク作成
生ログから View を構築する
4. DMS の課題点と改善ポイント
DMS の課題点と改善ポイント- csv で s3 に吐かれるため変更に弱い- parquet を指定するオプションがあるが頭が回ってなかった- 停止・再開の挙動がよくわからない- チェックポイントがあるがトランザクション中なら壊れるらしい- 毎回新しい DMS タスクとテーブルを作った方が安全では?- エラーが起きたときの対応方法が掴めていない- 今のところエラーなく動いてくれてるからいいけど。。
おまけ
ちなみに Firebase なら。。- Firestore のデータをポチポチで BQ に同期してくれます!?- しかも view も自動で構築してくれます!?- レコード自体は json で入れられるのでパースが面倒だが。。- スキーマがないからそうするしかないよね