IVRyã®SREã®åãçµã¿ 2022å€(åç·š)
ããã«ã¡ã¯ãIVRy ã®ãšã³ãžãã¢ã® yuri ( @yuri_ivry ) ã§ãã
IVRy ã§ã¯ç®ã«èŠããæ©èœéçºã®ä»ã«ãããµãŒãã¹ã¬ãã«ãé«ãã¯ã©ã€ã¢ã³ãã«æäŸããã·ã¹ãã ãå®å®çšŒåãç¶ããããšãç®æããŠãæ§ã ãªã·ã¹ãã æ¹å(Site Reliability Engineering, SRE)ãæ¥ã 宿œããŠããŸãã
ä»åã¯ã2022幎7æã« IVRy ã®éçºããŒã ããªãªãŒã¹ãã SRE çãªåãçµã¿ã®äžãã5ã€ã»ã©ãååŸç·šã«ãããŠã玹ä»ããŸãã
â» æ¬èšäºã®æ³å®èªè ã¯ãããªãã¯ã¯ã©ãŠãäžã§ Web ãµãŒãã¹ãæäŸãããšã³ãžãã¢ã§ãã
(远èš: åŸç·šãå ¬éããŸãã)
èæ¯
IVRy ã®å°å ¥ã¯ã©ã€ã¢ã³ãæ°ãç¶ç¶çã«å¢ããŠããããšããã¯ãªããã¯ãªã©ããã€ãã®æ¥çš®ã«ãããçä¿¡æ°ã®æ¥å¢å ã«äŒŽããIVRy ã®ã·ã¹ãã è² è·ãå¢å€§ãèšå®ç»é¢ã®ãã°ã€ã³ã衚瀺çã«æéããããã±ãŒã¹ãå¢ããŠããŸããã
IVRy ã®æé·ã¯ãšãŠãå¬ãããã®ã§ãããããã«ããã·ã¹ãã è² è·ã«ãã£ãŠã¯ã©ã€ã¢ã³ãã«ãè¿·æããããããŠããŸãã·ãŒã³ãæ¥µåæžããããããããã€ãã®ã·ã¹ãã æ¹åã宿œããŸããã
<äœè«>
æ¥æ¬ã«ãããæ°åã³ãããŠã£ã«ã¹ã®ç¬¬7æ³¢ã®æ¡å€§ãšé£åãã圢ã§çä¿¡æ°ãççºããŠããã¯ã©ã€ã¢ã³ãã倿°èŠåããããIVRy ã®äžã®äººãšããŠæ¹ããŠãé»è©±ãšããã³ãã¥ãã±ãŒã·ã§ã³ããŒã«ã®ç€ŸäŒã€ã³ãã©ãšããŠã®ååšæã®å€§ãããæããŠããŸãã
é話äŒé¡ã
ãåæžã
<åç·š(ãã®èšäºã§ã)>
- éããã¯ãšãªãç¹å®ããindex ã貌ã
- ç£èŠã¢ãã¿ãªã³ã°ã®æŽå
<åŸç·š>
- DBã®ãªãŒãã¬ããªã«ã®å°å ¥
- ãã£ãã·ãã£ãã©ã³ãã³ã°
- ã³ã¢æ©èœã®åé¢
ãã®1: éããã¯ãšãªãç¹å®ãã index ã貌ã
ãŸãã¯è¶ åºç€çãªå¯Ÿå¿ããæãä»ããŸããã
èæ¯
ç¹å®ã®ããŒãžã®è¡šç€ºãéãããªã£ãŠããããšã«é¢ããŠãã¯ã©ã€ã¢ã³ããããåãåããããã ãããšããããŸããã

ã¯ã©ã€ã¢ã³ãããããã ãããåãåããã瀟å
ã§å
±æããæ§å
調æ»ãšåå
該åœã®ããŒãžã§åŒã³åºããŠãã API ã®åŠçå ã§çºè¡ããŠãã SQL ã®ããã©ãŒãã³ã¹ãæªããªã£ãŠããŸããã
æ ¹æ¬çãªåå ãšããŠã¯ã·ã³ãã«ã§ãæ€çŽ¢ã§åç
§ããŠããããŒãã«ã®ã«ã©ã ã« index ã貌ãããŠããŸããã§ããw
IVRy ã®ã»ãšãã©ã®æ©èœã§ã¯ã¯ãšãªã®ããã©ãŒãã³ã¹ã«ãæ°ãã€ããå®è£
ããããŠããŸããããã®ç®æã«ãããŠã¯å°ãè€éãªã¯ãšãªã«ãªã£ãŠããããšããããããŒã¿éãäžå®ãè¶
ããã¿ã€ãã³ã°ããããã©ãŒãã³ã¹èª²é¡ãé¡åšåããŸããã

EXPLAIN ANALYZE ã«ããåœæã®å®è¡èšç»
IVRy ã§ã¯ RDB ãšã㊠Amazon RDS for PostgreSQL ãå©çšããŠããŸãã
çè
å人ãšããŠã¯ãããã¯ã·ã§ã³ã¬ãã«ã§ PostgreSQL ãå©çšããçµéšãä¹ãããPostgreSQL ã®ã¯ãšãªããã©ãŒãã³ã¹ã®åæã«ã€ããŠäžèšã®èšäºã倧ãã«åèã«ãããŠããã ããŸããã
察å¿
察å¿ãšããŠã¯ã·ã³ãã«ã« 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 ããã·ã¥ããŒãã®äžéš
ãã®äºäŸã¯åæã«ãIVRy ã¯å¯æ¥ã§é¢ãã£ãŠããã¡ã³ããããã«å€§ããªäŸ¡å€è²¢ç®ãããŠãããŠããäºäŸã§ããããŸãã
ãããŸã§ååã«æãåã£ãŠããªãã£ãéšåããããããŠããããŠããªãã£ãéšåã§ããåªç§ãªå¯æ¥ã¡ã³ããèªèº«ã®çµéšãããŠããŠãã¹ãã«ã«ãã£ãŠãµã¯ããšè§£æ±ºãŸã§æã£ãŠãã£ãŠããããªã©ãæ§ã
ãªå Žæã§è¯ãã³ã©ãã¬ãŒã·ã§ã³ãèµ·ããŠãããšæããŸãã
ãããŸã§ã®ãŸãšã
IVRy ã®ãµãŒãã¹ã¬ãã«ãåäžãããããã«ã2022幎7æã«ãªãªãŒã¹ããå
容ã«ã€ããŠã2ç¹ã玹ä»ããŸãããæ®ãã®3ç¹ã«ã€ããŠã¯ãåŸç·šã§ã玹ä»ããŸãã
(远èš: åŸç·šãå
¬éããŸãã)
ãã®æç¹ã§å°ãã§ã IVRy ã«èå³ãæã£ãŠããã ããæ¹ãäžèšãã芧ãã ããïŒIVRy ã¯å¯æ¥ããã§ã倧æè¿ã§ãã
Discussion