ãããããã«ïŒ
ä»æ¥ã¯ãRedis ã䜿çšããåæ£ããã¯ã®å®è£
ã«é¢ããè€éãªèšäºã®ç¿»èš³ã玹ä»ãããããã¯ãšã㊠Redis ã®å±æã«ã€ããŠè©±ãåãããšããå§ãããŸãã æžç±ããã®èè
ã§ããããŒãã£ã³ã»ã¯ã¬ãããã³ã«ããåé¡ã®ã¬ããããã¯ã¢ã«ãŽãªãºã ã®åæ
åæ£ããã¯ã¯ãããŸããŸãªããã»ã¹ãå ±æãªãœãŒã¹ã«å¯ŸããŠçžäºæä»çãªæ¹æ³ã§åäœããå¿ èŠãããå€ãã®ç°å¢ã§äœ¿çšãããéåžžã«äŸ¿å©ãªããªããã£ãã§ãã
Redis ã䜿çšã㊠DLM (åæ£ãã㯠ãããŒãžã£ãŒ) ãå®è£ ããæ¹æ³ã説æããã©ã€ãã©ãªãæçš¿ã¯æ°å€ããããŸãããåã©ã€ãã©ãªã¯ç°ãªãã¢ãããŒããæ¡çšããŠãããããããæäŸããä¿èšŒã¯ãããå°ãæŽç·Žãããèšèšã§éæã§ãããã®ãšæ¯èŒãããšéåžžã«åŒ±ããã®ã§ãã
ãã®èšäºã§ã¯ãRedis ã䜿çšããŠåæ£ããã¯ãå®è£ ããæ¹æ³ã瀺ãæ¡ä»¶ä»ãæ£èŠã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŸãã ãšåŒã°ããã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŸã ã¬ããããã¯ãåæ£ãã㯠ãããŒãžã£ãŒãå®è£ ããŠãããç§ãã¡ã®æèŠã§ã¯ããã®ã¢ã«ãŽãªãºã ã¯éåžžã®åäžã€ã³ã¹ã¿ã³ã¹ã®ã¢ãããŒããããå®å šã§ãã ã³ãã¥ããã£ããããåæãããã£ãŒãããã¯ãæäŸããããè€éãªãããžã§ã¯ãã代æ¿ãããžã§ã¯ãã®åºçºç¹ãšããŠäœ¿çšããŠãããããšãé¡ã£ãŠããŸãã
å®è£
ã¢ã«ãŽãªãºã ã®èª¬æã«é²ãåã«ãæ¢è£œã®å®è£ ãžã®ãªã³ã¯ãããã€ãæäŸããŸãã åç §ãšããŠäœ¿çšã§ããŸãã
ã¬ããããã¯RB (Ruby çšã®å®è£ )ã ããããŸããã©ãŒã¯ Redlock-rb ã¯ãé åžã容æã«ããã ãã§ãªããé åžã容æã«ããããã®ããã±ãŒãž (gem) ãè¿œå ããŸããã¬ããããã¯ã〠(Python å®è£ )ãã¢ã€ãªã¬ããã㯠(Asyncio Python ã®å®è£ )ãRedlock-php (PHP çšã®å®è£ )ãPHPRedisMutex (PHP ã®å¥ã®å®è£ )ãã§ãã©ãœã/php-redis-lock (ããã¯çšã®PHPã©ã€ãã©ãª)ã¬ããã·ã³ã¯ (Go ã®å®è£ )ãã¬ãã£ãœã³ (Java ã®å®è£ )ãRedis::DistLock (Perl ã®å®è£ )ãã¬ããããã¯-cpp (C++ ã®å®è£ )ãã¬ããããã¯-CS (C#/.NET çšã®å®è£ )ãã¬ããããã¯ããã (C#/.NET çšã®å®è£ )ã éåæããã³ããã¯æ¡åŒµæ©èœã®ãµããŒããã¹ã«ãŒã¬ãããã㯠(æ§æå¯èœãªããŒã¿ ã¹ãã¢ãåãã C# .NET ã®å®è£ )ã¬ããããã¯4ããã (C# .NET çšã®å®è£ )ããŒãã¬ãããã㯠(NodeJS ã®å®è£ )ã ããã¯ãæ¡åŒµããããã®ãµããŒããå«ãŸããŠããŸãã
ã»ãã¥ãªãã£ãšå¯çšæ§ã®ä¿èšŒ
åæ£ããã¯ãå¹æçã«äœ¿çšããããã«å¿ èŠãªæäœéã®ä¿èšŒãæäŸãããšæããã XNUMX ã€ã®ããããã£ã ãã䜿çšããŠèšèšãã¢ãã«åããŸãã
- ã»ãã¥ãªã㣠ããããã£: çžäºæä»ã åžžã« XNUMX ã€ã®ã¯ã©ã€ã¢ã³ãã ããããã¯ãä¿æã§ããŸãã
- å¯çšæ§ãããã㣠A: ãããããã¯ã¯ãããŸããã ãªãœãŒã¹ãããã¯ããã¯ã©ã€ã¢ã³ãã«é害ãçºçããããå¥ã®ãã£ã¹ã¯ ã»ã°ã¡ã³ãã«å°éãããããå Žåã§ããæçµçã«ããã¯ãååŸããããšã¯åžžã«å¯èœã§ãã
- å¯çšæ§ãããã㣠B: ãã©ãŒã«ã ãã¬ã©ã³ã¹ã 倧éšåã® Redis ããŒããå®è¡ãããŠããéããã¯ã©ã€ã¢ã³ãã¯ããã¯ãååŸããã³è§£æŸã§ããŸãã
ãã®å Žåãé害å埩ã«åºã¥ããå®è£
ã§ã¯äžååãªçç±
äœãæ¹åããããšããŠããã®ããç解ããããã«ãRedis ã«åºã¥ãã»ãšãã©ã®åæ£ãã㯠ã©ã€ãã©ãªã®çŸç¶ãåæããŠã¿ãŸãããã
Redis ã䜿çšããŠãªãœãŒã¹ãããã¯ããæãç°¡åãªæ¹æ³ã¯ãã€ã³ã¹ã¿ã³ã¹ã«ããŒãäœæããããšã§ãã éåžžãããŒã¯æå¹æéãå¶éãããŠäœæãããŸãããã㯠Redis ã§æäŸãããæå¹æéæ©èœã䜿çšããŠå®çŸããããããé ããæ©ãããã®ããŒã¯ãªãªãŒã¹ãããŸã (ãªã¹ãã®ãããã㣠2)ã ã¯ã©ã€ã¢ã³ãã¯ãªãœãŒã¹ã解æŸããå¿ èŠãããå ŽåãããŒãåé€ããŸãã
äžèŠãããšããã®ãœãªã¥ãŒã·ã§ã³ã¯éåžžã«ããŸãæ©èœããŸãããåé¡ããããŸããããã¯ãã¢ãŒããã¯ãã£ãåäžé害ç¹ãäœæããŠãããšããããšã§ãã ãã¹ã Redis ã€ã³ã¹ã¿ã³ã¹ã«é害ãçºçããå Žåã¯ã©ããªããŸãã? ããã§ã¯ã¹ã¬ãŒããè¿œå ããŠã¿ãŸãããïŒ ãŸããçºè¡šè ãäžåšã®å Žåã«ã¯ããã䜿çšããŸãã æ®å¿µãªããããã®ãªãã·ã§ã³ã¯å®è¡ã§ããŸããã ãããè¡ããšãRedis ã®ã¬ããªã±ãŒã·ã§ã³ã¯éåæã§ãããããã»ãã¥ãªãã£ã確ä¿ããããã«å¿ èŠãªçžäºæä»ããããã£ãé©åã«å®è£ ã§ããªããªããŸãã
æããã«ããã®ãããªã¢ãã«ã§ã¯ç«¶åç¶æ ãçºçããŸãã
- ã¯ã©ã€ã¢ã³ã A ã¯ãã¹ã¿ãŒã®ããã¯ãååŸããŸãã
- ããŒå ¥åãã¹ã¬ãŒãã«è»¢éãããåã«ããã¹ã¿ãŒã¯å€±æããŸãã
- ãã©ãã¯ãŒããªãŒããŒã«ææ ŒããŸãã
- ã¯ã©ã€ã¢ã³ã B ã¯ãA ããã§ã«ããã¯ããŠããã®ãšåããªãœãŒã¹ã®ããã¯ãååŸããŸãã ã»ãã¥ãªãã£éå!
é害ãªã©ã®ç¹æ®ãªç¶æ³ã§ã¯ãå€ãã®ã¯ã©ã€ã¢ã³ããåæã«ããã¯ãä¿æããããšãå®å šã«æ£åžžãªå ŽåããããŸãã ãã®ãããªå Žåã«ã¯ãã¬ããªã±ãŒã·ã§ã³ããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ãé©çšã§ããŸãã ãã以å€ã®å Žåã¯ããã®èšäºã§èª¬æãããŠãã解決çããå§ãããŸãã
åäžã€ã³ã¹ã¿ã³ã¹ã«ããæ£ããå®è£
äžã§èª¬æããåäžã€ã³ã¹ã¿ã³ã¹æ§æã®æ¬ ç¹ãå æããåã«ããã®åçŽãªã±ãŒã¹ãé©åã«åŠçããæ¹æ³ãç解ããŸãããããã®è§£æ±ºçã¯ã競åç¶æ ãæã 蚱容ãããã¢ããªã±ãŒã·ã§ã³ã§å®éã«æå¹ã§ããããŸããã€ã³ã¹ã¿ã³ã¹äžã§ãããã¯ãçºçããããã§ããåäžã€ã³ã¹ã¿ã³ã¹ã¯ãããã§èª¬æããåæ£ã¢ã«ãŽãªãºã ã§äœ¿çšãããåºç€ãšããŠæ©èœããŸãã
ããã¯ãååŸããã«ã¯ã次ã®æé ãå®è¡ããŸãã
SET resource_name my_random_value NX PX 30000
ãã®ã³ãã³ãã¯ãããŒããŸã ååšããªãå Žåã«ã®ã¿ããŒãã€ã³ã¹ããŒã«ã (NX ãªãã·ã§ã³)ãæå¹æé㯠30000 ããªç§ (PX ãªãã·ã§ã³) ã§ãã ããŒã¯ããã«èšå®ãããŠããŸãmyrandomvalue
ã ãã®å€ã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ãããã³ãã¹ãŠã®ããã¯èŠæ±ã«ããã£ãŠäžæã§ããå¿
èŠããããŸãã
åºæ¬çã«ãããã¯ãå®å
šã«è§£æŸããããã«ã©ã³ãã ãªå€ã䜿çšãããã¹ã¯ãªãã㯠Redis ã«ãããŒãååšããããŒã«æ ŒçŽãããŠããå€ãæåŸ
ã©ããã§ããå Žåã«ã®ã¿ããŒãåé€ãããããã«æ瀺ããŸãã ããã¯ã次㮠Lua ã¹ã¯ãªããã䜿çšããŠå®çŸãããŸãã
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
ããã¯ãå¥ã®ã¯ã©ã€ã¢ã³ããä¿æããŠããããã¯ãåé€ãããã®ãé²ãããã«éèŠã§ãã ããšãã°ãã¯ã©ã€ã¢ã³ãã¯ããã¯ãååŸãããã®åŸãæåã®ããã¯ãããé·ãç¶ãäœããã®æäœã§ããã¯ãã (ããŒã®æå¹æéãåãããŸã§ã«æéãããããã)ããã®åŸãä»ã®ã¯ã©ã€ã¢ã³ããèšå®ããããã¯ãåé€ããå ŽåããããŸãã
ã¯ã©ã€ã¢ã³ããå¥ã®ã¯ã©ã€ã¢ã³ããä¿æããŠããããã¯ãåé€ã§ãããããåçŽãª DEL ã®äœ¿çšã¯å®å
šã§ã¯ãããŸããã 察ç
§çã«ãäžèšã®ã¹ã¯ãªããã䜿çšããå Žåãåããã¯ã¯ã©ã³ãã ãªæååã§ã眲åããããããã以åã«ããã¯ãèšå®ããã¯ã©ã€ã¢ã³ãã®ã¿ãããã¯ãåé€ã§ããŸãã
ãã®ã©ã³ãã ãªæååã¯äœã«ãªãã§ãããã? /dev/urandom ãã 20 ãã€ãã«ããå¿ èŠããããšæããŸãããç®çã«åãããŠæååãååã«äžæã«ããå®äŸ¡ãªæ¹æ³ãèŠã€ããããšãã§ããŸãã ããšãã°ãRC4 ã« /dev/urandom ãã·ãŒãããããããæ¬äŒŒã©ã³ãã ã¹ããªãŒã ãçæããŠãåé¡ãããŸããã ããåçŽãªè§£æ±ºçã«ã¯ããã€ã¯ãç§åäœã® UNIX æéãšã¯ã©ã€ã¢ã³ã ID ã®çµã¿åãããå«ãŸããŸãã ããã»ã©å®å šã§ã¯ãããŸããããããããã»ãšãã©ã®ç¶æ³ã§ã¯ååã«æ©èœããŸãã
ããŒã®æå¹æéã®å°ºåºŠãšããŠäœ¿çšããæéããããã¯æå¹æéããšåŒã³ãŸãã ãã®å€ã¯ãããã¯ãèªåçã«è§£æŸããããŸã§ã®æéãšãå®éã«çžäºæä»ä¿èšŒã«éåããããšãªããå¥ã®ã¯ã©ã€ã¢ã³ãããã®ãªãœãŒã¹ãããã¯ã§ããããã«ãªããŸã§ã«ã¯ã©ã€ã¢ã³ããæäœãå®äºããªããã°ãªããªãæéã®äž¡æ¹ã§ãã ãã®ä¿èšŒã¯ãããã¯ãè³Œå ¥ããç¬éããéå§ãããç¹å®ã®æéã«ã®ã¿éå®ãããŸãã
ããã§ãããã¯ãååŸããã³è§£æŸããããã®è¯ãæ¹æ³ã«ã€ããŠèª¬æããŸããã ã·ã¹ãã (åžžã«å©çšå¯èœãªåäžã®ã€ã³ã¹ã¿ã³ã¹ã§æ§æãããéåæ£ã·ã¹ãã ã«ã€ããŠè©±ããŠããå Žå) ã¯å®å šã§ãã ãã®æŠå¿µãããã®ãããªä¿èšŒããªãåæ£ã·ã¹ãã ã«æ¡åŒµããŠã¿ãŸãããã
ã¬ããããã¯ã¢ã«ãŽãªãºã
ã¢ã«ãŽãªãºã ã®åæ£ããŒãžã§ã³ã§ã¯ãN åã® Redis ãã¹ã¿ãŒãããããšãåæãšããŠããŸãã ãããã®ããŒãã¯äºãã«å®å šã«ç¬ç«ããŠãããããã¬ããªã±ãŒã·ã§ã³ããã®ä»ã®æé»çãªèª¿æŽã·ã¹ãã ã¯äœ¿çšããŸããã åäžã€ã³ã¹ã¿ã³ã¹ã®ããã¯ãå®å šã«ååŸããã³è§£æŸããæ¹æ³ã«ã€ããŠã¯ãã§ã«èª¬æããŸããã åäžã®ã€ã³ã¹ã¿ã³ã¹ãæäœããå Žåãã¢ã«ãŽãªãºã ããŸãã«ãã®ã¡ãœããã䜿çšããããšã¯åœç¶ã®ããšã ãšèããŠããŸãã ãã®äŸã§ã¯ãN ã 5 ã«èšå®ããŸããããã¯åŠ¥åœãªå€ã§ãã ãããã£ãŠãç°ãªãã³ã³ãã¥ãŒã¿ãŒãŸãã¯ä»®æ³ãã·ã³äžã§ 5 ã€ã® Redis ãã¹ã¿ãŒã䜿çšããŠãããããäºãã«ã»ãŒç¬ç«ããŠåäœããããã«ããå¿ èŠããããŸãã
ããã¯ãååŸããã«ã¯ãã¯ã©ã€ã¢ã³ãã¯æ¬¡ã®æäœãå®è¡ããŸãã
- çŸåšã®æå»ãããªç§åäœã§ååŸããŸãã
- ãã¹ãŠã®ã±ãŒã¹ã§åãããŒåãšã©ã³ãã ãªå€ã䜿çšããŠãN åã®ã€ã³ã¹ã¿ã³ã¹ãã¹ãŠã®ããã¯ãé çªã«ååŸããããšããŸãã ã¹ããŒãž 2 ã§ã¯ãã¯ã©ã€ã¢ã³ããã€ã³ã¹ã¿ã³ã¹ããšã«ããã¯ãèšå®ãããšããã¯ã©ã€ã¢ã³ãã¯ãããã¯ãèªåçã«è§£æŸããããŸã§ã®æéãšæ¯èŒããŠååã«çãé 延ã䜿çšããŠããã¯ãååŸããŸãã ããšãã°ããããã¯æéã 10 ç§ã®å Žåãé 延ã¯çŽ 5 ïœ 50 ããªç§ã®ç¯å²ã«ãªãå¯èœæ§ããããŸãã ããã«ãããã¯ã©ã€ã¢ã³ããé害ãçºçãã Redis ããŒãã«ã¢ã¯ã»ã¹ããããšããŠé·æéãããã¯ããããŸãŸã«ãªãç¶æ³ã解æ¶ãããŸããã€ã³ã¹ã¿ã³ã¹ãå©çšã§ããªãå Žåã¯ãã§ããã ãæ©ãå¥ã®ã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããããšããŸãã
- ããã¯ãååŸããããã«ãã¯ã©ã€ã¢ã³ãã¯çµéæéãèšç®ããŸãã ãããè¡ãã«ã¯ãã¹ããã 1 ã§ååŸããã¿ã€ã ã¹ã¿ã³ããå®éã®æå»å€ããæžç®ããŸããã¯ã©ã€ã¢ã³ãã倧éšåã®ã€ã³ã¹ã¿ã³ã¹ (å°ãªããšã 3 ã€) ã®ããã¯ãååŸã§ããå Žåã«éããããã¯ã«ãããåèšæéã¯ããã¯ãååŸãããŸã§ã®æéãããã¯æéæªæºã§ããå Žåãããã¯ã¯ååŸããããšã¿ãªãããŸãã
- ããã¯ãååŸãããŠããå Žåãããã¯æéã¯ãå ã®ããã¯æéããã¹ããã 3 ã§èšç®ãããçµéæéãåŒãããã®ãšã¿ãªãããŸãã
- ã¯ã©ã€ã¢ã³ããäœããã®çç±ã§ããã¯ã®ååŸã«å€±æããå Žå(N/2+1ã€ã³ã¹ã¿ã³ã¹ãããã¯ã§ããªãã£ãããããã¯æéãè² ã§ãã£ãå Žå)ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹(ãããã¯ã§ããªããšæãããã€ã³ã¹ã¿ã³ã¹ãå«ã)ã®ããã¯ã解é€ããããšããŸãã ïŒã
ã¢ã«ãŽãªãºã ã¯éåæã§ãã?
ãã®ã¢ã«ãŽãªãºã ã¯ããã¹ãŠã®ããã»ã¹ãåäœããåæã¯ããã¯ã¯ååšããªããã®ã®ãåããã»ã¹ã®ããŒã«ã«æéã¯äŸç¶ãšããŠã»ãŒåãããŒã¹ã§æµããŠãããããã¯ã解é€ããããŸã§ã®åèšæéãšæ¯èŒãããšèª€å·®ã¯å°ãããšããåæã«åºã¥ããŠããŸããèªåçã«è§£æŸãããŸãã ãã®ä»®å®ã¯ãéåžžã®ã³ã³ãã¥ãŒã¿ãŒã«å žåçãªç¶æ³ãšéåžžã«ãã䌌ãŠããŸããã€ãŸããåã³ã³ãã¥ãŒã¿ãŒã«ã¯ããŒã«ã« ã¯ããã¯ããããéåžžãç°ãªãã³ã³ãã¥ãŒã¿ãŒéã®æéå·®ã¯å°ãããšããäºå®ãåœãŠã«ããããšãã§ããŸãã
ãã®æç¹ã§ãçžäºæä»ã«ãŒã«ãããæ éã«å®åŒåããå¿ èŠããããŸããçžäºæä»ã¯ãããã¯ã®æå¹æé (ã¹ããã 3 ã§ååŸãããã®å€) ããããã«ãã°ããã®æé (åèšã§æ°ç§) ãå·®ãåŒããæéå ã«ãããã¯ãä¿æããŠããã¯ã©ã€ã¢ã³ããçµäºããå Žåã«ã®ã¿ä¿èšŒãããŸããããã»ã¹éã®æéå·®ãè£æ£ããããã®ããªç§)ã
次ã®èå³æ·±ãèšäºã§ã¯ãæéééã®èª¿æŽãå¿
èŠãªãã®ãããªã·ã¹ãã ã«ã€ããŠè©³ãã説æããŠããŸãã
倱ææã®åè©Šè¡
ã¯ã©ã€ã¢ã³ããããã¯ã®ååŸã«å€±æããå Žåãã©ã³ãã ãªé 延ã®åŸã«åè©Šè¡ããå¿ èŠããããŸãã ããã¯ãåããªãœãŒã¹ã®ããã¯ãåæã«ååŸããããšããè€æ°ã®ã¯ã©ã€ã¢ã³ããéåæåããããã«è¡ãããŸã (ããã«ãããåè ãååšããªããã¹ããªãã ãã¬ã€ã³ãç¶æ³ãçºçããå¯èœæ§ããããŸã)ã ããã«ãã¯ã©ã€ã¢ã³ãã倧éšåã® Redis ã€ã³ã¹ã¿ã³ã¹ã®ããã¯ãååŸããããšããé床ãéããã°éãã»ã©ãã¹ããªãã ãã¬ã€ã³ç¶æ³ãçºçããå¯èœæ§ããããŠã£ã³ããŠãçããªããŸã (åè©Šè¡ã®å¿ èŠæ§ãå°ãªããªããŸã)ã ãããã£ãŠãçæ³çã«ã¯ãã¯ã©ã€ã¢ã³ãã¯å€éåã䜿çšã㊠N åã®ã€ã³ã¹ã¿ã³ã¹ã« SET ã³ãã³ããåæã«éä¿¡ããããšããå¿ èŠããããŸãã
ããã§ã倧éšåã®ããã¯ã®ååŸã«å€±æããã¯ã©ã€ã¢ã³ããããªãœãŒã¹ã®ããã¯ãå床ååŸã§ããããã«ãªãåã«ããŒã®æå¹æéãåããã®ãåŸ ã€å¿ èŠããªãããã«ã(éšåçã«) ååŸããããã¯ã解æŸããããšãããã«éèŠã§ãããã匷調ãã䟡å€ããããŸãã (ãã ãããããã¯ãŒã¯ã®æçåãçºçããã¯ã©ã€ã¢ã³ãã Redis ã€ã³ã¹ã¿ã³ã¹ãšã®æ¥ç¶ã倱ã£ãå Žåã¯ãããŒã®æå¹æéãåãããŸã§åŸ æ©ããŠããéã«å¯çšæ§ããã«ãã£ãæ¯æãå¿ èŠããããŸã)ã
ããã¯ã解é€ããŠãã ãã
ããã¯ã®è§£æŸã¯ãã¯ã©ã€ã¢ã³ããç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã®ããã¯ã«æåãããã©ããã«é¢ä¿ãªãããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®ããã¯ã解é€ããã ãã®ç°¡åãªæäœã§ãã
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
ã¢ã«ãŽãªãºã ã¯å®å šã§ãã? ããŸããŸãªã·ããªãªã§äœãèµ·ããããæ³åããŠã¿ãŸãããã
ãŸããã¯ã©ã€ã¢ã³ãã倧éšåã®ã€ã³ã¹ã¿ã³ã¹ã®ããã¯ãååŸã§ãããšä»®å®ããŸãã åã€ã³ã¹ã¿ã³ã¹ã«ã¯ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠåãæå¹æéãæã€ããŒãå«ãŸããŸãã ãã ãããããã®ããŒã¯ããããç°ãªãæç¹ã§ã€ã³ã¹ããŒã«ããããããç°ãªãæç¹ã§æå¹æéãåããŸãã ãã ããæåã®ããŒã T1 (æåã®ãµãŒããŒã«æ¥ç¶ããåã«éžæããæé) ãããæªããªãæéã«ã€ã³ã¹ããŒã«ãããæåŸã®ããŒã T2 (å¿çãåä¿¡ããæé) ãããæªããªãæéã«ã€ã³ã¹ããŒã«ãããå Žåã¯ãæåŸã®ãµãŒããŒããïŒã®å Žåãã»ããå
ã®æå¹æéãåããæåã®ããŒã¯å°ãªããšãåç¶ãããšç¢ºä¿¡ããŸãã MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT
ã ä»ã®ãã¹ãŠã®ããŒã¯åŸã§æéåãã«ãªããããå°ãªããšãçŸæç¹ã§ã¯ãã¹ãŠã®ããŒãåæã«æå¹ã§ããããšã確èªã§ããŸãã
ã»ãšãã©ã®ããŒãæå¹ãªéã¯ãN/2+1 ããŒããã§ã«ååšããå ŽåãN/2+1 SET NX æäœã¯æåããªããããå¥ã®ã¯ã©ã€ã¢ã³ãã¯ããã¯ãååŸã§ããŸããã ãããã£ãŠãäžåºŠããã¯ãååŸãããšãåæã«ããã¯ãå床ååŸããããšã¯ã§ããŸããïŒçžäºæä»æ§ã«éåããŸãïŒã
ãã ããåæã«ããã¯ãååŸããããšããè€æ°ã®ã¯ã©ã€ã¢ã³ããåæã«æåããªãããã«ããããšèããŠããŸãã
ã¯ã©ã€ã¢ã³ãã倧éšåã®ã€ã³ã¹ã¿ã³ã¹ãæ倧ããã¯æé以äžããã¯ããŠããå Žåãã¯ã©ã€ã¢ã³ãã¯ããã¯ãç¡å¹ã§ãããšã¿ãªããã€ã³ã¹ã¿ã³ã¹ã®ããã¯ã解é€ããŸãã ãããã£ãŠãã¯ã©ã€ã¢ã³ããæå¹æéãããçãæéå
ã«å€§éšåã®ã€ã³ã¹ã¿ã³ã¹ããããã¯ã§ããå Žåã®ã¿ãèæ
®ããå¿
èŠããããŸãã ãã®å Žåãäžèšã®è°è«ã«é¢ããŠããã®éã MIN_VALIDITY
ã¯ã©ã€ã¢ã³ãã¯ããã¯ãåååŸã§ããŸããã ãããã£ãŠãå€ãã®ã¯ã©ã€ã¢ã³ãã¯ã倧éšåãããã¯ããæéã TTL æéãè¶
ããŠããã¯ãç¡å¹ã«ãªãå Žåã«ã®ã¿ãN/2+1 ã€ã³ã¹ã¿ã³ã¹ãåæã«ããã¯ã§ããŸã (ã¹ããŒãž 2 ã®çµããã§çµäºããŸã)ã
ã»ãã¥ãªãã£ã®æ£åŒãªèšŒæãæäŸããŠããã ããŸãããæ¢åã®åæ§ã®ã¢ã«ãŽãªãºã ã瀺ããŠããã ããŸããããŸãã¯äžèšã®ãã°ãèŠã€ããŠããã ããŸãã?
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
ã·ã¹ãã ã®å¯çšæ§ã¯ã次㮠XNUMX ã€ã®äž»ãªç¹æ§ã«ãã£ãŠæ±ºãŸããŸãã
- ããã¯ãèªåçã«è§£æŸããŸã (ããŒã®æå¹æéãåãããš): ããŒã¯æçµçã«åã³ããã¯ã«äœ¿çšã§ããããã«ãªããŸãã
- éåžžãã¯ã©ã€ã¢ã³ãã¯ãå¿ èŠãªããã¯ãååŸãããŠããªãå ŽåããŸãã¯ååŸãããŠãžã§ããå®äºããå Žåã«ãããã¯ãåé€ããããšã§äºãã«å©ãåããšããäºå®ã ãã®ãããããã¯ãåååŸããããã«ããŒã®æå¹æéãåããã®ãåŸ ã€å¿ èŠã¯ãªããªãå¯èœæ§ããããŸãã
- ã¯ã©ã€ã¢ã³ããããã¯ã®ååŸãåè©Šè¡ããå¿ èŠãããå Žåãã»ãšãã©ã®ããã¯ã®ååŸã«å¿ èŠãªæéãããæ¯èŒçé·ãæéåŸ æ©ãããšããäºå®ã ããã«ããããªãœãŒã¹ã®ç«¶åæã«ã¹ããªãã ãã¬ã€ã³ç¶æ³ãçºçããå¯èœæ§ãäœããªããŸãã
ãã ãããããã¯ãŒã¯ ã»ã°ã¡ã³ãã® TTL ã«çããå¯çšæ§ããã«ãã£ããããããé£ç¶ããã»ã°ã¡ã³ããããå Žåãããã«ãã£ã¯ç¡æéã«ãªãå¯èœæ§ããããŸãã ããã¯ãã¯ã©ã€ã¢ã³ããããã¯ãååŸããããã解æŸããåã«å¥ã®ã»ã°ã¡ã³ãã«ãªããã³ã°ãããã³ã«çºçããŸãã
åççã«ã¯ããããã¯ãŒã¯ ã»ã°ã¡ã³ããç¡éã«é£ç¶ããŠããå Žåãã·ã¹ãã ã¯ç¡éã®æéã«ããã£ãŠå©çšã§ããªãç¶æ ã«ãªãå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ããã§ã€ã«ãªãŒããŒãfsync
å€ãã®äººã Redis ã䜿çšããã®ã¯ãããã¯ã®ååŸãšè§£æŸã«å¿ èŠãªã¬ã€ãã³ã·ãŒãããã³ XNUMX ç§ãããã«å®äºã§ããååŸ/解æŸã®æ°ã®ç¹ã§ãé«ããã㯠ãµãŒããŒã®ããã©ãŒãã³ã¹ãå¿ èŠã§ããããã§ãã ãã®èŠä»¶ãæºããããã«ãN åã® Redis ãµãŒããŒãšéä¿¡ããŠåŸ æ©æéãççž®ããæŠç¥ããããŸãã ããã¯å€éåæŠç¥ã§ã (ãŸãã¯ã貧ä¹äººã®å€éåãããœã±ããããã³ããããã³ã° ã¢ãŒãã«ãªãããã¹ãŠã®ã³ãã³ããéä¿¡ããåŸã§ã³ãã³ããèªã¿åããŸããã¯ã©ã€ã¢ã³ããšåã€ã³ã¹ã¿ã³ã¹éã®åŸåŸ©æéãåæ§ã§ãããšä»®å®ããŸã)ã ã
ãã ããé害ãã確å®ã«å埩ããã¢ãã«ãäœæããããšããå Žåã¯ãããŒã¿ã®é·æä¿åã«é¢é£ããèæ ®äºé ãèæ ®ããå¿ èŠããããŸãã
åºæ¬çã«ãåé¡ãæ確ã«ããããã«ãé·æããŒã¿ã¹ãã¬ãŒãžããŸã£ãã䜿çšããªã㧠Redis ãæ§æãããšä»®å®ããŸãã ã¯ã©ã€ã¢ã³ã㯠3 ã€ã®ã€ã³ã¹ã¿ã³ã¹ã®ãã¡ 5 ã€ããããã¯ããããšã«æåããŸããã ã¯ã©ã€ã¢ã³ãããããã¯ã§ããã€ã³ã¹ã¿ã³ã¹ã® 3 ã€ãåèµ·åãããŸãããã®æç¹ã§ã¯ãåããªãœãŒã¹ã«å¯ŸããŠåã³ XNUMX ã€ã®ã€ã³ã¹ã¿ã³ã¹ãããããããããããã¯ã§ããŸãããŸããå¥ã®ã¯ã©ã€ã¢ã³ããåèµ·åãããã€ã³ã¹ã¿ã³ã¹ããããã¯ããã»ãã¥ãªã㣠ããããã£ã«éåããå¯èœæ§ããããŸããããã¯ã®æä»æ§ãåæãšããŠããŸãã
ããŒã¿å
è¡ (AOF) ãæå¹ã«ãããšãç¶æ³ã¯ãããã«æ¹åãããŸãã ããšãã°ãSHUTDOWN ã³ãã³ããéä¿¡ããŠåèµ·åããããšã«ããããµãŒããŒãææ Œã§ããŸãã Redis ã®æå¹æéæäœã¯ããµãŒããŒããªãã«ãªã£ãŠããå Žåã§ãæéãæµãç¶ããããã«æå³çã«å®è£
ãããŠããããããã¹ãŠã®èŠä»¶ãæºããããŠããŸãã éåžžã®ã·ã£ããããŠã³ã確ä¿ãããŠããéããããã¯æ£åžžã§ãã åé»ã®å Žåã¯ã©ãããã°ããã§ãã? Redis ãããã©ã«ãã§æ§æãããŠãããfsync ããã£ã¹ã¯äžã§ XNUMX ç§ããšã«åæããŠããå Žåãåèµ·ååŸã«ããŒããªããªãå¯èœæ§ããããŸãã çè«çã«ã¯ãã€ã³ã¹ã¿ã³ã¹ã®åèµ·åæã«ããã¯ã®ã»ãã¥ãªãã£ãä¿èšŒãããå Žåã¯ã fsync=always
é·æããŒã¿ä¿åã®èšå®ã§ã ããã«ãããåæ£ããã¯ãå®å
šã«å®è£
ããããã«åŸæ¥äœ¿çšãããŠãã CP ã·ã¹ãã ã®ã¬ãã«ãŸã§ããã©ãŒãã³ã¹ãå®å
šã«äœäžããŸãã
ããããç¶æ³ã¯äžèŠãããããè¯å¥œã§ãã ååãšããŠãé害åŸã«ã€ã³ã¹ã¿ã³ã¹ãåèµ·åããããšãã€ã³ã¹ã¿ã³ã¹ã¯çŸåšã¢ã¯ãã£ããªããã¯ã«åå ããªããªããããã¢ã«ãŽãªãºã ã®ã»ãã¥ãªãã£ã¯ç¶æãããŸãã
ããã確å®ã«ããã«ã¯ãé害çºçåŸã䜿çšããæ倧 TTL ããããã«è¶ ããæéãã€ã³ã¹ã¿ã³ã¹ãå©çšã§ããªãç¶æ ãç¶ãããšã確èªããã ãã§æžã¿ãŸãã ãã®ããã«ããŠãæå¹æéãåããé害æã«ã¢ã¯ãã£ãã ã£ããã¹ãŠã®ããŒãèªåçã«è§£æŸããããŸã§åŸ æ©ããŸãã
é 延åèµ·åã䜿çšãããšãåççã«ã¯ãRedis ã«é·æçãªæ°žç¶æ§ããªãå Žåã§ãã»ãã¥ãªãã£ãå®çŸã§ããŸãã ãã ããã¢ã¯ã»ã·ããªãã£éåãšããŠçœ°éãç§ãããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ããšãã°ã倧éšåã®ã€ã³ã¹ã¿ã³ã¹ã«é害ãçºçããå Žåãã·ã¹ãã 㯠TTL ã«å¯ŸããŠã°ããŒãã«ã«äœ¿çšã§ããªããªããŸã (ãã®éããªãœãŒã¹ã¯ãããã¯ãããŸãã)ã
ã¢ã«ãŽãªãºã ã®å¯çšæ§ãé«ããŸãããããã¯ãæ¡åŒµããŸãã
ã¯ã©ã€ã¢ã³ããå®è¡ããäœæ¥ãå°ããªã¹ãããã§æ§æãããŠããå Žåã¯ãããã©ã«ãã®ããã¯æéãççž®ããããã¯ãæ¡åŒµããã¡ã«ããºã ãå®è£ ããããšãã§ããŸãã ååãšããŠãã¯ã©ã€ã¢ã³ããã³ã³ãã¥ãŒãã£ã³ã°ã§ããžãŒã§ãããããã¯ã®æå¹æéå€ãå±éºãªã»ã©äœãå ŽåãããŒããŸã ååšãããã®å€ããŸã ååŸæã«ååŸãããã©ã³ãã ãªå€ã§ããã°ãããŒã® TTL ã延é·ãã Lua ã¹ã¯ãªããããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã«éä¿¡ã§ããŸããããã¯ãååŸãããŸããã
ã¯ã©ã€ã¢ã³ãã¯ãæå¹æéå ã«å€§éšåã®ã€ã³ã¹ã¿ã³ã¹ãããã¯ã§ããå Žåã«ã®ã¿ãããã¯ã®åååŸãèæ ®ããå¿ èŠããããŸãã
確ãã«ãæè¡çã«ã¯ã¢ã«ãŽãªãºã ã¯å€æŽãããªããããããã¯ãååŸããç¹°ãè¿ãè©Šè¡ã®æ倧æ°ãå¶éããå¿
èŠããããŸããå¶éããªããšãã¢ã¯ã»ã·ããªãã£ã®ããããã£ã䟵害ãããŸãã
åºæïŒ habr.com