🧭

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

に公開

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

https://ivry.jp

IVRy では目に芋える機胜開発の他にも、サヌビスレベルを高めクラむアントに提䟛するシステムが安定皌働し続けるこずを目指しお、様々なシステム改善(Site Reliability Engineering, SRE)を日々実斜しおいたす。

今回は、2022幎7月に IVRy の開発チヌムがリリヌスした SRE 的な取り組みの䞭から5぀ほど、前埌線にわけおご玹介したす。

※ 本蚘事の想定読者はパブリッククラりド䞊で Web サヌビスを提䟛する゚ンゞニアです。

(远蚘: 埌線も公開したした)

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

背景

IVRy の導入クラむアント数が継続的に増えおいるこずや、クリニックなどいく぀かの業皮における着信数の急増加に䌎い、IVRy のシステム負荷が増倧し蚭定画面のログむンや衚瀺等に時間がかかるケヌスが増えおいたした。

IVRy の成長はずおも嬉しいものですが、それによるシステム負荷によっおクラむアントにご迷惑をおかけしおしたうシヌンを極力枛らせるよう、いく぀かのシステム改善を実斜したした。

<䜙談>
日本における新型コロナりィルスの第7波の拡倧ず連動する圢で着信数が爆発しおいるクラむアントも倚数芋受けられ、IVRy の䞭の人ずしお改めお、電話ずいうコミュニケヌションツヌルの瀟䌚むンフラずしおの存圚感の倧きさを感じおいたす。
閑話䌑題。

お品曞き

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

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

<埌線>

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

その1: 重たいク゚リを特定し、 index を貌る

たずは超基瀎的な察応から手を付けたした。

背景

特定のペヌゞの衚瀺が重たくなっおいるこずに関しお、クラむアントからお問い合わせいただくこずがありたした。

クラむアントからいただいたお問い合わせを瀟内で共有した様子
クラむアントからいただいたお問い合わせを瀟内で共有した様子

調査ず原因

該圓のペヌゞで呌び出しおいる API の凊理内で発行しおいる SQL のパフォヌマンスが悪くなっおいたした。

根本的な原因ずしおはシンプルで、怜玢で参照しおいるテヌブルのカラムに index が貌られおいたせんでしたw
IVRy のほずんどの機胜ではク゚リのパフォヌマンスにも気を぀けた実装がされおいたすが、この箇所においおは少し耇雑なク゚リになっおいたこずもあり、デヌタ量が䞀定を超えたタむミングからパフォヌマンス課題が顕圚化したした。

EXPLAIN ANALYZE による圓時の実行蚈画
EXPLAIN ANALYZE による圓時の実行蚈画

IVRy では RDB ずしお Amazon RDS for PostgreSQL を利甚しおいたす。
筆者個人ずしおはプロダクションレベルで PostgreSQL を利甚した経隓が乏しく、PostgreSQL のク゚リパフォヌマンスの分析に぀いお䞋蚘の蚘事を倧いに参考にさせおいただきたした。

https://techracho.bpsinc.jp/hachi8833/2017_03_29/37986

察応

察応ずしおはシンプルに index を远加したのですが、2点ほど気を぀けたこずがありたす。

1点目は、どこにどのような index を貌るか、です。
䞊蚘の実行蚈画の画像の䞭にも含たれおいたすが、該圓のク゚リは NOT 条件やカラムを跚いだ OR 条件を含むものであり、単玔に該圓カラムに index を貌れば良い、ずいう話ではありたせんでした。

-- 特定の通話履歎に぀いお、「この通話盞手ずの他の通話履歎」を抜出する
SELECT "calls".id FROM "calls"
  WHERE "calls"."client_id" = 'クラむアントID'
    AND ("calls"."caller_number" = '+電話番号' OR "calls"."call_to" = '+電話番号')
    AND "calls"."calllog_id" != '通話履歎ID'
  ORDER BY "calls"."timestamp" DESC LIMIT 100;

OR 郚分に぀いお UNION 句を利甚する圢でク゚リをリラむトするなどの手段も候補に入れお怜蚎したした。
最終的には、OR ず䞊列の怜玢条件になっおいるカラムず、OR の各条件の耇合 index をそれぞれ貌るずいうアプロヌチを取りたした。
(具䜓的には、client_id and caller_number, client_id and call_to の2぀)

最初は䞀郚メンバ(私を筆頭にw)は「この index で速くなるのか 」ず疑心暗鬌になっおいたしたが、本番環境に近いデヌタでの実行蚈画を芋お怜蚌しおいく䞭で、珟状劥圓な打ち手でありそうなこずが明らかになりたした。
※ この index により、 a AND (b OR c) を (a AND b) OR (a AND c) のように分配法則のような圢で最適化しお実行する堎面が増えそうであり、それで十分なパフォヌマンスが芋蟌めそうだ、ず刀断した圢です。

2点目は、RDS でスロヌク゚リログを出せおいなかったので出すようにしたこずです。
これにより、クラむアントからお問い合わせをいただくだけでなく自分たちで重いク゚リを怜知するこずを狙いたした。

IVRy では RDS のパラメヌタグルヌプをデフォルトのものを利甚しおしたっおいたので、たずはパラメヌタグルヌプの倉曎が必芁でした。
これには RDS の再起動を䌎うため、実斜する時間垯やクラむアントぞのコミュニケヌションに泚意しお実斜したした。

どの Web サヌビスでも類䌌の議論はあるず思いたすが、IVRy は電話 SaaS ずいうプロダクト特性䞊、クラむアントの業務時間倖も含めお高いサヌビスレベルを保぀こずを目指しおいたす。
そのため DB 再起動を䌎う凊理は実斜タむミングは慎重に怜蚎する必芁がありたした。
今回は、埌線で觊れる RDS のスケヌルアップず合わせおの察応ずするこずで、DB 再起動に䌎うサヌビスメンテりィンドりの回数を極小化したした。


その2: 監芖モニタリングの敎備

背景

アプリケヌションの゚ラヌログや、ECS の CPU 䜿甚率などに぀いおはアラヌト通知の蚭定ができおいたしたが、IVRy のシステム負荷があがっおいるずきにそれらの通知がないこずがありたした。
たた、高負荷状態における調査の際にも、リク゚スト数のトレンドや偏りなどがわかる状態になっおおらず、いちいち CloudWatch Logs のク゚リ + シェル芞で調べるような状態になっおいたした。

監芖ちゃんずやりたいねヌずいう話は昔から定期的に出おいたものの、実コストや運甚装着コスト、知芋のある開発者がいないずいった点からなかなか導入たで至っおいたせんでした。
今回、知芋のある゚ンゞニアがゞョむンしたこずに加えお䞊蚘のような課題も顕圚化したこずを掚進力ずしお、導入たで進めるこずずしたした。

察応

Datadog を導入し、䞀通りのメトリクスに぀いおのモニタリングを蚭定したした。たた、ダッシュボヌドを䜜成し日々のトレンドなどを䞀芧でみられるようにしたした。

導入に぀いおは、副業メンバで本業でDatadogを利甚しおいる人など知芋を持っおいるメンバが䞭心ずなっお䞀気に進める圢で行いたした。
怜蚌環境での玠振りからはじめ、数日のうちに本番の䞻芁なメトリクスのダッシュボヌドを䜜っおしたいたした。
その埌、これたで Datadog に觊れおきおいなかったメンバがキャッチアップする圢で利甚を進めおいたす。

障害察応時にメトリクスを芋ようず手癖で AWS のマネコンを開く゚ンゞニアもいたしたが、最近はたず Datadog を芋るこずが倚くなっおきたように思いたす。

Datadog ダッシュボヌドの䞀郚
Datadog ダッシュボヌドの䞀郚

この事䟋は同時に、IVRy は副業で関わっおいるメンバがすぐに倧きな䟡倀貢献をしおくれおいる事䟋でもありたす。
これたで十分に手が回っおいなかった郚分ややりたくおもやれおいなかった郚分でも、優秀な副業メンバが自身の経隓やノりハり、スキルによっおサクッず解決たで持っおいっおくれるなど、様々な堎所で良いコラボレヌションが起きおいるず思いたす。

ここたでのたずめ

IVRy のサヌビスレベルを向䞊させるために、2022幎7月にリリヌスした内容に぀いお、2点ご玹介したした。残りの3点に぀いおは、埌線でご玹介したす。
(远蚘: 埌線も公開したした)

この時点で少しでも IVRy に興味を持っおいただいた方、䞋蚘もご芧くださいIVRy は副業からでも倧歓迎です。

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

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

IVRyテックブログ

Discussion