マルチテナントのサービスインフラに大きなテナントを受け入れるまで
by
koudenpa
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
マルチテナントのサービスインフラ に大きなテナントを受け入れるまで 2024-10-15 Hatena Engineer Seminar #31 「少年ジャンプ+」 サーバーサイド編 id:koudenpa
Slide 2
Slide 2 text
自己紹介 ● id:koudenpa ○ コウデン ● はてなでの役割 ○ マンガメディア開発チーム ○ テックリード ■ エンジニアリングを広く見る
Slide 3
Slide 3 text
GigaViewer ● はてなが提供するマンガビューワ ● GigaViewer for Apps ● GigaViewer for Web ● 「マルチテナントのサービス」
Slide 4
Slide 4 text
マルチテナントのサービス https://hatena.co.jp/solutions/gigaviewer
Slide 5
Slide 5 text
少年ジャンプ + ● 株式会社集英社が配信するマンガサービス ● スマホアプリ版 ● Webブラウザ版 ● 「大きなテナント」
Slide 6
Slide 6 text
少年ジャンプ +とGigaViewer ● 2024年3月末にfor Appsに提供開始 ● for Webへは以前から提供中 ● GigaViewer for Appsに ● 少年ジャンプ+を ● 「受け入れる」 https://hatena.co.jp/press/release/entry/2024/03/29/120000
Slide 7
Slide 7 text
目次 ● 受け入れるテナントの規模 ● インフラの分割 ● 想定される負荷の試験 ● リリース後の対応
Slide 8
Slide 8 text
受け入れるテナントの規 模
Slide 9
Slide 9 text
パブリックな数字を見てみる
Slide 10
Slide 10 text
素朴に大きい ● 数字の規模が明らかに大きい ● UU/リクエスト数等も多いと分かっている
Slide 11
Slide 11 text
インフラの分割
Slide 12
Slide 12 text
GigaViewerの構成 GigaViewer サーバサイド (テナント共通) テナントA テナントB テナントC
Slide 13
Slide 13 text
GigaViewerサーバサイド スケールアウト可 ● アプリケーション 実行環境 スケールアウト不可 ● 各種データベース
Slide 14
Slide 14 text
インフラ分割の判断 ● スケールアウト不可リソースの上限 ○ 超えるリスク ● スケールアウト可リソースのテナント間影響 ○ 想定外の影響リスク ● 一式独立したものに分割
Slide 15
Slide 15 text
素朴に分割実施 ● 分割先環境一式を構築 ● メンテナンスイン ○ 【重要】 ブラウザ版メンテナンス実施のお知らせ 12/21(木) 午前1:00~5:00 ● DBを複製 ● DNSレコードを分割先に切り替え ● メンテナンスアウト https://shonenjumpplus.com/article/infomation_231221
Slide 16
Slide 16 text
分割先環境一式を構築 DNS 既存 サーバー環境 既存 DB 新設 サーバー環境 新設 DB 全テナント
Slide 17
Slide 17 text
メンテナンス中にDB複製 DNS 既存 サーバー環境 既存 DB 新設 サーバー環境 新設 DB メ ン テ ナ ン ス
Slide 18
Slide 18 text
DNSを切り替えてメンテナンスアウト DNS 既存 サーバー環境 既存 DB 新設 サーバー環境 新設 DB 他テナント 少年 ジャンプ+
Slide 19
Slide 19 text
構築はできる限り 便利に
Slide 20
Slide 20 text
結果 ● 独立した本番運用環境 ● 受け入れ後の出来事の影響範囲が最小化
Slide 21
Slide 21 text
想定される負荷の試験
Slide 22
Slide 22 text
想定される負荷 「UU/リクエスト数等も多いと分かっている」 ● 分かっている数値が基本
Slide 23
Slide 23 text
試験シナリオ ● 個別の操作毎の呼び出し ● ピークタイムのリクエスト傾向再現 ● 分かっている数値に安全係数を掛けて設定
Slide 24
Slide 24 text
試験環境 ● 負荷試験向けの独立環境を構築 ● 本番想定のリソースサイズに設定 ● 本番相当量のデータを投入
Slide 25
Slide 25 text
構築はまぁまぁ 便利に
Slide 26
Slide 26 text
試験実施 ● シナリオ実行 ● 素朴にボトルネック修正 ● 想定負荷に耐えるまで繰り返し シナリオ実行 ボトルネック修正 試験結果 試験環境更新 k6 Performance Insights, X-Ray, etc
Slide 27
Slide 27 text
データベース周り修正 ● Performance Insights ○ 試験実施中の結果を見て ○ 時間が掛かっているクエリ周りを見直す ○ INDEXを付けるのが主
Slide 28
Slide 28 text
アプリケーション修正 ● X-Ray ○ 負荷試験で遅かったトレースを見て ○ 時間が掛かっている処理周りを見直す ○ N+1、キャッシュ調整が主 ■ GraphQLのDataLoader/アプリケーションキャッシュなど
Slide 29
Slide 29 text
結果 ● 想定負荷の試験をパス ● 受け入れ準備整う
Slide 30
Slide 30 text
そして
Slide 31
Slide 31 text
リリース ● メンテナンスイン ○ 【重要】3月28日 長時間メンテナンス実施およびアプリ 仕様変更のお知らせ ● リリース作業 ○ データの移行含めて諸々計画した ○ このスライドはそれを書くには狭すぎる ● メンテナンスアウト…… https://shonenjumpplus.com/article/info20240328
Slide 32
Slide 32 text
リリース後の対応
Slide 33
Slide 33 text
リリース当日 ● 想定外の負荷はあった ● ホットフィックス!
Slide 34
Slide 34 text
リリース後 ● 想定外の負荷はあった ● 都度フィックス!!
Slide 35
Slide 35 text
素朴に適宜対応 ● 想定ではなく実際 ● 対応はしやすい
Slide 36
Slide 36 text
特に印象的だった対応 ● 色々あった ○ 本番だけ重いSQL ○ キャッシュ漏れ ○ etc ● ぶっちぎりNo.1印象深かったのは?
Slide 37
Slide 37 text
ある月曜0時のリクエスト数 ● 月曜0時とは? ● 週刊少年ジャンプの配信時刻 23:00 00:00
Slide 38
Slide 38 text
ALBのスパイク耐性を突破 ● 噂によると…… ● 5分で5倍になると耐えられない ● 1分未満で5倍以上 ● ALBは数分遅れでスケールアウト ○ CloudTrailにNICの作成ログ
Slide 39
Slide 39 text
スパイク対応 ● ALBを暖機するか ● スパイク耐性のあるNLBに移行するか ● 後者で対応 ● ALBとNLBでは機能が違うが? ● 今回は適合した
Slide 40
Slide 40 text
結果 ● なんとか 受け入れ後も運用できている
Slide 41
Slide 41 text
まとめ
Slide 42
Slide 42 text
大きなテナントを受け入れるに当って ● 見積もって ○ 受け入れるテナントの規模 ● 準備して ○ インフラの分割 ● 検証して ○ 想定される負荷の試験 ● 受け入れた ○ リリース後の対応
Slide 43
Slide 43 text
これから ● 素朴に都度対応 ● SREをやっていく