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

事業の成長にDBアーキテクチャをアラインするために AWS Database Migratio...

taisa
April 16, 2024
590

事業の成長にDBアーキテクチャをアラインするために AWS Database Migration Service (DMS) を活用した話

taisa

April 16, 2024
Tweet

Transcript

  1. © 2024 Techtouch. • 名前 ◦ taisa831 / 佐藤昌基 •

    所属 ◦ Techtouch株式会社 • ブログ ◦ https://taisa.super.site • 出版 ◦ Python FlaskによるWebアプリ開発入門 ◦ はじめてのフロントエンド開発 自己紹介
  2. 5 © 2024 Techtouch. アジェンダ • マイクロサービスの切り直しをした話 ◦ なぜマイクロサービスの切り直しをしたか ◦

    どうマイクロサービスの切り直しをしたか • AWS DMSを活用してDB統合した話 ◦ なぜDB統合したか ◦ どうDB統合したか • 今後の課題 • まとめ • Appendix ◦ AWS DMSで気を付けるポイント ◦ Appendixまとめ
  3. 8 © 2024 Techtouch. マイクロサービスとは 引用元: マイクロサービスの概要 | AWS (amazon.com)

    ビジネスドメインを中心にモデル化された、独立してリリース可能なサービス
  4. 10 © 2024 Techtouch. サービスA データベース A サービスB データベース B

    プレゼンテーション サービスC データベース C なぜマイクロサービスの切り直しをしたか • テックタッチは初期の頃からマイクロサービスアーキテクチャを採用している デプロイの単位
  5. 11 © 2024 Techtouch. サービスA データベース A サービスB データベース B

    プレゼンテーション サービスC データベース C なぜマイクロサービスの切り直しをしたか • 事業の成長とともに環境が変化し、ドメイン境界が初期の思想と変わってきた ◦ サービスAとサービスBが疎結合ではなくなってきた(分散モノリス状態) デプロイの単位 サービスA、B両方デプロイするケースが多い 開発でサービス横断 サービス間通信 分散トランザクション
  6. 12 © 2024 Techtouch. サービスA データベース A サービスB データベース B

    プレゼンテーション なぜマイクロサービスの切り直しをしたか • 分散モノリス状態とは ◦ 複数のサービスで構成されているものの、何らかの理由でシステム全体が一緒にデプロイされなけ ればならなくなっているシステムのこと サービス横断した開発 サービス間通信 分散トランザクション サービスA、B両方デプロイするケースが多い
  7. 13 © 2024 Techtouch. サービスA データベース A サービスB データベース B

    プレゼンテーション なぜマイクロサービスの切り直しをしたか • 分散モノリス状態とは ◦ 複数のサービスで構成されているものの、何らかの理由でシステム全体が一緒にデプロイされなけ ればならなくなっているシステムのこと サービス横断した開発 サービス間通信 分散トランザクション サービスA、B両方デプロイするケースが多い 分散システムの全ての欠点と単一プロセスモノリスの欠点を持ち、どちらの利点も十分には持たない。
  8. 14 © 2024 Techtouch. なぜマイクロサービスの切り直しをしたか 課題まとめ ◦ サービスを横断した開発が頻発するため一緒にデプロイする必要がある ◦ サービス間通信が頻発するため開発効率が悪い

    ◦ 分散トランザクションに対応するために難易度の高い仕組みを利用する必要 がある ◦ 片方のサービスが停止した場合サービス全体に影響がでる
  9. 16 © 2024 Techtouch. サービスA データベース A サービスB データベース B

    プレゼンテーション どうマイクロサービスの切り直しをしたか • サービスA、Bと分かれていたマイクロサービス
  10. 17 © 2024 Techtouch. モジュールA データベース B モジュールB APIゲートウェイ どうマイクロサービスの切り直しをしたか

    • モジュラーモノリス化 ◦ 新しくモジュールA、Bに変更したコンテナを作成した データベース A サービスAB
  11. 18 © 2024 Techtouch. モジュールA データベース B モジュールB APIゲートウェイ どうマイクロサービスの切り直しをしたか

    • モジュラーモノリス化への移行 ◦ 旧サービスA、Bを残しながら加重ルーティングにてリクエストを振り分け移行した 旧サービスA 旧サービスB データベース A 90% 10% 加重ルーティング サービスAB
  12. 19 © 2024 Techtouch. どうマイクロサービスの切り直しをしたか • 別のドメイン境界でサービスを切り直し ◦ サービスの特性上「サービスAB-main」「サービスAB-reader」(便宜上 main,

    reader とします)と いった別ドメインでサービスを切った方がよいことが明らかになってきた モジュールA データベース B モジュールB APIゲートウェイ データベース A サービスAB 別ドメイン境界 main reader
  13. 27 © 2024 Techtouch. DB統合の前提 • やりたいこと ◦ 別々のスキーマから同一スキーマにDBを統合したい •

    制約 ◦ それぞれのDBに同じ名前のテーブル名が存在するのでテーブル名をリネームする必要がある • DBの特徴(Aurora MySQL 2.x)※1 ◦ Auroraのレプリケーション機能を利用しようとしたが利用しているバージョンではテーブル単位のレプ リケーションができなかったため断念(MySQLのユーザー情報等も同期されてしまう) • サービスの特性 ◦ サービスAB-main ▪ 夜間メンテナンス可 ◦ サービスAB-reader ▪ 無停止でDB統合したい  上記の前提条件をクリアするために AWS DMSを利用してDB統合することにした! ※1 参考: https://dev.mysql.com/doc/refman/5.7/en/binary-log-mysql-database.html
  14. 31 © 2024 Techtouch. main データベース A reader データベース B

    プレゼンテーション どうDB統合したか Read/Write Read Only 1. binlog有効 2. DMSでレプリケーション ・スキーマ名リネーム ・同一テーブル名リネーム • Phase1 ◦ DMSでレプリケーションをはる
  15. 32 © 2024 Techtouch. main データベース A reader データベース B

    プレゼンテーション どうDB統合したか Read/Write Read Only binlog有効 1.コネクションをデータベースBに切 り替える ❌ DMSでレプリケーション ・スキーマ名リネーム ・同一テーブル名リネーム • Phase2 ◦ readerのコネクションをデータベースBに切り替える(無停止)
  16. 33 © 2024 Techtouch. main データベース A reader データベース B

    プレゼンテーション どうDB統合したか Read/Write Read Only 2.DMSレプリケーション停止 1.メンテナンスで書き込みを止める ❌ ❌ 3.向き先をデータベースBに切り替える • Phase3 ◦ メンテナンスにより書き込みをとめ、mainのDBのむき先をデータベースBに切り替える
  17. 36 © 2024 Techtouch. 今後の課題 • サービスの進化によってデータ構造が広くというより深くなってきた ◦ リレーショナルで表現するのが難しいjsonのネストが深くなってきたイメージ •

    適切なデータアーキテクチャ選定で適切に事業要求とDB制約を捌いていきたい main データベース AB reader プレゼンテーション 最適化 最適化
  18. 38 © 2024 Techtouch. まとめ • 事業の成長に合わせてサービスのアーキテクチャをアラインしていこう! ◦ サービスのアーキテクチャに合わせた手法を使う ◦

    難しければアーキテクチャを変更するのも手 ◦ DBも含めてアーキテクチャにアラインするのは比較的困難だけど、AWS DMSを使えばやりたいことができるかも!
  19. 42 © 2024 Techtouch. データベース A データベース B DMS インスタンス

    気をつけるポイント① 外部キー制約やインデックスなどのメタデータは同期されない AWS DMS • DMSはテーブル作成からレプリまでしてくれる設定がある ◦ 外部キー制約やインデックスなどのメタデータは同期されない メタデータが必要な場合は事前にテーブルを作成しておきましょう! create table if not exists drop table & create table truncate ・index ・外部キー ・index ・外部キー →自動で作成されない Source Target
  20. 43 © 2024 Techtouch. データベース A データベース B DMS インスタンス

    気をつけるポイント② Max LOB サイズを適切に設定しないとデータが切り捨てられる AWS DMS • LOB(Large Object)とは ◦ データベースにおいて扱われる巨大なデータを表す用語(BLOB、CLOB、XLOB) ◦ LOB列設定は制限付きLOBモードが推奨、最大LOBサイズを設定する ・CLOB(json etc) ・BLOB(binary) ・XLOB(xml) 下記SQLでLOBカラムの最大値をチェックしましょう! ・CLOB(json etc) ・BLOB(binary) ・XLOB(xml) →切り捨て Source Target
  21. 44 © 2024 Techtouch. データベース A データベース B DMS インスタンス

    気をつけるポイント③ 同期先テーブルのLOBカラムはNOT NULL制約があると同期失敗する AWS DMS • LOBカラムの同期は最初にNULLとなり、あとからデータが同期される動きとなる 同期先テーブルのLOBカラムはNOT NULL制約をはずしましょう! 参照:https://e-words.jp/w/LOB-1.html Source Target ・CLOB(json etc) ・BLOB(binary) ・XLOB(xml) → NOT NULL(OK) ・CLOB(json etc) ・BLOB(binary) ・XLOB(xml) →NOT NULL(同期失敗)
  22. 45 © 2024 Techtouch. 気をつけるポイント④ インスタンスのメモリはなかなか開放されない • フルロード時にメモリを結構使う • その後のレプリケーション中も徐々にメモリが減り続ける

    • メモリ解放はDMSに依存 初回フルロード時のメモリ使用量と、レプリケーション期間に使われるメモリ量を事前に確認しメモリ枯渇し ないように注意しましょう!
  23. 47 © 2024 Techtouch. 気をつけるポイント⑥ フルロード時のtoo many connections発生に要注意 • 並列にロードするテーブルの最大数のデフォルトは「8」

    • 開発環境は特にコネクション数が少ないので検証中は簡単にtoo many connectionsが発生します 本番のDBコネクションを使い切るリスクがあるので事前にコネクション数チェックをしチューニン グをしましょう!
  24. 48 © 2024 Techtouch. Appendix まとめ • DMS は柔軟に設定ができて便利な一方躓きポイントが結構あるので要注意 •

    実際に利用する際は下記内容に注意してみてください 1. 外部キー制約やインデックスなどのメタデータは同期されない 2. Max LOB サイズを適切に設定しないと同期に失敗する 3. 同期先テーブルのLOBカラムはNOT NULL制約があると同期失敗する 4. インスタンスのメモリはなかなか解放されない 5. CASCADEで更新されたデータは同期されない 6. フルロード時のtoo many connections発生に要注意