å æ¥ã®Kaigi on Railsä¸ã®éè«ã¨ã㦠@ima1zumi ãããããRDBã«å¯¾ãã¦ç§é1000ã³ããããããã§å¦çãè©°ã¾ã£ã¦ãå ´åã£ã¦ã©ãããã®ãè¯ãã®ããã¨ãã質åãåãã¾ãã¦ãéè«ã®ä¸ã§è²ã çãã¦ããã§ããããã£ããã ããè¨äºã«ã¾ã¨ãã¦ãããã¨æãã¾ãã ã¡ãã£ã¨ããKaigi Effectã£ã¦æãã§ããã
ä»åã®Kaigi on Railsã®ãã¼ã¯ã®ä¸ã§ã¯ã 数十億のレコードを持つ5年目サービスの設計と障害解決 by KNR - Kaigi on Rails 2023 ã®è©±ãªããã¯å²ã¨é¢é£ãããã¾ãããã¦ã¼ã¶ã¼ã®è¡åå±¥æ´ã¨ããã®ã¯ãã¦ã¼ã¶ã¼æ° * N * ã¿ã¤ã ã¹ãã³ã§å¢ãã¦ããã¬ã³ã¼ããªã®ã§ãæ¸ãè¾¼ã¿ã¨ãã¼ã¿éãççºããã¡ã§ãããã©ã³ã¶ã¯ã·ã§ã³ã§å ç¢ã«å¦çããªããã°ãããªãã±ã¼ã¹ãããã¾ã§å¤ããªãã®ã§ãRDBã ã¨æ¸ãè¾¼ã¿ã«å¯¾ããå¦çãéå°ãªã±ã¼ã¹ãå¤ããå®éã®ã¨ãããã®æã®ãã¼ã¿ã£ã¦ã¤ãã³ããã°ãªãã§ãããããã°åéã¨åæåºç¤ã§å¦çã§ããæ¹ãè¯ããã§ãããä»åã®pixivããã®è©±ã§ã¯å±¥æ´æ å ±ãæä¾æ©è½ã¨å¯æ¥ã«çµã³ã¤ãã¦ããã®ã§ããã®è¾ºãé£ããããªæãã§ãããã ãã®è¨äºã§ã¯ãã¨ããããæ©è½è¦æ±ã«ã¤ãã¦ã¯ç½®ãã¦ããã¦ããã®ãã¼ã¿éãæãã¦æ°¸ç¶çãªãã¼ã¿ã¹ãã¢ã«å ¥ããæã«ã©ãããèãæ¹ããã¦ããã®ããã¨ãããã¨ãæ¸ãã¦ããã¾ãã
ã¡ãªã¿ã«ãã¿ã¤ãã«ã«Railsã¨å ¥ã£ã¦ã¾ãããã¶ã£ã¡ããä½ãRailsèªä½ã¨ã¯é¢ä¿ãç¡ãã§ãw å¼·ãã¦è¨ãã°ããããæ¸ãã®ã¯Webæ¥çã®è©±ã ã¨ãããã¨ã§ããã¨ã³ãã©ã®ä¸çã ã£ããOracleã«ä½åãæãã¨ãããã¤ãã®é¸æè¢ãããã¾ãã
ãã¦ãã¾ã第ä¸ã«èãã¦ãããªããã°ãããªãã®ã¯ãæ¸ãè¾¼ã¿ãªã¯ã¨ã¹ãã«å¯¾ãã¦ã©ããããã®ã¬ã¤ãã³ã·ã§çµæãè¿ããªããã°ãããªãã®ããã¨ããç¹ã§ãã
æ¸ãè¾¼ã¿ãªã¯ã¨ã¹ãããçµæã®åæ ã¾ã§ä¸å®æéå¾ ã¦ãå ´å (ãã¤1000tpsãç¬éçãªãã¼ã¯ã®å ´å)
ããã§ãããªãã«å¾ ã¦ããªããéåæå¦çã«éããã¦æ¸ãè¾¼ã¿ãã¼ã¹ã調æ´ããã°åé¡ãªãã§ããããè¨ãæããã¨çµææ´åæ§ãåãã¦ããã°è¯ãå ´åã§ãã
ãã®å ´åã«ä½¿ããéå ·ã¨ãã¦ã¯ãAWSã®SQSãKinesisãRedisãªã©ã§ãã
æ¸ãè¾¼ã¿ãç¾çãªã®ã§ããã°SQSãå®å ¨ãã¤ã¹ã±ã¼ã«ãç°¡åãªã®ã§ãªã¹ã¹ã¡ã§ããSQSã¯åºæ¬çã«at least onceãªã®ã§ãç¨ã«åããã¥ã¼ãéè¤ãã¦åå¾ããã¦ãã¾ãå¯è½æ§ãããã¾ãã å®éã«èµ·ããã®ã¯ããªãç¨ã§ãããããã許容ã§ããªãå ´åã¯SQSã®FIFOãã¥ã¼ã使ãããRedisã§é å¼µãããSQSã¨Redisãçµã¿åããã¦ç¾å®çã«çºçããªãç¨åº¦ã«ç¢ºçãä¸ããããã¨ããçãåãã¾ãã
Redisãæ´»ç¨ããå ´åã¯ãRailsã®ä¸çã§ä¸çªæ¥½ãªã®ã¯sidekiq-proã使ã£ã¦ã¯ã¼ã«ã¼ã®æ°ã§æ¸ãè¾¼ã¿ãã¼ã¹ã調æ´ããã¨ããå½¢ãã¨æãã¾ããproãããªãã¨é§ç®ãªã®ã¯ãé常ã®sidekiqã ã¨ã¸ã§ããã¹ãã®å¯è½æ§ãç¡è¦ã§ããªãã®ã§ãå®å ¨ã«æ§æã§ããªãããã§ãã
追è¨: ã¡ãã£ã¨èª¤è§£ãæãããã ãªã¨æã£ãã®ã§è¿½è¨ãã¦ããã¾ããããã¯å¸¸ã«sidekiq-proã使ãã¹ãã¨ãã話ã§ã¯ããã¾ãããéåæå¦çã®ããããã¦ã¼ã¹ã±ã¼ã¹ã®ä¸ã¤ã¨ãã¦å®äºéç¥ãªã©ãæãããã¾ããããããã£ãä¾ã§ã¯ç¨ã«ã¸ã§ãããã¹ãããã¨ãã¦ãè´å½çãªåé¡ã«ãªããªãã®ã§ããã¾ã§æ°ã使ããªãã¦ããå ´åãããã¾ããä¸è¨ã®ä¾ã§ã¯ã¾ãRDBã«æ¸ãã¦å®å ¨ãªè¨é²ãæ®ãæåã®é¨åã§sidekiqã使ã£ã¦ããã®ã§ãæ» å¤ã«ç¡ããã¨ã§ãã¸ã§ããã¹ãããããã¼ã¿ã®ä¸æ´åãæ¶å¤±ã«ç¹ããã¾ãããããã£ãä¸ãä¸ã®ã¸ã§ããã¹ããé¿ãããå ´åã¯proã使ã£ãæ¹ãããã¨ããæãã§ããã
ã¡ãªã¿ã«ãKinesisã¯åç´ãªãã¥ã¼ã§ã¯ãªãã¦Kafkaãªã©ã«è¿ãã®ã§ãè¤æ°ã®ãµã¼ãã¹ã§ãã®ãã¼ã¿ãå¿ è¦ã¨ãã§ãªãéãã¯é¸æã®åªå é ä½ã¯é«ãããã¾ãããSQSããé¥ãã«æ±ãã®ãé£ãããµã¼ãã¹ã§ãã
æ¸ãè¾¼ã¿ãªã¯ã¨ã¹ãããåæå¦çã§çµæãåæ ããªããã°ãªããªãå ´åããããã¯å®å¸¸çã«1000tps以ä¸ãå¿ è¦ãªå ´å
åé¡ãªã®ã¯ãã®ã±ã¼ã¹ã§ãããã«ã¤ãã¦ã¯ããæå³é常ã«åç´ãª3ã¤ã®éãé¸ã¶ãã¨ã«ãªãã¾ãã
ææãç©ãããRDBãåå²ããããRDB以å¤ã®ãã®ã«æ¸ãè¾¼ããã
ææãç©ã
ã¯ã¼ã¯ãã¼ãã«ä¾ãã¾ãããAuroraã«éãç©ãã°ç§é1000ã³ããããããã¯æ®éã«å¦çã§ãã¾ãããã£ãè·å ´ã®RDSã®ã¡ããªãã¯ãè¦ã¦ã¿ã¾ãããç§é1000ã1500ã³ããããããã¯1ã¤ã³ã¹ã¿ã³ã¹ã§æ®éã«å¦çã§ãã¦ãã¦ãã¾ã ä½è£ãããæãã§ããã¤ã³ã¹ã¿ã³ã¹ãµã¤ãºã¯r6g.16xlargeã§ããããã¯Gravitonã®æ大ãµã¤ãºã§ãããr6iãªã32xlargeã¾ã§ææãç©ããã®ã§ãæ¬å½ã«ã®ãªã®ãªã¾ã§å¼ã£å¼µãã°ç§é4000ã³ããããããã¾ã§ãªãæ®éã«å¦çã§ããå¯è½æ§ãé«ãã§ãã Kaigi on Railsä¸ã®éè«ã§ã¯ãAuroraã§ä½ã¨ããªããå¾®å¦ãªã©ã¤ã³ãããªã¼ã¨çãã¦ãã¾ãã¾ããããæ¹ãã¦å¼ç¤¾ã®æ§åãè¦ãåã«ã¯ãã£ã½ã©1ã³ããããéããªãéãã¯ååãéã§å¯¾å¦å¯è½ã ã¨æãã¾ããããã1ã³ãããã§å½±é¿ããã¬ã³ã¼ããå¤ããããã¯ç«¶åãããã¿ã¼ã³ãå¤ãããã©ã³ã¶ã¯ã·ã§ã³ã«ãããisolationã«ä¾åããèªã¿è¾¼ã¿ãé常ã«å¤ããã¨ãã£ãã±ã¼ã¹ã ã¨ãAuroraã«ãéãç©ãã ãã§ã¯ç¡çãªå¯è½æ§ã¯ããã¾ãã
RDBãåå²ãã
ã¯ã¼ã¯ãã¼ãã«åããã¦å©ç¨ããDBãã¢ããªã±ã¼ã·ã§ã³å´ã§åãæ¿ããããæ¹ã§ããã²ã¼ã ç³»ã§ã¯æããããèãæ¹æ³ã§ãããããã¯åºæ¬çã«è¨ã®éã§ãããã¯ã¼ã¯ãã¼ãã®ãã¿ã¼ã³ã«ãã£ã¦åç´åå²ã¨æ°´å¹³åå²ã®ããæ¹ãããã¾ããç¾å¨ã®Railsã¯multi DB対å¿ãçµè¾¼ã¾ãã¦ããã®ã§ãæã«æ¯ã¹ãã°æ¬ä½ã®ã¡ã³ããã³ã¹ã«ä¹ããã¨ãã§ããåããæããªã£ãã¨ã¯è¨ãã¾ãã ããããããã§ãè¤æ°DBã¯æ¬å½ã«å¿ è¦ã«ãªãã¾ã§ã¯åé¿ãããé¸æã§ããããæ¹ä¿®è¦æ±ã®çµæè¤æ°DBã«è·¨ããã©ã³ã¶ã¯ã·ã§ã³ãã¸ã§ã¤ã³ãæ±ããããå ´åã¯å³ç ´ç¶»ãã¾ãããã¢ããªã±ã¼ã·ã§ã³å´ã§ãããä¸æããã¨åé¿ããæ§ã«å®è£ ãã¦ãé«ç¢ºçã§ãã°ããéããããªãã§ããããå¾ãããã¼ã¿ä¸æ´åãçºè¦ããå ´åã®ä¿®æ£ã³ã¹ãã¯å¤§æµã®å ´åãé常ã«é«ãä»ãã¾ããå ãã¦ãå¾ããåå²æ°ãå¢ããã®ãã¨ã¦ã大å¤ã ã¨ããè½ã¨ãç©´ãããã¾ãã ããæ¬å½ã«å¿ è¦ã«ãªã£ãã®ãªãããã¡ã¤ã³ã¢ãã«ã¨ãã£ããåãåãã¾ããããå°æ¥ã®ã¢ããªã±ã¼ã·ã§ã³ã®æé·ã¾ã§å å³ãã¦æ éã«ã¢ãã«ã®åºåããè¡ãå¿ è¦ãããã¾ããã¨ãããããã®è¾ºãã¯å®è³ªçã«ãã¤ã¯ããµã¼ãã¹åã¨åãèãæ¹ã«ãªãã¨æãã¾ãã
RDB以å¤ã®ãã®ã«æ¸ã
ããã¯æ¬å½ã®æã¯ãã©ã³ã¶ã¯ã·ã§ã³ãå¿ è¦ç¡ãå ´åã«æ¡ç¨å¯è½ã§ãããã®å ´åã¯å種åæ£ãã¼ã¿ã¹ãã¢ã®å°å ¥ãæ¤è¨ãããã¨ã«ãªãã¾ããå¼ç¤¾ã§ã¯KafkaãCassandraãå©ç¨ãã¦ããç®æãããã¾ãããã¬ããªã«æ¸ãè¾¼ã¿ãå«ãã¦ç§é100ä¸ä»¶ãããã®æ¸ãè¾¼ã¿ãçºçãã¦ãã¾ããä¾ãã°Cassandraã¯èªã¿è¾¼ã¿ãããæ¸ãè¾¼ã¿ã®æ¹ãã¹ã±ã¼ã«ãããããä½ãã«ãªã£ã¦ãã¦ãã¯ã©ã¹ã¿ã®å°æ°ãå¢ããã°ãããããã®æ¸ãè¾¼ã¿ãã¼ã¹ã¯æ®éã«æããã¨ãã§ãã¾ããå¼ç¤¾ã§ã¯ãããªãã«ã¡ã¢ãªã¨ã¹ãã¬ã¼ã¸ãç©ãã 20å°ãããã§æ¸ãã§ã¾ããå½ç¶ãè¤æ°å°ã®ã¯ã©ã¹ã¿ã管çããã³ã¹ããå¢ããããæ°ããããã«ã¦ã§ã¢ã®ç¥èãããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ãå¿ è¦ã ããè¤æ°DBã¨å®è³ªçã«åãåé¡ãæ±ãããã¨ã«ãªãã®ã§ãéçºæ¥åã«ä¸ããè² è·ã¯é常ã«é«ãé¸æè¢ã§ããããããæ±ããããæ¸ãè¾¼ã¿éã®æ¡ã2æ¡ã¨ã3æ¡ã¨ãä¸ãã£ã¦ãã¾ãã¨ãRDBã«æ¸ãã¨ããæ段ã§ã¯ã©ãã«ããªããªããªãã®ã§ãããããå¾ãªãã¨ããæãã§ããããã®åéã§ä»ã«ä½¿ããããªããã«ã¦ã§ã¢/ãµã¼ãã¹ã¯ãScyllaDBãDynamoDBãBigTable辺ãã§ãããããã¡ã¢ãªãã£ãã·ã¥ã«è¿ãæ¹åãªãHazelcastã¨ãIgniteã¨ãAerospikeã¿ãããªã®ãããã¾ãã
ã©ããã¦ããã©ã³ã¶ã¯ã·ã§ã³ãå¿ è¦ã ãæ¸ãè¾¼ã¿ä»¶æ°ãç§éæ°ä¸ä»¶ãè¶ããã¨ããé常ã«ãã¼ããªç¾å ´ã ã£ãå ´åãSpannerãCockroachDBãTiDBãªã©ã®åæ£SQLãã¼ã¿ã¼ãã¼ã¹ã®æ¡ç¨ãæ¤è¨ãããã¨ã«ãªããã¨æãã¾ããä¾ãã°CockroachDBã¯ãã«ããªã¼ã¸ã§ã³æ§æãå¯è½ãªã°ãã¼ãã«ã¹ã±ã¼ã«ã®ãµã¼ãã¹å±éãæ³å®ãããã¼ã¿ãã¼ã¹ã§ãPostgreSQLã®ãããã³ã«ã¨äºææ§ãããã¾ããã¤ã¾ãRailsãããªãpgãã©ã¤ãã§æ¥ç¶å¯è½ã¨ãã訳ã§ããã ãã®è¾ºãã®é¸æè¢ã¯ãã¨ã«ããæè¡èª¿æ»åãå¿ è¦ã§ããæ¥çå ¨ä½ãè¦ã¦ããããã¾ã§ã®ã¹ã±ã¼ã©ããªãã£ãæ±ããããOLTPã¨ããã®ã¯ããå¤ããªãã®ã§ãç¥è¦ãå ¨ç¶è¦ã¤ãããªãã¨ããã®ã¯ã¶ã©ã§ããèªåã§ã¢ã¼ããã¯ãã£ãã¡ããã¨ç解ããçã£ãããã©ã¼ãã³ã¹ãåºãæ§ã«ãã¥ã¼ãã³ã°ã¨å®é¨ãããéç¨ã©ã¤ã³ãæ´ããå¿ è¦ãããã§ãããããéã®åãããã°ãã¨ã³ã¿ã¼ãã©ã¤ãºãµãã¼ãã«é ¼ããã¨ã§éçºè² è·ãä¸ãããã¨ã¯ã§ããã¨æãã¾ãã
ç¾å®çã«ã©ãããã®ã
ãã£ã¨ã¾ã¨ãããã¦ãããã¾ããããçã®æå³ã§ãªã³ã©ã¤ã³ãã©ã³ã¶ã¯ã·ã§ã³ãå¿ è¦ãªã®ãã©ããã§ã大éã®ã¢ã¯ã»ã¹ãæãé£æ度ã¯å¤§ããå¤ããã¾ããä¸çªç¾å®çãªã®ã¯ãæ¬å½ã«ããã§ã¦ã¼ã¶ã¼ãå¾ ããã¦ã¯ãããªãã®ãï¼ãã¨ãã話ãã¡ããã¨ãããã¨ã§ãã5åå¾ ããã¦è¯ããã ã£ããå ¨ç¶é£æ度ãéã£ã¦ãã¾ã(éåæå¦çåã¯å¥ã®è¤éãã«ç¹ããå¯è½æ§ã¯ããã¾ãã)ã ããã¾ã§èªåã®æè¦ã§ããã大éã®ã¢ã¯ã»ã¹ããã£ã¦æ¬å½ã«ãªã³ã©ã¤ã³ãã©ã³ã¶ã¯ã·ã§ã³ãè¦ãã±ã¼ã¹ã¯ããã¾ã§å¤ããªãã¨æã£ã¦ãã¾ããç¾å®çãªéçºã«åããã¦ä»æ§ãã³ã³ããã¼ã«ããã®ãéè¦ãªä»äºã§ãã
ããã¦ã顧客価å¤ã®ããã«ã©ããã¦ããªã³ã©ã¤ã³ãã©ã³ã¶ã¯ã·ã§ã³ãè¦ãã¨ãªã£ãããã¾ãã¯AWSãGoogleã«éãç©ã¿ã¾ããããåããæããã£ãã·ã¥ãæ¸ã£ã¦ãã¾ãã¾ãããå®éã¯ãããä¸çªå®ãã¤ãã¾ãããã¨ã«ããããã«å¯¾å¿å¯è½ã§ãã
æ®ãã®æ段ã§ããRDBã®åå²ãåæ£DBã®æ¡ç¨ã¯ãã¶ã£ã¡ããåå¥ã®å°çã«ããããé å¼µã£ã¦å¯¾å¦ãããããªããã§ããããæ°åå ¥ãã¦èª¿æ»ãã¦å®é¨ãã¦è¨æ¸¬ãã¦ãã¥ã¼ãã³ã°ãã¦ç¤¾å åãã®ããã¥ã¡ã³ããåå¼·ä¼ãæºåãã¦ãã¨ããç¸å¿ã«æéã¨ã³ã¹ãããããã®ã§ããã©ãã£ãã¯ã追ãä»ããªãå ã«æ¬¡ã®ä¸æãæã¦ãæ§ã«æºåãã¾ããããå®éãRDBã§ã¯è²ã ãªæå³ã§ã³ã¹ããåããªããªãæã¨ããã®ã¯ãã°ãã°ãã£ã¦ãã¾ããããããæã®ããã®é¸æè¢ã常ã«èª¿æ»ãã¦ãæé ãã«ãªãåã«å¯¾å¦ãããã¨ã大äºã§ããã¾ãããããã§ããã°è¦å´ããªãã¨ãããã¤ã§ããâ¦â¦ã
ã¡ãªã¿ã«ãReproæ ªå¼ä¼ç¤¾ã§ã¯ããããã£ããã¨ã«èå³ãããã¨ã³ã¸ãã¢ãåéãã¦ããã¾ããã¡ãã£ã¨ãã¼ããªãã©ãã£ãã¯ãæ±ãçµé¨ãç©ã¿ããã¨ããæ¹ã¯ãã«ã¸ã¥ã¢ã«é¢è«ããã§ãè¯ãã®ã§æ¯éãå¿åãã ããã(ç¾è·ã®ãã¨ãæ¸ãã¦ãã®ã§ãä¸å¿ãã£ã¨ããã¨â¦â¦)