473 Views
June 18, 25
スライド概要
2025年6月7日(土)開催のJJUG CCC 2025 Springで使用した資料です。
ウェルスナビ株式会社 技術広報チームの公式アカウントです。
Aurora MySQLをv2からv3へ アップグレードした話 ⽥中 ⼤夢 & ⼤⾕ 幹仁 JJUG CCC 2025 Spring 1
⾃⼰紹介 田中 大夢 (Hiromu Tanaka) ウェルスナビ株式会社 ロボアド開発グループ 取引管理チーム ウェルスナビでは ● 2024年ウェルスナビ株式会社に新卒1期⽣として⼊社 ● トレーディング系システムの開発‧保守をしています ひとこと ● キウイフルーツをまるかじりするのにハマっています 2 @2025 WealthNavi Inc.
⾃⼰紹介 大谷 幹仁(Mikihito Otani) ウェルスナビ株式会社 サービス基盤グループ ソフトウェアエンジニアリングチーム ウェルスナビでは ● 2024年ウェルスナビ株式会社に新卒1期⽣として⼊社 ● 新機能開発や技術的負債の解消に取り組んでいます ひとこと ● 最近は週2回ボルダリングしてます 3 @2025 WealthNavi Inc.
アジェンダ 1. ウェルスナビのシステム概要 2. データベースアップグレードの取り組み 3. データベースアップグレードにおける問題と対応 4. このプロジェクトを通して 5. さいごに 4 @2025 WealthNavi Inc.
1. ウェルスナビのシステム概要 2. データベースアップグレードの取り組み 3. データベースアップグレードにおける問題と対応 4. このプロジェクトを通して 5. さいごに 5 @2025 WealthNavi Inc.
資産運用ロボアドバイザー 「 WealthNavi 」 6 ※ ⼀般社団法⼈⽇本投資顧問業協会「契約資産状況(最新版)(2024年9⽉末現在) 『ラップ業務』『投資⼀任業』」を基にネット専業業者を⽐較 ウエルスアドバイザー 社調べ(2024年12⽉時点) ※ 画⾯はイメージです。
システム概要図 提携先向け 全自動 システム 取引 Aurora MySQL Webアプリ API 7 社内業務 システム @2025 WealthNavi Inc.
ウェルスナビにおけるSpring Bootバージョン別利⽤率 ウェルスナビで採⽤しているSpring Bootのバージョン ● SpringBoot 1系 約51% ● SpringBoot 2系 約43% ● SpringBoot 3系 約6% 8 @2025 WealthNavi Inc.
1. ウェルスナビのシステム概要 2. データベースアップグレードの取り組み 3. データベースアップグレードにおける問題と対応 4. このプロジェクトを通して 5. さいごに 9 @2025 WealthNavi Inc.
データベースアップグレード概要 なぜアップグレードが必要だったのか? ● Amazon Aurora MySQL v2(MySQL 5.7互換)のサポート終了 ● 延⻑する場合、多額の費⽤が発⽣する(¥250万/⽉) ● サポート切れのまま利⽤する場合、不具合及び急なサービス停⽌など不測の事態が発 ⽣する可能性がある https://aws.amazon.com/blogs/database/introducing-amazon-rds-extended-support-for-mysql-databases-on-amazon-aurora-and-amazon-rds/ 10 @2025 WealthNavi Inc.
データベースアップグレード概要 アップグレードするしかない 11 @2025 WealthNavi Inc.
バージョン情報 対象 From To Aurora MySQL 2.11.5 3.08.0 MySQL互換 5.7.12 8.0.39 MySQL JDBC ドライバ 5.1.49 8.0.33 12 @2025 WealthNavi Inc.
データベースアップグレードで取り組んだこと 1. JDBCドライバの選定 2. アプリケーションの改修 3. ユニットテストの実施 4. パフォーマンステストの実施 13 @2025 WealthNavi Inc.
データベースアップグレード全体スケジュール JDBCドライバの選定と検証 アプリケーションの改修 ユニットテスト パフォーマンステスト リハーサル 本番 2024/07 2024/10 2025/01 14 2025/04 @2025 WealthNavi Inc.
JDBCドライバの選定 15 @2025 WealthNavi Inc.
JDBCドライバの選定 MySQL 5.7⽤からMySQL 8.0⽤に修正を⾏う ついでによりAuroraと相性の良いJDBCドライバの利⽤を検討した 組み合わせ メリット 採 デメリット ● ● ● 導⼊に追加の学習が必要 AWS以外での利⽤は想定されていない MySQL Connector Jと⽐較して性能が 落ちる可能性がある ⼀般的なMySQLデータベースに適している ● Auroraに特化していない ● AWSが提供するJDBCドライバで、Aurora MySQLに最適化されている ● ● AWS以外での利⽤は想定されていない 2024年7⽉25⽇でサポートが終了 ● 現⾏運⽤しているドライバのため変更コストが 最⼩ ● ● MySQL Connector Jの旧名称 MySQL 8.1以降は対応しない MySQL Connector J 用 ✖ AWS Advanced JDBC Wrapper ● ● Auroraに特化している MySQL Connector/Jをラップしているため、既 存のコードに⼤きな変更を加えずに利⽤可能 MySQL Connector J ● MySQL Connector J ✖ AWS MySQL JDBC MySQL Connector Java 16 @2025 WealthNavi Inc.
AWS Advanced JDBC Wrapperとは ラッパーは既存の JDBC ドライバを補完するもので、アプリケーションが Amazon Aurora のようなクラスタ化されたデータ ベースの機能をフルに活⽤できるように、ドライバの機能を拡張することを⽬的としています。⾔い換えれば、AWS JDBCド ライバはデータベースに直接接続するのではなく、ユーザーが選択したJDBCドライバ上でAWSとAuroraの機能をサポートし ます。引⽤元: About the Wrapper - AWS Advanced JDBC Wrapper 翻訳はDeepLを使⽤しています MySQL JDBC ドライバの機能を 拡張してくれる! MySQL JDBC ドライバ アプリケーション JDBC API AWS Advanced JDBC Wrapper DB https://github.com/aws/aws-advanced-jdbc-wrapper https://www.deepl.com/ja/translator 17 @2025 WealthNavi Inc.
AWS Advanced JDBC Wrapperとは AWSの機能を利⽤しやすくサポートしてくれる拡張ライブラリ IAMや SecretsManagerを 使⽤した接続を サポート フェイルオーバー に対応 MySQL JDBC ドライバ アプリケーション JDBC API AWS Advanced JDBC Wrapper DB https://github.com/aws/aws-advanced-jdbc-wrapper 18 @2025 WealthNavi Inc.
アプリケーションの改修 19 @2025 WealthNavi Inc.
アプリケーションの改修 - DataSourceの変更 AWS Advanced JDBC Wrapperの導⼊⽅法*¹ 1. 2. 依存関係にAWS Advanced JDBC Wrapperを追加 プロパティファイルでAWS Advanced JDBC Wrapperを設定する *² *¹ 既にJDBCを利⽤したDB接続設定があることを前提としている *² 設定値の詳細は 公式ドキュメント を参照 https://github.com/aws/aws-advanced-jdbc-wrapper/blob/main/docs/Documentation.md 20 @2025 WealthNavi Inc.
アプリケーションの改修 - Aurora MySQL v3への対応 MySQL 8.0互換への対応修正が必要(⼀部) ● 予約語(Rank, Row)の対応 ● GROUP BYによる暗黙のソート*¹がなくなることへの対応 対応⽅法 ● Rank, Rowの該当箇所はエスケープ処理 ● GROUP BYは仕様を確認し暗黙ソートを利⽤している場合は修正 *¹ https://zenn.dev/wn_engineering/articles/855861a565f496 21 @2025 WealthNavi Inc.
アプリケーションの改修 - Aurora MySQL v3への対応 パフォーマンステストで性能劣化していた箇所の改修 ● SELECT COUNT(*)が遅い問題への対応 ○ 遅延が確認されたコードが12箇所存在した 対応⽅法 ● ● 該当するアプリの遅延による影響を確認 ○ 影響のある箇所はインデックスが利⽤されるように対応 ○ 影響のない箇所はそのまま利⽤ アップグレード先がAurora MySQL v3.08.0(MySQL 8.0.39互換)になったため対応 不要となった 22 @2025 WealthNavi Inc.
ユニットテストの実施 23 @2025 WealthNavi Inc.
テスト対象範囲 影響のあるリポジトリが50個以上あった 24 種類 対象範囲 リポジトリ 50個以上 バッチジョブ 150個以上 @2025 WealthNavi Inc.
ユニットテストの実施 テストを実装するにあたり ● MySQLContainerを使⽤したリポジトリのテスト実施 ● 対象となるリポジトリクラスが2,334個 → TestContainersInitializerクラスの実装例 JPAのNativeQueryを使⽤してる メソッドに絞ってテストを⾏った テストクラスの実装例 https://zenn.dev/wn_engineering/articles/6523f5e8100662 25 @2025 WealthNavi Inc.
パフォーマンステストの実施 26 @2025 WealthNavi Inc.
パフォーマンステストの実施 定義 ● システムが正常に動作するかを確認するテスト ● 対象はバッチアプリケーション ⽬的 ● 性能確認(MySQL 5.7系とMySQL 8.0系における処理を⽐較) ○ 本番相当のデータ量でバッチアプリケーションの処理時間が予定時間通りに 終了することを確認する ○ メモリとデータベースの負荷が現⾏のシステムから⼤幅に増加していないこ とを確認する 27 @2025 WealthNavi Inc.
証券残⾼テーブルの累積レコード数 年々増加する膨⼤なデータ量に対応するには、パフォーマンステストを実施し、その処理 能⼒を確認する必要がある 28 @2025 WealthNavi Inc.
パフォーマンステストで確認する主な項⽬ 以下の項⽬に関してMySQL 5.7に⽐べて⼤幅に劣化していないこと(許容範囲内)を確認 種類 項⽬ アプリケーション 処理時間 データベース アクティブセッション数 データベース CPU負荷率 データベース 各種スループット 29 @2025 WealthNavi Inc.
パフォーマンステストの流れ 本番環境のDBから 個⼈情報をマスキン グした断⾯を⽤意 バッチ処理の テストを実施 30 テスト結果の検証 & RDSの負荷メトリク スを取得 @2025 WealthNavi Inc.
1. ウェルスナビのシステム概要 2. データベースアップグレードの取り組み 3. データベースアップグレードにおける問題と対応 4. このプロジェクトを通して 5. さいごに 31 @2025 WealthNavi Inc.
データベースアップグレードで発⽣した問題 ● ● アプリケーションで発⽣した問題 ○ プロジェクトによって利⽤しているSpring Bootのバージョンがバラバラ ○ CIが永遠に終わらない AWSのインスタンスで発⽣した問題 ○ Auroraインスタンスの確保に失敗 ○ ECS Fargate Spotだと途中で落ちる可能性 32 @2025 WealthNavi Inc.
アプリケーションで発⽣した問題 33 @2025 WealthNavi Inc.
Spring Boot 1系とSpring Boot 2系が約半数ずつ利⽤している ウェルスナビで採⽤しているSpring Bootのバージョン ● SpringBoot 1系 約51% ● SpringBoot 2系 約43% ● SpringBoot 3系 約6% 34 @2025 WealthNavi Inc.
Spring Bootのバージョンが違うことで発⽣した問題 SpringBoot 1系とSpringBoot 2系では、 デフォルトで使⽤しているコネクションプールが異なる コネクションプールの設定が異なると、 AWS Advanced JDBC Wrapperの設定方法も 異なる! https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide 35 @2025 WealthNavi Inc.
Spring BootのバージョンによってDataSourceの設定⽅法が異なる 36 @2025 WealthNavi Inc.
Spring BootのバージョンによってDataSourceの設定⽅法が異なる SpringBoot 2系の対応のため、 HikariCPの設定をする SpringBoot 1系の対応のため、 Tomcat JDBC Connection Poolの設定をする SpringBoot 2系の対応のため、 HikariCPの設定をする どっちだっけ?? 37 @2025 WealthNavi Inc.
Spring BootのバージョンによってDataSourceの設定⽅法が異なる 対処⽅法 チェック回数を増やしてミスの発⾒確率をあげる ①設定時にチェック ②チーム内でレビュー 38 ③リリース前にチェック @2025 WealthNavi Inc.
Spring Bootバージョンがバラバラの原因 ● その当時の最新バージョンを取り⼊れていた ● プロジェクトごとに技術選定の⾃由度が⾼く、バージョン統⼀の優先度が低 かった 39 @2025 WealthNavi Inc.
Spring Bootバージョンがバラバラの原因 ● その当時の最新バージョンを取り⼊れていた ● プロジェクトごとに技術選定の⾃由度が⾼く、バージョン統⼀の優先度が低 かった 40 @2025 WealthNavi Inc.
Spring Bootバージョンがバラバラの原因 ● その当時の最新バージョンを取り⼊れていた ● プロジェクトごとに技術選定の⾃由度が⾼く、バージョン統⼀の優先度が低 かった 多くが 2016年~2018年にリ リースされた アプリケーション 41 @2025 WealthNavi Inc.
Spring Bootバージョンがバラバラの原因 ● その当時の最新バージョンを取り⼊れていた ● プロジェクトごとに技術選定の⾃由度が⾼く、バージョン統⼀の優先度が低 かった 多くが 2016年~2018年にリ リースされた アプリケーション 多くが 2019年~2022年にリ リースされた アプリケーション 42 @2025 WealthNavi Inc.
アプリケーションの初回リリース時期とSpring Bootのサポート期間 43 @2025 WealthNavi Inc.
テスト量が多すぎてCIが落ちた GC overhead limit exceededでCIが落ちる事象が頻発 java.lang.IllegalStateException: Failed to load ApplicationContext … Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded … Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 44 @2025 WealthNavi Inc.
テスト量が多すぎてCIが落ちた GC overhead limit exceededでCIが落ちる事象が頻発 java.lang.IllegalStateException: Failed to load ApplicationContext … Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded … Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded 仮に成功してもCIに27分かかる 45 @2025 WealthNavi Inc.
クソデカライブラリが存在する 共通ライブラリ アプリケーションA アプリケーションE アプリケーションB アプリケーションD アプリケーションC 46 @2025 WealthNavi Inc.
テスト量が多すぎてCIが落ちた 事象と課題 ● 対象テストが多く、TestContainersを起動させすぎてGC overhead limit exceededが発⽣していた 対処 ● @ClassRuleでコンテナを停⽌し並⾏で同時に起動している量を減らす ○ ● ⼀時的な軽減には繋がったが根本的な解決ではない 不要なSystem.out.printlnを削除する 47 @2025 WealthNavi Inc.
テスト量が多すぎてCIが落ちた 事象と課題 ● 対象テストが多く、TestContainersを起動させすぎてGC overhead limit exceededが発⽣していた 対処 ● @ClassRuleでコンテナを停⽌し並⾏で同時に起動している量を減らす ○ ● ⼀時的な軽減には繋がったが根本的な解決ではない 不要なSystem.out.printlnを削除する CIの並列処理やライブラリの分割は今後の課題 48 @2025 WealthNavi Inc.
AWSのインスタンスで発⽣した問題 49 @2025 WealthNavi Inc.
インスタンスガチャ問題 そんなことある? データベースインスタンスの在庫が不⾜ インスタンスガチャとは Amazon AuroraのDBインスタンスが 「いつ確保できるのか分からない」運任せ状態 50 @2025 WealthNavi Inc.
テスト要件 プロパティ 設定値 インスタンス db.r6i.16xlarge リージョン ap-northeast-1(東京リージョン) アベイラビリティゾーン(AZ) 特定AZ 制約 特定AZに固定 51 @2025 WealthNavi Inc.
インスタンスガチャ負のループ - DB巻き戻しと復元の試⾏ DBの巻き戻しが困難で、スナップ ショットの復元に依存 バッチ処理テスト実施 (⼤量のデー タ操作 (UPDATE)) スナップショット復元時にインスタ ンス確保がまた失敗する 52 @2025 WealthNavi Inc.
インスタンスガチャ対応 1. ⼩さいインスタンスサイズを利⽤(r6i.8xlarge) 2. ⽇本時間⼣⽅以降にテスト実施(インスタンスが確保しやすい) 3. インスタンスが確保できるまで別の仕事をする 53 @2025 WealthNavi Inc.
インスタンスガチャ沼 ECS Fargate Spot編 ECSタスク起動のリクエスト送信 ↓ service xxx was unable to place a task. Reason: Capacity is unavailable at this time. Please try again later or in a different availability zone. ↓ RDSだけでなく、Fargate Spotもガチャだった 54 @2025 WealthNavi Inc.
インスタンスガチャ負のループ 55 @2025 WealthNavi Inc.
インスタンスガチャ対応 (Fargate Spot) 1. ⽇本時間⼣⽅以降にテスト実施(インスタンスが確保しやすい) 2. Fargateに切り替える 3. インスタンスが確保できるまで別の仕事をする 56 @2025 WealthNavi Inc.
1. ウェルスナビのシステム概要 2. データベースアップグレードの取り組み 3. データベースアップグレードにおける問題と対応 4. このプロジェクトを通して 5. さいごに 6. 57 @2025 WealthNavi Inc.
本プロジェクトを通して 本プロジェクトを通して浮き彫りになった問題が多数あった ● Spring Bootのバージョンのアップデートされておらずバラバラ ● 多数のアプリケーションが依存する巨⼤ライブラリがありメンテコストが⾼い ● 今後のユーザー数増加によりパフォーマンスが劣化する恐れがある 58 @2025 WealthNavi Inc.
本プロジェクトを通して 本プロジェクトを通して浮き彫りになった問題が多数あった ● Spring Bootのバージョンのアップデートされておらずバラバラ ● 多数のアプリケーションが依存する巨⼤ライブラリがありメンテコストが⾼い ● 今後のユーザー数増加によりパフォーマンスが劣化する恐れがある 理想は「負債ゼロ」なのか? → NO ● 許容できる範囲内で適切に管理されている状態が理想 ● 今回のプロジェクトでは今まで「許容できる範囲内」だと認識していたが、実際 はそうでないことが顕在化した 59 @2025 WealthNavi Inc.
1. ウェルスナビのシステム概要 2. データベースアップグレードの取り組み 3. データベースアップグレードにおける問題と対応 4. このプロジェクトを通して 5. さいごに 6. 60 @2025 WealthNavi Inc.
Next Action ● Java 8 & 11 & 17 → Java 21以降へアップグレード ● Spring Boot 1系 & 2系 → Spring Boot 3系へアップグレード ● MySQL 8.0系 → MySQL 8.4系へアップグレード 61 @2025 WealthNavi Inc.
ロボアド開発グループの紹介 ● ロボアドサービスにおける新機能開発やエンハンス開発 ● 技術的負債解消やアーキテクチャのモダナイズ ● ロボアドサービスの根幹を⽀える開発部隊 Latency Integration Container Framework Performance SQL Resillience Log Architecture Pub/Sub Cloud Java Security Event-Driven 62 @2025 WealthNavi Inc.
Appendix 1 定期的にWealthNaviの開発(技術‧組織)に関する情報を発信しています。 開発者ブログ ● https://zenn.dev/p/wn_engineering ブックマーク追加や記事への「いいね」していただけると嬉しいです 技術広報に関する お問い合わせ先 ● ウェルスナビ DevRelチーム([email protected]) 63 @2025 WealthNavi Inc.
Appendix 2 ウェルスナビでは複数の開発系ポジションで採⽤を強化しています。 主な採⽤中職種 ● ● ● ● ● モバイル開発エンジニア エンジニアリングマネージャー バックエンド開発エンジニア QAエンジニア データエンジニア 採⽤情報詳細 ● 下記URL(QRコード)よりご確認ください。 https://recruit.wealthnavi.com/ 採⽤に関する お問い合わせ先 ● ● 「カジュアルに話を聞いてみたい」という温度感でも構いません。 ウェルスナビ採⽤チーム([email protected])までご連 絡お待ちしております。 64 @2025 WealthNavi Inc.
【重要な注意事項】 ● 本資料は、断定的判断を提供するものではなく、情報を提供することのみを⽬的としており、いかな る種類の商品も勧誘するものではありません。最終的な決定は、お客様⾃⾝で判断するものとし、当 社はこれに⼀切関与せず、また、⼀切の責任を負いません。 ● 本資料には将来の出来事に関する予想が含まれている場合がありますが、それらは予想であり、ま た、本資料の内容の正確性、信頼性、完全性、適時性等を⼀切保証するものではありません。本資 料に基づいて被ったいかなる損害についても、当社は⼀切の責任を負いません。また、当社は、新 しい情報や将来の出来事その他の情報について、更新⼜は訂正する義務を負いません。 ● 本資料を利⽤することによりお客様に⽣じた直接的損害、間接的損害、派⽣的損害その他いかなる 損害についても、当社は⼀切の責任を負いません。 商号等:ウェルスナビ株式会社 金融商品取引業者 関東財務局長(金商) 第2884号 加入協会:日本証券業協会 一般社団法人日本投資顧問業協会 65 @2025 WealthNavi Inc.
ご清聴ありがとうございました 66 @2025 WealthNavi Inc.