Redisã¯å¤å½©ãªãã¼ã¿æ§é ããã¤1ã¤ã³ã¡ã¢ãªDBã§ãããæ¨ä»ã®Webã¢ããªã±ã¼ã·ã§ã³ã®ãã¼ã¿ã¹ãã¢ã®ä¸ã¤ã¨ãã¦ãåºãå©ç¨ããã¦ããã ãããã䏿¹ã§ãæ§è½æ¹åã®ããã®ææ³ãä½ç³»çã«ã¾ã¨ããè³æãè¦å½ãããªãã¨æãã¦ããã å®éãæåã«CPUè² è·ãåé¡ã«ãªã£ãã¨ãã«ã©ããããã®ãã¨æ©ã¿ã調æ»ã¨è©¦è¡é¯èª¤ãç¹°ãè¿ããã ããã§ããã®è¨äºã§ã¯ãèªåã®çµé¨ãåºã«ãRedisãµã¼ãã®CPUè² è·å¯¾çããCPUè² è·åæ¸ããã¹ã±ã¼ã«ã¢ããããã¹ã±ã¼ã«ã¢ã¦ããã«åé¡ãããã¿ã¼ã³ã¨ãã¦ã¾ã¨ããã
èæ¯
Redisã®ãã¼ãã¦ã§ã¢ãªã½ã¼ã¹ä½¿ç¨ã®è¦³ç¹ã§éè¦ãªãã¨ã¯ãRedisãµã¼ãã¯ã·ã³ã°ã«ã¹ã¬ããã§åä½ãã(å³å¯ã«ã¯ä»ã«ãã¹ã¬ãããããã¯ã¨ãªå¦çãããã¹ã¬ããã¯1ã¤)ãã¨ã¨ãRedisãµã¼ãä¸ã®ãã¼ã¿ãã¡ã¢ãªå®¹éãè¶ ãã¦ä¿æã§ããªããã¨ã ã åè ã«ã¤ãã¦ã¯ãã·ã³ã°ã«ã¹ã¬ããã§åä½ããã¨ãããã¨ã¯ããã«ãã³ã¢ã¹ã±ã¼ã«ããªãã¨ãããã¨ã§ãããç¹å®CPUã³ã¢ã®CPU使ç¨çãããã«ããã¯ã«ãªããããã å¾è ã«ã¤ãã¦ã¯ãRedisã¯ãã£ã¹ã¯ã«ãã¼ã¿ãæ°¸ç¶å2ã§ããã¨ã¯ãã£ã¦ããMySQLãPostgreSQLã®ãããªã¡ã¢ãªä¸ã®ãããã¡ãã¼ã«ã«ãã¼ã¿ããªããã°ããã£ã¹ã¯ä¸ã®ãã¼ã¿ãåç §ããã¨ãã£ãã¢ã¼ããã¯ãã£ã§ã¯ãªããããåºæ¬çã«å ¨ã¦ã®ãã¼ã¿ãã¡ã¢ãªå®¹é以ä¸ã«åããªããã°ãªããªãã
è¨å®ãã¯ã©ã¹ã¿æ§æã«ãã£ã¦ã¯ããã£ã¹ã¯I/Oããããã¯ã¼ã¯I/Oãããã«ããã¯ã¨ãªããã¨ãããã ä¾ãã°ãRedisã®ãã¼ã¿ã®æ°¸ç¶åæ¹å¼[^2]ã¨ãã¦RDBãå©ç¨ãã¦ããã¨ãRedisãµã¼ãã®ã¡ã¢ãªä½¿ç¨éã大ããã»ã©ããã£ã¹ã¯ã«ãã©ãã·ã¥ããã¿ã¤ãã³ã°ã§ããã£ã¹ã¯IOPSãæ¶è²»ããã ã¾ãããã¹ã¿ã¼ã»ã¹ã¬ã¼ãæ§æãã¨ãå ´åãã¹ã¬ã¼ãã®ãã¹ã¿ã¼ææ ¼æã®ååæå¦çã§ãããã¯ã¼ã¯å¸¯åã®ä½¿ç¨ããã¼ã¹ããããã¨ãããã ããã«ãRedisã¯ä½ã¬ã¤ãã³ã·ã§å¿çããããã1å°ãããã®ã¹ã«ã¼ããããé«ãããããããã¹ã1å°ãããã®ãããã¯ã¼ã¯å¸¯åã大ãããªããã¨ãããã
ãããã®ä¸ã§ããç¹ã«CPUå©ç¨çã¨æ¦ã£ã¦ããçµé¨ããããMackerelã¨ãããµã¼ãã¹ã§ã¯ã以ä¸ã®ããã«ããªããæ¯å¹´CPUå©ç¨çã¨æ¦ã£ã¦ããã



Redisã®CPUè² è·å¯¾çãã¿ã¼ã³
以ä¸ã®å³ã¯ãCPUè² è·å¯¾çãã¿ã¼ã³ãã«ãã´ãªãã¨ã«ã¾ã¨ãããã®ã«ãªãã
Redisã®CPUè² è·å¯¾çã®ã«ãã´ãªã¨ãã¦ãCPUè² è·åæ¸ãã¹ã±ã¼ã«ã¢ãããã¹ã±ã¼ã«ã¢ã¦ããããã CPUè² è·åæ¸ã¯ãRedisãµã¼ããå®è¡ããå¦çãã®ãã®ãæ¸ãããã¹ã±ã¼ã«ã¢ããã¯ãã¼ãã¦ã§ã¢æ§è½ãã®ãã®ãåä¸ãããã¹ã±ã¼ã«ã¢ã¦ãã¯è¤æ°ã®CPUã³ã¢ããµã¼ãã«å¦çã忣ãããã å®éã«ã¯ãåã«ãã´ãªã®å¯¾çãçµã¿åããããã¨ãå¤ãã ããã
CPUè² è·åæ¸
CPUè² è·åæ¸ã®ããã®ãã¯ããã¯ã¨ãã¦ããmultiã³ãã³ãããRedisãã¤ãã©ã¤ã³ããLuaã¹ã¯ãªããã£ã³ã°ããRedisã¢ã¸ã¥ã¼ã«ããããã
multiã³ãã³ã
MGETãMSETãMSETNXãªã©ã®è¤æ°ã®ãã¼ã«å¯¾ãã¦æä½ããã³ãã³ãã使ããã¨ã§ãä½åãªCPUå¦çãããã«ããã ããã¯ãmultiã³ãã³ãã使ããã«è¤æ°åã³ãã³ããçºè¡ãããã¨ã«æ¯ã¹ã¦ããªã¯ã¨ã¹ã/ã¬ã¹ãã³ã¹ã®å¾å¾©åæ°ãæ¸ããRedisãµã¼ãå´ã§ãªã¯ã¨ã¹ãåä¿¡ã¨ã¬ã¹ãã³ã¹éä¿¡ã®ããã®ãªã¼ããããã忏ã§ããããã ã
Redisãã¤ãã©ã¤ãã³ã°
Redisãã¤ãã©ã¤ãã³ã°3ã¯ãã¯ã©ã¤ã¢ã³ããã¬ã¹ãã³ã¹ãå¾ ããã«ãªã¯ã¨ã¹ããæå ¥ãã¤ã¥ãããã¨ã§ãã©ã¦ã³ãããªããã¿ã¤ã ã忏ããã ããã¥ã¡ã³ã[^4]ã«ã¯ãã©ã¦ã³ãããªããã¿ã¤ã ã ãã§ãªããRedisãµã¼ãä¸ã§ã®ãã¼ã¿ã«ã§ã®å¦çéã忏ã§ããã¨æ¸ããã¦ããã
ãã ããå ¨ã¦ã®ã³ãã³ãçºè¡ãã¿ã¼ã³ã«ããã¦ãã¤ãã©ã¤ãã³ã°ãæå¹ãªããã§ã¯ãªãã Read After Writeã¨Write after Readã®ãããªãã¬ã¹ãã³ã¹ã«å«ã¾ããçµæãå©ç¨ãã¦æ¬¡ã®ã³ãã³ããçºè¡ããå ´åã«ã¯ãã¬ã¹ãã³ã¹ãå¾ ããªããã¤ãã©ã¤ãã³ã°ã¯æå¹ã§ã¯ãªãã ãã¤ãã©ã¤ãã³ã°ã«ããã¦ãã¯ã©ã¤ã¢ã³ãå´ã®ã³ãã³ãå®è¡é åºã¯ä¿è¨¼ããããããWrite after Writeã®ãã¿ã¼ã³ã§ã¯æå¹ã ã Read After Writeã¨Write after Readã®ãã¿ã¼ã³ã§å¦çå¹çãåä¸ããããå ´åãå¾è¿°ããLuaã¹ã¯ãªããã£ã³ã°ã使ãã¨ããã
ä¸é¨ã®Redisã¯ã©ã¤ã¢ã³ãã¯ãpipelineã¨ããååãã¤ããã¤ã³ã¿ãã§ã¼ã¹ã§ãã£ã¦ããRedisãããã³ã«ã¬ãã«ã§ã®ãã¤ãã©ã¤ãã³ã°ã§ã¯ãªããã¨ãããã Redisãããã³ã«ã¬ãã«ã§ã®ãã¤ãã©ã¤ãã³ã°ãçã®Redisãã¤ãã©ã¤ãã³ã°ã¨ååã¨å¼ã³ãã£ã¦ããã çã®Redisãã¤ãã©ã¤ãã³ã°ãã©ããã¯ãtcpdumpã§ã³ãã³ãçºè¡ã®åº¦ã«åæçã«QUEUDå¿çãè¿ã£ã¦ãããã©ããã§ç¢ºèªã§ããã
ãã¤ãã©ã¤ãã³ã°èªä½ã¯ä¼çµ±çãªæè¡ã§ãããCPUããã»ããµã®å½ä»¤ãã¤ãã©ã¤ã³ãæåã ã ãããã¯ã¼ã¯ãããã³ã«ã®ä¸ã§ã¯ãä¾ãã°HTTPãã¤ãã©ã¤ã³4ããããRedisã®ããã¥ã¡ã³ã[^4]ã«ã¯ãå¤ãã®POP3å®è£ ã§ãã¤ãã©ã¤ãã³ã°ããµãã¼ããã¦ããã¨æ¸ããã¦ããã
Luaã¹ã¯ãªããã£ã³ã°
Luaã¹ã¯ãªããã£ã³ã°5ã¯ãRedisãµã¼ãã«å¯¾ãã¦Luaã³ã¼ããéãè¾¼ãã§å®è¡ã§ããæ©è½ã ã å ·ä½çã«ã¯ãã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãéã§ã³ãã³ãçºè¡ã¨å¿çãå¾å¾©ãããªããã°ä¸é£ã®å¦çããLuaã§è¨è¿°ãããã¨ã§Redisãµã¼ãä¸ã§å¦çãå®çµã§ããã
Redisãã¤ãã©ã¤ãã³ã°ã®ããã¥ã¡ã³ã[^4]ã®ãPipelining VS Scriptingãã®é ãèªãã¨ããã¤ãã©ã¤ãã³ã°ãå©ç¨ã§ãããããªå¤ãã®ã¦ã¼ã¹ã±ã¼ã¹ã«ããã¦ãããå¹ççã«å¦çãå®è¡ã§ããã¨æ¸ããã¦ããã ããã«ãRedisãã¤ãã©ã¤ãã³ã°ã§ã¯å¯¾å¿ã§ããªãã³ãã³ããã¿ã¼ã³ã«ããã¦ãã©ã¦ã³ãããªããã¿ã¤ã ãæ¹åã§ããã Luaã¹ã¯ãªããã£ã³ã°ã«ãããä¾ãã°ãHASHåã«å¯¾ããmultiã³ãã³ãã¯å®è£ ããã¦ãã¾ããããLuaã§è¤æ°ãã¼ã«å¯¾å¿ããHMSET(MHMSET)ã®ãããªå¦çããã颿°ãå®è£ ã§ããã
ããããLuaã³ã¼ãã®å¦çå 容ã«ãã£ã¦ã¯ããã¨ãã¨ã¯ã©ã¤ã¢ã³ãå´ã§è¨ç®ãã¦ããå¦çãRedisãµã¼ãå´ã§å®è¡ãããããRedisãµã¼ãã®CPUå©ç¨çãå¢å ããå¯è½æ§ãããã
Redisã¢ã¸ã¥ã¼ã«(夢)
ããã¾ã§ãRedisã®ãã¼ã¿æ§é ã¨ãã¦ä½¿ããã®ã¯ãLISTãSETãHSETãZSETãªã©ã®æ±ç¨ã®ãã¼ã¿æ§é ã ãã ã£ãã ããããRedis 4.0ããRedisã¢ã¸ã¥ã¼ã«6ã追å ãããç¬èªã®ã³ãã³ãã¨ãã¼ã¿æ§é ãCæ¡å¼µã«ãã追å ã§ããããã«ãªã£ãã ããã使ãã°ãã¢ããªã±ã¼ã·ã§ã³ã«æé©ãªã³ãã³ããå®è£ ãããã¨ã§ãCPUå©ç¨çã«éããããã®ä»ã®æ§è½ãå¤§å¹ ã«åä¸ããããã¨ãçå±ä¸ã¯å¯è½ã§ããã
èªåã§ã¯ä½¿ã£ããã¨ãä½ã£ããã¨ããªãããRedis Modules Hubã«ã¯æ¤ç´¢ã¨ã³ã¸ã³ãJSONãã©ã¼ãããããµãã¼ããããããªæ¡å¼µãå ¬éããã¦ããã
ã¹ã±ã¼ã«ã¢ãã
ã¹ã±ã¼ã«ã¢ããã¯ãCPUãã®ã¯ããã¯å¨æ³¢æ°ãé«ããã«å¤æ´ããããCPUã¢ã¼ããã¯ãã£ã®ä¸ä»£ãæ°ãããã®ã«ãããã¨ãã£ã鏿è¢ãããã çµé¨ä¸ãCPUã®ã¯ããã¯å¨æ³¢æ°ã«å¯¾ãã¦ã»ã¼ç·å½¢ã«Redisãµã¼ãã®CPU使ç¨çãå¤åããã
åè¿°ã®ããã«Redisãµã¼ãã¯ã·ã³ã°ã«ã¹ã¬ããã§åä½ãããããCPUã®ã³ã¢æ°ã大ãããã®ãé¸ãã§ãæå³ã¯ãã¾ããªãã ãã ãããã£ã¹ã¯ã®æ°¸ç¶åæ¹å¼ã«RDBã鏿ãã¦ããå ´åãRedisãµã¼ãããã»ã¹ããforkãããåããã»ã¹ããã¡ã¢ãªä¸ã®ãã¼ã¿ããã£ã¹ã¯ã«æ¸ãåºãå¦çãããã¯ã°ã©ã¦ã³ãã§å®è¡ãããããæä½ã§ã2ã³ã¢ã«ãã¦ããã¨å®å¿ã ã¨æãã
ãã ããEC2ãå©ç¨ããå ´åãEC2ã¤ã³ã¹ã¿ã³ã¹ã®CPUã³ã¢ã¯è«çã³ã¢ãªã®ã§ãRDBå©ç¨ã®å ´åã4ã³ã¢ã®ã¤ã³ã¹ã¿ã³ã¹ãé¸ã¶ãã¨ãããããã7 ç©çCPUã³ã¢æ°ã¯è«çã³ã¢æ°(vCPUæ°)ã2ã§å²ã£ãå¤ã«ãªãã ä¾ãã°ãc4.2xlargeã¯è¡¨è¨ä¸ã®ã³ã¢æ°ã¯8ã ããç©çã³ã¢æ°ã¯4ã¨ãªãã
ã¹ã±ã¼ã«ã¢ã¦ã
Redisã®ã¹ã±ã¼ã«ã¢ã¦ãã®ããã®ææ³ã¨ãã¦ããåç §ç¨ã¹ã¬ã¼ãããåç´åå²ãããæ°´å¹³åå²ãããRedis Clusterã«ããæ°´å¹³åå²ããããã ãåç §ç¨ã¹ã¬ã¼ãããåç´åå²ãããæ°´å¹³åå²ãã¯ãRedisã«éããMySQLãªã©ã®RDBMSã«ããã¦ããä¸è¬çãªã¹ã±ã¼ã«ã¢ã¦ãææ³ã¨ãã¦ç¥ããã¦ããã8 åç §ç¨ã¹ã¬ã¼ãã¯ååã®éããåç §ã¯ã¨ãªã®ã¿åæ£ã§ããã æ´æ°ã¯ã¨ãªã忣ãããªãã°ããåç´åå²ãã¾ãã¯ãæ°´å¹³åå²ããå¿ è¦ã«ãªãã åç´åå²ã¨æ°´å¹³åå²ã¯ãCPUè² è·ã®åæ£ä»¥å¤ã«ãã¡ã¢ãªä½¿ç¨ã®åæ£ã«ãå©ç¨ã§ããã
åç §ç¨ã¹ã¬ã¼ã
Redisã¯ã¬ããªã±ã¼ã·ã§ã³ã«ãããã¹ã¿ã¼ã»ã¹ã¬ã¼ãæ§æã®ã¯ã©ã¹ã¿ã使ã§ããã ã¯ã¦ãªã§ã¯ã主ã«ã¹ã¿ã³ãã¤ãµã¼ãã®ä½æã«å©ç¨ãã¦ãããKeepalivedã«ããVIPãã¼ã¹ã§åé·åãã¦ããã
ã¹ã¬ã¼ãã¯ä»ã«ãç¨éããããåç §ç¨ã¹ã¬ã¼ãã¯ãã¢ããªã±ã¼ã·ã§ã³ããåç §ã¯ã¨ãªãåããããã®ã¹ã¬ã¼ãã ã ã¹ã¬ã¼ãã«èªã¿è¾¼ã¿ã¯ã¨ãªãæãããã¨ã«ããããã¹ã¿ã¼ã®è² è·ãã¹ã¬ã¼ãã¸åæ£ã§ããã
以ä¸ã®å³ã®ããã«ãã¯ã©ã¤ã¢ã³ãããè¤æ°ã®ã¹ã¬ã¼ãã«åãã¦åç §ã¯ã¨ãªãæãã¾ããè¤æ°ã®ã¹ã¬ã¼ãã«åãã¦ãã¼ããã©ã³ã·ã³ã°ããããã®ææ®µã¯ããããããããTCPãã¼ããã©ã³ãµãæãããDNSã©ã¦ã³ãããã³ã«ãããã¼ããã©ã³ã·ã³ã°ãä¸è¬çã ã
|-------------------------------------| | |----> redis (slave) | | read | | | client ------|----> redis (slave) | | | | | | | |----> redis (slave) | | | | | |----------> redis (master) | | read/write | |-------------------------------------|
ä½ãèããã«ããã¹ã¦ã®åç §ã¯ã¨ãªãåç §ç¨ã¹ã¬ã¼ãã«åããã®ã¯å±éºã ã Redisã®ã¬ããªã±ã¼ã·ã§ã³ã¯åºæ¬çã«éåæã§ãããã¬ããªã±ã¼ã·ã§ã³é å»¶ããããããã¯ã©ã¤ã¢ã³ãããã¯çµææ´åæ§ããã¤ãã¼ã¿ã¹ãã¢ã¨ãã¦æ±ãå¿ è¦ãããã å ·ä½çã«ã¯ããã¹ã¿ã¼ã«ãã¼ã¿ãæ¸ãè¾¼ãã ã¨ãã«ã¹ã¬ã¼ãã«ãã¼ã¿ã転éããæ¸ãè¾¼ã¾ããã®ãå¾ ããã«ã¯ã©ã¤ã¢ã³ãã¸å¿çãè¿ãã ãããã£ã¦ãå¿çãã¯ã©ã¤ã¢ã³ãã¸è¿ã£ãå¾ã«ãæ¸ãè¾¼ãã ãã¼ã®åç §ãã¹ã¬ã¼ãã¸åãã¦ãã該å½ãã¼ã¿ãæ¸ãè¾¼ã¾ãã¦ããä¿è¨¼ããªãã åç §ç¨ã¹ã¬ã¼ãã使ãå ´åã¯ãã¢ããªã±ã¼ã·ã§ã³ãã¸ãã¯ããã¼ã¿ã®ä¸è²«æ§ãè¦æ±ããªããã®ãããã確èªãã¦ããå¿ è¦ãããã
åç´åå²
åç´åå²ã¯ããã¼ã¿ã®ç¨®é¡ãã¨ã«è¤æ°ã®Redisãµã¼ãã使ãåããææ³ã ã ä¸è¨ã®å³ã®ããã«ããã¼ã¿ã®ç¨®é¡AãBãCã«å¿ è¦ãªãã¼ã¿ãç°ãªãRedisãµã¼ãã«æ¸ãè¾¼ããã¨ã§ãåç §ã¨æ´æ°ã¯ã¨ãªãæ©è½ãã¨ã«åæ£ã§ããã
|------------------------------------| | |----> redis (種é¡A) | | | | | client ------|----> redis (種é¡B) | | | | | |----> redis (種é¡C) | |------------------------------------|
å¯ç¨æ§ã®ããã«ãåRedisãµã¼ãã¯åé·åããã¦ããå¿ è¦ãããã1ã¤ã®ã¯ã©ã¹ã¿ã§å¦çãæããããç¡é§ãªãµã¼ããå¢ããããã¨ãããã¡ãªãããããã ã¾ããç¹å®ç¨®é¡ã®ãã¼ã¿ã«å¯¾ããã¯ã¨ãªã®è² è·ã大é¨åãå ããå ´åããã®ç¨®é¡ã®ãã¼ã¿ãå¥ã®Redisãµã¼ãã«ç§»ãã¦ããçµå±åæ£å ã®Redisãµã¼ãã®CPUè² è·ãåé¡ã«ãªããã¨ãããã
æ°´å¹³åå²
æ°´å¹³åå²ã¯ãããç¹å®ã®ç¨®é¡ã®ãã¼ã¿ãã¬ã³ã¼ããã¨ã«åå²ããããããã®ã¬ã³ã¼ããå¥ã®Redisãã¼ãã¸é ç½®ããææ³ã ã æ°´å¹³åå²ã®ãã¨ãã·ã£ã¼ãã£ã³ã°ããã¼ãã£ã·ã§ãã³ã°ã¨å¼ã¶ãã¨ãããã
ã¬ã³ã¼ãåå²ã®ææ³ã¯æ§ã ã§ãããå¾è¿°ããRedis Clusterã®ãããªããã«ã¦ã§ã¢å´ã§åå²ããæ©æ§ããªããããã¯å©ç¨ããªãå ´åã¯ããã¼ã¿ã®æ§è³ªãå©ç¨ããã ä¾ãã°ãRedisã«ã¦ã¼ã¶IDã«ç´ä»ãããã¼ã¿ãæ ¼ç´ããã¨ãã¦ãã¦ã¼ã¶ã®IDããã¼ãæ°ã§å²ã£ãå°ä½ã®å¤ã«ãããé ç½®ãããã¼ãããããã³ã°ããã¨ãã£ãæ¹æ³ãããã ä¸è¨ã®å³ã¯ãã¼ãæ°ã3ã®å ´åã示ãã¦ããã ä»ã«ã¯ã¦ã¼ã¶åã®é æåãaã®å ´åã¯ãã¼ã1ãbã®å ´åã¯ãã¼ã2ã¨ãã£ãåå²ã®æ¹æ³ãããã
|------------------------------------------| | |----> redis (id % 3 == 0) | | | | | client ------|----> redis (id % 3 == 1) | | | | | |----> redis (id % 3 == 2) | |------------------------------------------|
æ°´å¹³åå²ã¯ãåç´åå²åæ§ã«ãCPUè² è·ã®åæ£ä»¥å¤ã«ãã¡ã¢ãªä½¿ç¨ã®åæ£ã«ãå©ç¨ã§ããã
ãã®ææ³ã®ãã¡ãªããã¨ãã¦ããã¼ãã®è² è·ã®åãã¨ããªã·ã£ã¼ãã£ã³ã°ã®å°é£ãã®2ã¤ãããã
ãã¼ãã®è² è·ã®åãã¯ãç¹å®ã®ã¦ã¼ã¶(ãããã¯ããã°IDãè¨äºIDãªã©)ã«é¢ããã³ãã³ãã¯å¿ ããããã³ã°å ã®ãã¼ãã«åãã¦çºè¡ããããããç¹å®ã®ã¦ã¼ã¶ã®æ´»åãéå¸¸ã«æ´»çºãªå ´åãè² è·ãç¹å®ã®ãã¼ãã«åã£ã¦ãã¾ãã¨ããåé¡ãããã
ãªã·ã£ã¼ãã£ã³ã°ã®å°é£ãã¯ããã¼ãæ°ã墿¸ããããªãã¬ã¼ã·ã§ã³(ãªã·ã£ã¼ãã£ã³ã°)ã«éå¸¸ã«æéãããããã¨ã ã ãããã³ã°ã®ææ³ã«ãããã¾ãããä¸è¨ã®ãããªå°ä½ãã¼ã¹ã§ãããã³ã°ãã¦ããã¨ããªã·ã£ã¼ãã£ã³ã°æã«æ¢åã®ãããã³ã°ã夿´ãããã æ¢åã®ãããã³ã°ã夿´ãããã¨ããã§ã«æ¸ãè¾¼ã¿æ¸ã¿ã®ãã¼ã¿ãæ°ãããããã³ã°å ã®ãã¼ãã«ç§»åããå¿ è¦ãããã æããã¤ã¼ããªæ¹æ³ã§ç§»åãããªããæ°æ§ã®ãããã³ã°ã§é ç½®ã夿´ãããã¬ã³ã¼ããæ½åºããæ°ãããã³ã°ã«ãããã£ã¦ãã¼ã¿ãç§»åãããããã¹ã¯ãªãããå®è¡ããã¨ãã£ãææ®µãããã ãããã¹ã¯ãªãããæµãæéã ããµã¼ãã¹åæ¢ã§ããã°ããããããããªã³ã©ã¤ã³ã§ãããã¨ããã¨å¤§å¤ã ã ä¾ãã°ãæ°æ§ã®ãããã³ã°ãæèããã¢ããªã±ã¼ã·ã§ã³ã«æ¹ä¿®ãã¤ã¤ãè£ã§æ°ãããã³ã°ã¸ã®ç§»åã¹ã¯ãªãããæµãã¨ãã£ãæ³¥èãéç¨ãå¾ ã£ã¦ããã
ããã«ããã¼ãã®è² è·ã®åããå¹³æ»åãã(ãªãã©ã³ã¹)ã¨ãªãã¨ããã«å°é£ãªãã¨ã«ãªãã ãã®ãªã·ã£ã¼ãã£ã³ã°ã¨ãªãã©ã³ã¹ã®é£ãããããã§ããã ãæ°´å¹³åå²ã鏿ããªãããã«ãã¦ããã
ããããRedisããã£ãã·ã¥ã¨ãã¦ç¨ããå ´åã¯ããªã·ã£ã¼ãã£ã³ã°ã¯ãããããç°¡åã«ãªãã ã¬ã³ã¼ãã«TTLãè¨å®ãã¦ããããããã³ã°ã夿´ãããå¾ã«ããã¨ããã£ãã·ã¥ãã¹ããã¨ãã¦ãããã£ãã·ã¥å ã®ãªãããã®ãã¼ã¿ã½ã¼ã¹ãããã¼ã¿ãå¼ãå®è£ ã«ãªã£ã¦ããã°ãã¢ããªã±ã¼ã·ã§ã³ã®åä½ã¨ãã¦ã¯åé¡ãªããTTLã«ãããæ§ãããã³ã°ã®ãã¼ã¿ããã£ã¨æ®ã£ã¦ããã¨ãããã¨ããªãã ãã£ãã·ã¥ãã¹ãã§ããã ãæãããå ´åã¯ãconsitent hashingã使ãã¨ããªã·ã£ã¼ãã£ã³ã°æã«ãããã³ã°ã®å¤æ´ãå°ãªãæããããã
Redis Clusterã«ããæ°´å¹³åå²
Redis Cluster9ã¯ãè¤æ°ã®Redisãµã¼ãã«å¯¾ãã¦ãã¼ã¿ããèªåã§ãæ°´å¹³åå²ããã åè¿°ã®æ°´å¹³åå²ã®å ´åã¯ãã¢ããªã±ã¼ã·ã§ã³éçºè ãã¬ã³ã¼ãã忣ããå¦çãæ¸ãããªã·ã£ã¼ãã£ã³ã°éç¨ãããªããã°ãªãã£ãã Redis Clusterã使ãã¨ãèªåã§ãã¼ã¨ãã¼ãã®ãããã³ã°ã使ãããã¢ããªã±ã¼ã·ã§ã³ããã®ã³ãã³ãã¯èªåã§åæ£ãããã ããã«ãredis-tribã¨ããRedisãæä¾ãã¦ãããªãã¬ã¼ã·ã§ã³ã¹ã¯ãªããã使ã£ã¦ãªã·ã£ã¼ãã£ã³ã°ã¨ãªãã©ã³ã¹ãã§ããã
ããããRedis Clusterã«ã¯databaseã¨è¤æ°ãã¼ã®ã³ãã³ãã®æ±ãã«å¶éãããã
ã¾ãdatabaseã«ã¤ãã¦ãè¤æ°ã®databaseã使ããªãå¶éããããdatabaseã¯Redisã®ãã¼ç©ºéãåããæ©è½ã§ããã¼ã®éè¤ãèããªãã¦ããããããã¼ã¿ã®ç¨®é¡ãã¨ã«databaseãåå²ããã¨ãã£ãä½¿ãæ¹ãããããã§ã«ã¢ããªã±ã¼ã·ã§ã³ãè¤æ°ã®databaseã使ã£ã¦ããå ´åãéä¸ããRedis Clusterã«ç§»è¡ããã«ã¯æéãçºçããã
次ã«è¤æ°ãã¼ã³ãã³ãã«ã¤ãã¦ãè¤æ°ãã¼ã«ã¾ãããã³ãã³ãã¯ãå
¨ã¦ã®ãã¼ãåããã¼ãä¸ã«ãªããã°ãªããªãã¨ããå¶ç´ãããã
ããã§ãhash tagsã使ãã¨ããã¼æååã®ä¸ã®é¨åæååã䏿¬å¼§ã§å²ããã¨ã§ãåãé¨åæååããã¤ãã¼ã§ããã°ãåããã¼ãã«ãããã³ã°ããããã«ãªãã
ãããã£ã¦ãhash tagsã«ããããã¼ã¨ãã¼ãã®ãããã³ã°ãããç¨åº¦éçºè
ãã³ã³ããã¼ã«ã§ããã
ãã¤ãã©ã¤ãã³ã°ãLuaã¹ã¯ãªããã£ã³ã°ã«ã¤ãã¦ããåºæ¬çã«æä½å¯¾è±¡ã®å
¨ã¦ã®ãã¼ãåããã¼ãä¸ã«ããå¿
è¦ãããã
ãã ããä¸é¨ã®ã¯ã©ã¤ã¢ã³ã10ã§ã¯ãåããã¼ãä¸ã«ãã¼ããªãã¦ããè¤æ°ã®ãã¼ãã«ã¯ã¨ãªãæãã¦ãã¼ã¸ããã¨ãã£ãå®è£
ãå
¥ã£ã¦ãããã¨ãããããã ã
ãããã®å¶éã«å ãã¦æ³¨æããç¹ã¯ãæ°´å¹³åå²ã®é ã§èª¬æãããã¼ãã®è² è·ã®åãããRedis Clusterã使ã£ãããã¨ãã£ã¦é²ããããã§ã¯ãªãã¨ãããã¨ã ã ã·ã¹ãã ã®ã¯ã¼ã¯ãã¼ãã«ãã£ã¦ãããã¢ã¯ã»ã¹ããããã¼ãåå¨ããã¨ãç¹å®ãã¼ãã¸è² è·ãåããã¨ã¯é¿ããããªãã ãã ããslotãå¥ã®ãã¼ãã¸ç§»åãããã³ãã³ãã«ãããè² è·ã®é«ãslotãç§»åããã¦ããã¥ã¢ã«ã§è² è·ã®åããããç¨åº¦åããã¨ã¯ä¸å¿å¯è½ã§ããã
ã¡ãªã¿ã«ãRedis Clusterã¯ãMackerelã®æç³»åãã¼ã¿ãã¼ã¹11ã§å©ç¨ãã¦ããã ã¾ã æå ¥ãã¦éããªããããéç¨ãã¦ãã¦ãç©ãã§ããã®ã¯ã¾ã ã¾ã ããããã¨ããã¨ããã«ãªãã
ãã®ä»
ä¸è¨ã«ãã´ãªã®ãããã«ã該å½ããªããã¥ã¼ãã³ã°ä¾ã¨ãã¦ãRPS12ã¨CPU Affinityã«ãããããã¯ã¼ã¯å²ãè¾¼ã¿è² è·ãRedisããã»ã¹ãå¦çããCPUã³ã¢ã¨ã¯å¥ã®ã³ã¢ã¸åæ£ãããã ãã®ææ³ã¯ãã¯ã¦ãªã®Linuxãããã¯ã¼ã¯ã¹ã¿ãã¯ããã©ã¼ãã³ã¹æ¹åäºä¾13ã®å¾åã§ç´¹ä»ãã¦ããã
ã¹ã©ã¤ãè³æ
ãã¨ãã
çºè¡¨ããå°ãæéã空ãã¦ãã¾ãã¾ãããããã®è¨äºã®å 容ã¯ãKyoto.ãªãã #3ã§ã®çºè¡¨ãå çä¿®æ£ãããã®ã«ãªãã¾ãã
ãããã®å
容ã¯ä¸äººã§ãã£ããã®ã§ã¯ãªããèªåã¯ä¸»ã«ã¢ã¼ããã¯ãã£ã使¦ãèããä¿ã§ãã¢ããªã±ã¼ã·ã§ã³ã®å®è£
ã¯ä¸»ã«ååã®
id:mechairoiããã¨
id:itchynyããã«ãããã®ã§ãã
çã®Redisãã¤ãã©ã¤ãã³ã°ã«ã¤ãã¦ã¯ãåããååã®
id:ichirin2501 ããã«æãã¦ãããã¾ããã
Redisã¯å¥½ããªããã«ã¦ã§ã¢ã§ã[^11]ã§ããä¸è©±ã«ãªã£ã¦ãã¾ãã ãªã³ãã£ã¹ã¯DBã¯ãRDBMSãªãMySQLãPostgreSQLã忣ãã¼ã¿ã¹ãã¢ãªãHBaseãCassandraãRiakãElasticsearchãªã©ãã¾ãã¾ãªé¸æè¢ãããã¾ãããã¤ã³ã¡ã¢ãªDBã¯ã¦ã§ãæ¥çã®ä¸ã§ã¯å®ç¸¾ã使ãããããèããã¨Redis以å¤ã®é¸æè¢ããã¾ãæãä»ãã¾ããã
ããããRedisãããã»ã©å©ç¨ããã¦ããã«ãããããããè°è«ã®åå°ã¨ãªãéç¨ãã¾ã¨ããè³æããªãã¨æãã¦ãã¾ãããããã¯ãåã«èªåãçºè¦ã§ãã¦ããªãã ãããããã¾ããã
以åãããWebã®æè¡ãèªåã®ä¸ã§ä½ç³»åãããã¨ã«èå³ããããéå»ã®è©¦ã¿ã«ã¯ 2015年Webサーバアーキテクチャ序論 - ゆううきブログãWebシステムにおけるデータベース接続アーキテクチャ概論 - ゆううきブログ
ã¨ãã£ãè¨äºãããã¾ãã
ããã§ãä»åã¯ãRedisã®CPUè² è·å¯¾çã«ã¤ãã¦ã¾ã¨ãã¾ã¦ã¿ã¾ãããã¡ã¢ãªããããã¯ã¼ã¯I/Oå
¨è¬ã«ã¤ãã¦æ¸ããã°ããã£ãã®ã§ãããã¾ã ç¥è¦ãåã°ãªãã¨ãããå¤ãã®ã§ã䏿¦CPUã®é¨åã®ã¿ã«ã¹ã³ã¼ããçµãã¾ããã
ã¨ããã§ãä»å¹´ã®ã¯ã¦ãªãµãã¼ã¤ã³ã¿ã¼ã³2017ã®å¤§è¦æ¨¡ã·ã¹ãã ã³ã¼ã¹ã§ã¯ãSerfã§ä½¿ããã¦ããGossipãããã³ã«ãã¼ã¹ã®èªå¾åæ£ç£è¦ããã°ã©ãDBã®Neo4jãç¨ãã忣ãã¬ã¼ã·ã³ã°ã¨ãã£ãã¨ã¦ããããããææãã§ã¦ãã¾ãã
