Edited at

DMSを使ってオンプレからAWSにデータ移行したよ


概要

仕事でオンプレDBからAWSにデータ移行したので振り返りも兼ねてまとめたくなった

ところどころ自分のプロダクトに依存する部分があるので参考程度に留めてね

自分のプロダクトでは、下記理由によりスキーマコピーとレプリケーションはMySQLの機能で行いデータ移行はDMSで行いました


  • エンジンがMyISAMのスキーマがあるがDMSでスキーマを作るとInnoDBに再構築されてしまう

  • DMSのレプリケーションには対応してない型があった

  • 本番DBの権限の問題で自由にデータをdumpできない&DBへの負荷を考えてデータ全部dumpするのは避けたい


データ移行って?

サービスや機能をオンプレからパブリッククラウドへ移行するにあたってDBのデータもクラウドで用意するDBに移す作業です

DBがオンプレにあっても問題はないですが疎通や相性など諸々含めると一緒にパブリッククラウドに移しちゃったほうが将来的に楽できると思います


DMSってなに?

AWSにあるデータベースのデータ移行とレプリケーションサービス

正式名称は、AWS Database Migration Service

移行中もソースデーターベースを止める必要がないし異なったデータベースプラットフォーム間での移行もサポートされてるすごい奴

サポートされてるプラットフォームや細かい機能は挙げだすときりがないのでこちらを参照ください

とにかくすごい。好き


DMSでできること


スキーマの移行


  • オンプレのスキーマ情報をAWSのDBにコピーできる

  • 完全にコピーされる保証はないのでmysqldumpなどを推奨


データの移行


  • オンプレのDBに格納されているデータをAWSのDBにコピーできる

  • 一部のテーブルデータは移さないなどの設定も可能


データ移行後の変更も追跡する


  • データの移行が終わった後に変更を追うことができるのでそのままレプリケーションを貼ることができる

  • 1つの機能でデータ移行とレプリケーションの両方を実現できる

  • 移行後も変更に追従してくれるので、切替も切戻しもローリスク


最小のダウンタイムでのデータ移行


  • レプリケーションインスタンスを挟んでのデータ移行なのでオンプレの機能を制限する必要がない

  • すごい


異種間(OracleからMySQLなど)のDBの移行をサポートしている


  • レプリケーションインスタンスを挟んでのデータ移行なので中間インスタンスでいい感じにできる

  • まじですごい


移行のイメージ

DMSとオンプレDBへのデータの流れはこんな感じ

データ移行後にレプリケーションを貼り続ける場合、データ移行後もこれが続くイメージ

DMSデータ (1).png


移行手段の選択肢


それぞれのDBの機能を使って移行

mysqldumpなどでスキーマ情報とデータをダンプし移行先のDBに流し込みコマンドでレプリケーションをとる方法


  • メリット


    • 障害発生点が減る

    • 同じデータベースプラットフォームの場合こちらの方がスタンダード



  • デメリット


    • dumpしてデータを移行する性質上どうしてもDBを止めるか書き込みを制限するタイミングが発生してしまう

    • 何かあったときロールバックやデータの差異の修正が大変

    • 異なったデータベースプラットフォームへの以降はできない?

    • dumpするために権限をもらうか権限がある人にファイルをもらう調整が必要




DMSを使って移行

DMSを使ってデータ移行とレプリケーションをとる方法


  • メリット


    • ソースDBを止めないで移行できる

    • データ移行とレプリケーションが1つの機能でできる

    • 異なったデータベースプラットフォーム間での移行もサポートされてる



  • デメリット


    • サポートされてない型があり必ずできるとは言えない

    • レプリケーションインスタンスを立てる性質上、障害点が増えてしまう




ハマりポイントあります


  • AuroraやRDS for MySQLでは、MyISAMはサポートしてない


    • サポートしてないのでMyISAMで作られたテーブルがある場合、DMSでスキーマ情報をコピーすると全てInnoDBで構築される

    • InnoDBで構築されてもいいならDMSで行うと勝手にエンジンがInnoDBになっていい感じ



  • DMSでは、サポートされてない型がある


    • スキーマやカラムの型次第では、DMSでサポートされておらず使えない可能性がある

    • サポートされている型一覧はこちら



  • AWSのRDSには、replicate-ignore-db設定がない


    • ignore設定がないので全てのDBをレプリケーションしない場合、binlogに吐き出すDBを指定するなどの設定が必要



  • データ移行ではサポートされてるけどレプリケーションではサポートされてない型などがある


    • データ移行では問題なかったけどレプリケーションを貼るとうまくいかない場合があるのでどこまで出来てどこを他の機能に任せるかの判断が必要



  • セカンダリインデックス、非プライマリーキー制約、デフォルト値などはサポートしてないので移行先に自分で作る必要がある


実作業コマンド

* 作業メモには、オープンにできない内容が載っていたのであとでいい感じにして追記します


最後に

DMSは、とても便利ですごい機能ですが自分たちのプロダクト次第でできる範囲が変わってくる

どこまでできるかは実際に試さないとわからない部分があるので試してみるといい

MyISAMはAWSと相性が悪いのでめんどくさいから脱却したい

AWSへの移行は、どこまでをどの機能で行うかが難しいが自分のプロダクトにあった運用を

短期で終われるならロールバックなども考えるとできるならレプリケーションもDMSでやりたかった

DMSしゅき〜〜


参考文献

AWS DMS : https://aws.amazon.com/jp/dms/

DMS MySQLサポート : https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html