Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

© 2024 Techtouch. ● 名前 ○ taisa831 / 佐藤昌基 ● 所属 ○ Techtouch株式会社 ● ブログ ○ https://taisa.super.site ● 出版 ○ Python FlaskによるWebアプリ開発入門 ○ はじめてのフロントエンド開発 自己紹介

Slide 3

Slide 3 text

すべてのユーザーが システムを使いこなせる世界に システム導入だけで終わらせない、利活用のためのDXプラットフォーム

Slide 4

Slide 4 text

すべてのユーザーが システムを使いこなせる世界に システム導入だけで終わらせない、利活用のためのDXプラットフォーム

Slide 5

Slide 5 text

5 © 2024 Techtouch. アジェンダ ● マイクロサービスの切り直しをした話 ○ なぜマイクロサービスの切り直しをしたか ○ どうマイクロサービスの切り直しをしたか ● AWS DMSを活用してDB統合した話 ○ なぜDB統合したか ○ どうDB統合したか ● 今後の課題 ● まとめ ● Appendix ○ AWS DMSで気を付けるポイント ○ Appendixまとめ

Slide 6

Slide 6 text

© 2024 Techtouch. マイクロサービスの切り直しをした話

Slide 7

Slide 7 text

7 © 2024 Techtouch. マイクロサービス使っていますか? みなさん

Slide 8

Slide 8 text

8 © 2024 Techtouch. マイクロサービスとは 引用元: マイクロサービスの概要 | AWS (amazon.com) ビジネスドメインを中心にモデル化された、独立してリリース可能なサービス

Slide 9

Slide 9 text

© 2024 Techtouch. なぜマイクロサービスの切り直しをしたか

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

14 © 2024 Techtouch. なぜマイクロサービスの切り直しをしたか 課題まとめ ○ サービスを横断した開発が頻発するため一緒にデプロイする必要がある ○ サービス間通信が頻発するため開発効率が悪い ○ 分散トランザクションに対応するために難易度の高い仕組みを利用する必要 がある ○ 片方のサービスが停止した場合サービス全体に影響がでる

Slide 15

Slide 15 text

© 2024 Techtouch. どうマイクロサービスの切り直しをしたか

Slide 16

Slide 16 text

16 © 2024 Techtouch. サービスA データベース A サービスB データベース B プレゼンテーション どうマイクロサービスの切り直しをしたか ● サービスA、Bと分かれていたマイクロサービス

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

18 © 2024 Techtouch. モジュールA データベース B モジュールB APIゲートウェイ どうマイクロサービスの切り直しをしたか ● モジュラーモノリス化への移行 ○ 旧サービスA、Bを残しながら加重ルーティングにてリクエストを振り分け移行した 旧サービスA 旧サービスB データベース A 90% 10% 加重ルーティング サービスAB

Slide 19

Slide 19 text

19 © 2024 Techtouch. どうマイクロサービスの切り直しをしたか ● 別のドメイン境界でサービスを切り直し ○ サービスの特性上「サービスAB-main」「サービスAB-reader」(便宜上 main, reader とします)と いった別ドメインでサービスを切った方がよいことが明らかになってきた モジュールA データベース B モジュールB APIゲートウェイ データベース A サービスAB 別ドメイン境界 main reader

Slide 20

Slide 20 text

20 © 2024 Techtouch. どうマイクロサービスの切り直しをしたか ● 別のドメイン境界でサービスを切り直し ○ イベントストーミングを実施し裏付け ■ ビジネスプロセスやドメインの知識を共有、可視化、理解するプロセス

Slide 21

Slide 21 text

21 © 2024 Techtouch. どうマイクロサービスの切り直しをしたか ● 切り直し後はサービスの独立性が高まり、マイクロサービスの利点の多くが享受できるように ○ サービスを横断した開発がなくなり独立デプロイ可能になったり、スケールアウトしやすくなったり、 サービス間通信減らせたり main データベース A reader データベース B プレゼンテーション 分散トランザクション ❌ サービス横断した開発 サービス間通信 分散トランザクション 一見複雑になったようにも見えるが

Slide 22

Slide 22 text

© 2024 Techtouch. AWS DMSを活用してDB統合した話

Slide 23

Slide 23 text

© 2024 Techtouch. なぜDB統合したか

Slide 24

Slide 24 text

24 © 2024 Techtouch. なぜDB統合したか ● DBがサービスA、B時代のまま分かれているのでDB周りの開発効率がよくない ● RDSのコストが無駄にかかる サービスAB-main データベース A サービスAB-reader データベース B プレゼンテーション 分散トランザクション

Slide 25

Slide 25 text

25 © 2024 Techtouch. なぜDB統合したか ● こうしたい!!! サービスAB-main データベース AB サービスAB-reader プレゼンテーション

Slide 26

Slide 26 text

© 2024 Techtouch. DB統合の前提


Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

28 © 2024 Techtouch. DB統合の前提 参考:https://aws.amazon.com/jp/blogs/news/webinar-bb-awsdatabasemigrationservice-2021 ● Database Migration Service (DMS) とは

Slide 29

Slide 29 text

© 2024 Techtouch. どうDB統合したか

Slide 30

Slide 30 text

30 © 2024 Techtouch. Phaseを3段階に分けて統合した どうDB統合したか

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

33 © 2024 Techtouch. main データベース A reader データベース B プレゼンテーション どうDB統合したか Read/Write Read Only 2.DMSレプリケーション停止 1.メンテナンスで書き込みを止める ❌ ❌ 3.向き先をデータベースBに切り替える ● Phase3 ○ メンテナンスにより書き込みをとめ、mainのDBのむき先をデータベースBに切り替える

Slide 34

Slide 34 text

34 © 2024 Techtouch. どうDB統合したか ● こうなった!!! main データベース AB reader プレゼンテーション データベース A ❌

Slide 35

Slide 35 text

© 2024 Techtouch. 今後の課題


Slide 36

Slide 36 text

36 © 2024 Techtouch. 今後の課題 ● サービスの進化によってデータ構造が広くというより深くなってきた ○ リレーショナルで表現するのが難しいjsonのネストが深くなってきたイメージ ● 適切なデータアーキテクチャ選定で適切に事業要求とDB制約を捌いていきたい main データベース AB reader プレゼンテーション 最適化 最適化

Slide 37

Slide 37 text

© 2024 Techtouch. まとめ


Slide 38

Slide 38 text

38 © 2024 Techtouch. まとめ ● 事業の成長に合わせてサービスのアーキテクチャをアラインしていこう! ○ サービスのアーキテクチャに合わせた手法を使う ○ 難しければアーキテクチャを変更するのも手 ○ DBも含めてアーキテクチャにアラインするのは比較的困難だけど、AWS DMSを使えばやりたいことができるかも!

Slide 39

Slide 39 text

© 2024 Techtouch. Appendix

Slide 40

Slide 40 text

© 2024 Techtouch. AWS DMSで気を付けるポイント

Slide 41

Slide 41 text

41 © 2024 Techtouch. DMS設定 データベース A データベース B Source Target DMSインスタンス AWS DMS

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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(同期失敗)

Slide 45

Slide 45 text

45 © 2024 Techtouch. 気をつけるポイント④ インスタンスのメモリはなかなか開放されない ● フルロード時にメモリを結構使う ● その後のレプリケーション中も徐々にメモリが減り続ける ● メモリ解放はDMSに依存 初回フルロード時のメモリ使用量と、レプリケーション期間に使われるメモリ量を事前に確認しメモリ枯渇し ないように注意しましょう!

Slide 46

Slide 46 text

46 © 2024 Techtouch. 気をつけるポイント⑤ CASCADEで更新されたデータは同期されない ● レプリケーション中は「テーブル統計で」状況が確認できる ● CASCADEで更新されたデータは「検証に失敗しました」にカウントされ、レプリケーションは止まらないが、 ターゲット側のデータが更新されない CASCADEを利用しているか事前にチェックし対策しましょう!

Slide 47

Slide 47 text

47 © 2024 Techtouch. 気をつけるポイント⑥ フルロード時のtoo many connections発生に要注意 ● 並列にロードするテーブルの最大数のデフォルトは「8」 ● 開発環境は特にコネクション数が少ないので検証中は簡単にtoo many connectionsが発生します 本番のDBコネクションを使い切るリスクがあるので事前にコネクション数チェックをしチューニン グをしましょう!

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

すべてのユーザーが システムを使いこなせる世界に システム導入だけで終わらせない、利活用のためのDXプラットフォーム ご清聴ありがとうございました。