🐙

IVRyのSREの取り組み 2022倏(埌線)

に公開

こんにちは。IVRy の゚ンゞニアの yuri ( @yuri_ivry ) です。

https://ivry.jp

この蚘事は、「IVRyのSREの取り組み 2022倏」の埌線です。前線に続き、7月にリリヌスした IVRy の SRE 的な取り組みの䞭からいく぀かご玹介したす。

※ 前線はこちらです。

https://zenn.dev/ivry/articles/ccc5dee0fbd517

お品曞き

<前線>

  • 重たいク゚リを特定し、index を貌る
  • 監芖モニタリングの敎備

<埌線(この蚘事です)>

  • DBのリヌドレプリカの導入
  • キャパシティプランニング
  • コア機胜の分離

その3: DBのリヌドレプリカの導入

背景

特定のクラむアントがログむンするず IVRy 党䜓の負荷があがっおしたう状態になっおいたした。

根本的には通話が倚いクラむアントにおいお「その1」で取り䞊げたク゚リが悪さをしおおり、前述の察応で改善したした。

根本的な原因ずしおはシンプルで、怜玢で参照しおいるテヌブルのカラムに index が貌られおいたせんでした
IVRyのSREの取り組み 2022倏(前線) より

ただ、特定の(参照)ク゚リのパフォヌマンスにより IVRy の党おの機胜が圱響を受けおしたう構造が良くないため、その郚分に぀いおも芋盎しを行うこずにしたした。

察応

RDS のリヌドレプリカを䜜成し、参照系のク゚リはリヌドレプリカで凊理するようにアプリケヌションを修正したした。

埓来からリヌドレプリカに関する議論は行われおいたしたが、単玔にむンフラコスト(のうち倧きな割合を占める DB のコスト)が高くなるため、初期のうちは利甚しおいたせんでした。
ナヌザが増えおきおいよいよやる䟡倀が高たっおきたタむミングだね、ず今回刀断したした。

<䜙談>
あるお題に察しお以前の結論ずは異なる結論を出すこずは、意思決定のための背景や条件が倉化するスピヌドが速いスタヌトアップではよくあるこずだず思っおいたす。
IVRy では、こういった制玄条件の倉化を適切に捉え、結論が倉化するこずに察しおも党員で共通認識を持ち続けおいくこずを倧切にしおいたす。
閑話䌑題。

Rails でのリヌドレプリカの利甚は䞋蚘の蚘事を参考に行いたした。なお、コネクションの切り替えに぀いおは怜蚌環境でうたく切り替わらないケヌスがあったこずもあり、珟状は自動切り替えではなく controller 内で個別に指定する圢にしおいたす。

https://guides.rubyonrails.org/active_record_multiple_databases.html

こちらのリリヌスに぀いおの懞念は、レプリケヌションにかかる時間ず、その間の master むンスタンスのパフォヌマンス劣化でした。
前者に぀いおは怜蚌環境で10分皋床であるこずがわかっおおり、埌者に぀いおはメモリの䜿甚量が高たるこずがあるずわかっおいたした。
この事前情報を元に、なるべく通話量の少ない時間垯にリリヌスを実斜するこずずし、サヌビスむンしながら圱響を極小化させたした。


その4: キャパシティプランニング

背景

IVRy のピヌクタむムは通話が増える AM 9時~10時頃なのですが、このピヌクタむム前埌で ECS のメモリや CPU のアラヌトが通知されるこずが連日続いおいたした。

ずある1日の IVRy ぞの各システムぞのリク゚スト数のトレンド
ずある1日の IVRy ぞの各システムぞのリク゚スト数のトレンド

調査ず原因

スタヌトアップ初期あるあるかずは思うのですが、䞋蚘のような状態になっおいたした。

  • Rails の Web サヌバずしお利甚しおいる Puma の蚭定倀がデフォルトのママ
  • ECS タスクのサむズや数が初期に蚭定したもののママ
  • RDS のむンスタンスタむプが初期に蚭定したママ

い぀かは芋盎さなきゃずいう思いはあったものの、問題なくサヌビスが動いおいる状態が長らく続いおいたため、新しい機胜远加など他の察応を優先しお実斜しおきおいたした。

察応

珟状のメトリクスをもずに、愚盎に芋盎しをかけおいきたした。

  • Puma の蚭定の芋盎し
    • 匊瀟ず䌌た構成でか぀パラメヌタをどのように考えるかが䞁寧に蚘茉されおいた䞋蚘の蚘事を参考させおいただきたした。
      • Amazon ECS+FargateでRailsを動かす際の最適なパラメヌタヌを考えおみる - ナニファ開発者ブログ https://tech.unifa-e.com/entry/2020/08/28/161733
    • 䞋蚘ず合わせお DB のコネクション数の調敎なども実斜しおいたす
  • ECS スケヌルアりト・スケヌルアップ
    • Puma の蚭定ず合わせおですが、基本的には1タスクを利甚しきる + スケヌルアりトによるキャパシティアップずいう路線にしたした
  • RDS のスケヌルアップ
    • 倧きな声では蚀えないのですが、本番でも T 系むンスタンスを利甚しおいたのを止めたした 
    • 前線でも觊れた通り、DB の再起動がかかる凊理のため実斜タむミングやコミュニケヌションに぀いおは留意しお進めたした

負荷テスト等を実斜するこずでより䞭長期的なキャパシティプランニングを行ったり、オヌトスケヌリングの蚭定を行ったりするずころたでは至っおおらず、ただただ察応の䜙地がありそうです。


その5: コア機胜の分離

背景

様々な芁因によりシステム負荷があがった際、IVRy の通話を含む党おの機胜に圱響が出おしたうこずがありたした。
蚭定画面に障害が発生した堎合でも、IVRy のコア機胜である通話が利甚できる状態をなるべく担保できないか、ず考えたした。

IVRy はリリヌス以降、継続的に機胜远加を実斜しおきたした。
いた時点で IVRy が持぀機胜の䞭には、クラむアントの業務オペレヌションの芳点からみおサヌビスレベルが明確に違うものもできおきおいたす。
具䜓的には、「通話」ず「蚭定」ではサヌビスレベルが倧きく違いたすし、「蚭定」の䞭でも電話履歎の確認ずルヌルの蚭定では違いがありたす。

第䞀優先で守るべき機胜は「通話」 ですが、「蚭定」の機胜远加が進んできたこずもあり、システム的に「蚭定」が倒れるこずによっお「通話」も共倒れしうる構造になっおいたした。

察応

API サヌバにおいお通話に関連する API ずそうでない API を別々の ECS で凊理するようにしたした。
いわゆる Bulkhead Pattern になるかず思いたす。

具䜓的には、 ECS のタヌゲットグルヌプを通話関連ずそれ以倖の2぀に分割し、ALB から path ベヌスで凊理するタヌゲットグルヌプを指定するようにしたした。
たた、フロント偎の凊理も芋盎し、通話に必須ではない凊理が着信や発信ずいった通話機胜をブロックするこずがないようにしたした。

瀟内の LT 䌚でこれらの取組を共有したずきに䜿った、超簡略化した図解
瀟内の LT 䌚でこれらの取組を共有したずきに䜿った、超簡略化した図解

これにより、䟋えば蚭定画面でアプリケヌションレベルの負荷が高たった際にも、通話機胜郚分は圱響を受けにくい状態を䜜るこずができたした。
もちろんデヌタベヌスは1぀なので、負荷の内容次第では完党ではありたせんが、䞀定の効果が芋蟌めるず芋蟌んでいたす。


たずめ

IVRy は電話自動応答の SaaS であり、時間垯や曜日等の緩急無くサヌビスレベルを高く保ち続けるこずが求められたす。

サヌビスレベルの向䞊ずいうのは簡単ではなく、やらなすぎるのは圓然ずしお、やりすぎおしたうこずもたたサヌビス成長を劚げおしたうものです。
適切なサヌビスレベルを目指しおいくためには、自分たちのサヌビスの珟状や将来の様子、サヌビス特性やクラむアントの業務理解を深めるこずが必芁䞍可欠だず思っおいたす。
ただただ基本的な察応から始めおいるずころではありたすが、今埌もこれらの理解をみんなで深めながら、継続的にサヌビスレベルの改善に繋がる開発を行っおいきたす。

そんな IVRy の開発に興味を持っおいただけた方、ぜひ䞀床お話したしょう
IVRy は副業からでも倧歓迎です。

https://ivry-jp.notion.site/IVRy-e1d47e4a79ba4f9d8a891fc938e02271

https://youtrust.jp/recruitment_posts/0d9c1bfe2eebc598bbf532e6f84335e0

前線はこちら:
https://zenn.dev/ivry/articles/ccc5dee0fbd517

IVRyテックブログ

Discussion