Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DMS を使って MySQL のデータを Snowflake に同期する
Search
DragonTaro1031
December 10, 2021
0
1.6k
DMS を使って MySQL のデータを Snowflake に同期する
社内の勉強会で話した内容です。
DragonTaro1031
December 10, 2021
Tweet
Share
More Decks by DragonTaro1031
See All by DragonTaro1031
CDK で未対応のパラメータを付与する方法
dragontaro
0
180
CloudbaseでのAWS CDKとAWS Step Functionsを用いたバッチ処理基盤の爆速構築
dragontaro
0
410
Redshift から Snowflake に移行した話
dragontaro
2
2k
reactの基礎と設計パターン
dragontaro
11
26k
本当は面白いアクセシビリティの話
dragontaro
0
240
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Visualization
eitanlees
145
15k
Writing Fast Ruby
sferik
627
61k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Music & Morning Musume
bryan
46
6.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Navigating Team Friction
lara
183
14k
Unsuck your backbone
ammeep
668
57k
Become a Pro
speakerdeck
PRO
25
5k
Typedesign – Prime Four
hannesfritz
40
2.4k
Designing Experiences People Love
moore
138
23k
Transcript
DMS を使って MySQL のデータを Snowflake に同期する AI事業本部 AirTrack 宮川竜太朗
お話する内容 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.csv csv の場合(初回ロード時)
- 同じくヘッダーなし - 処理の種類とその時のスナップショット - /[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 - パスとファイルフォーマットの指定
MySQL と Snowflake を同期するアーキテクチャ
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 で入れられるのでパースが面倒だが。。 - スキーマがないからそうするしかないよね