
Tarantool DBMSã®ããã©ãŒãã³ã¹ããã®æ©èœãšæ©èœã«ã€ããŠå€ãã®äººããã§ã«èããŠããŸãã ããšãã°ã圌ã¯ã¯ãŒã«ãªãã£ã¹ã¯ã¹ãã¬ãŒãžãæã£ãŠããŸã-Vinylã«å ããŠã圌ã¯JSONããã¥ã¡ã³ãã®æäœæ¹æ³ãç¥ã£ãŠããŸãã ããããå€æ°ã®åºçç©ã1ã€ã®éèŠãªæ©èœããã€ãã¹ããŠããŸãã éåžžãããŒã¿ããŒã¹ã¯åãªãã¹ãã¬ãŒãžãšèŠãªãããŸãããTarantoolã®ç¹åŸŽçãªæ©èœã¯ãå
éšã«ã³ãŒããèšè¿°ãããã®ããŒã¿ãéåžžã«å¹ççã«äœ¿çšã§ããããšã§ãã ç«ã®äžã«ã¯ãIgor igorcoding Latkinãšå
±åã§äœæãããTarantoolå
ã«1ã€ã®ã·ã¹ãã ãã»ãŒå®å
šã«æ§ç¯ããæ¹æ³ã®ç©èªããããŸãã
çããã¯Mail.Ru Mailã«åºäŒã£ãããšããããŸãããããããä»ã®ã¡ãŒã«ããã¯ã¹ããã®æçŽã®ã³ã¬ã¯ã·ã§ã³ãæ§æããããšãå¯èœã§ããããšããåç¥ã§ãããã ãããè¡ãããã«ãOAuthãããã³ã«ããµããŒããããŠããå ŽåããµãŒãããŒãã£ã®ãµãŒãã¹ãããŠãŒã¶ãŒåãšãã¹ã¯ãŒãããŠãŒã¶ãŒã«æ±ããå¿
èŠã¯ãããŸããã ãã®å ŽåãOAuthããŒã¯ã³ãã¢ã¯ã»ã¹ã«äœ¿çšãããŸãã ããã«ãMail.Ru Groupã«ã¯ããµãŒãããŒãã£ãµãŒãã¹ã«ããæ¿èªãå¿
èŠãšããä»ã®å€ãã®ãããžã§ã¯ããããããŠãŒã¶ãŒããã®ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãã®ã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããã«ã¯OAuthããŒã¯ã³ãçºè¡ããå¿
èŠããããŸãã ããŒã¯ã³ãä¿åããã³æŽæ°ããããã®ãã®ãããªãµãŒãã¹ã®éçºã«åŸäºããŠããŸããã
ãããã誰ããOAuthããŒã¯ã³ãäœã§ããããç¥ã£ãŠããŸãã ã»ãšãã©ã®å Žåãããã¯3ã€ãŸãã¯4ã€ã®ãã£ãŒã«ãã®æ§é ã§ãã
{ "token_type" : "bearer", "access_token" : "XXXXXX", "refresh_token" : "YYYYYY", "expires_in" : 3600 }
- access_tokenã䜿çšãããš ãã¢ã¯ã·ã§ã³ãå®è¡ãããããŠãŒã¶ãŒã«é¢ããæ
å ±ãååŸããããå人ã®ãªã¹ããããŠã³ããŒããããã§ããŸãã
- refresh_token ãæ°ããaccess_token ãããã³ä»»æã®çªå·ãååŸã§ããŸãã
- expires_in-ããŒã¯ã³ã®æå¹æéããŸãã¯å¥ã®äºåå®çŸ©ãããæéã®ã¿ã€ã ã¹ã¿ã³ãã æå¹æéãåããã¢ã¯ã»ã¹ããŒã¯ã³ããæã¡ã®å Žåã¯ããªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸããã
次ã«ããµãŒãã¹ã®ããããã®ã¢ãŒããã¯ãã£ãæ€èšããŸãã åã«ããŒã¯ã³ããµãŒãã¹ã«æ¿å
¥ããŠèªã¿åãããã³ããšã³ããããã€ããããrefreshersãšåŒã°ããå¥ã®ãšã³ãã£ãã£ããããšæ³åããŠãã ããã ãªãã¬ãã·ã£ãŒã®ã¿ã¹ã¯ã¯ãæå¹æéãåããé ã«æ°ããaccess_token
OAuthãããã€ããŒã«ç§»åããããšã§ãã

åºæ¬æ§é ãéåžžã«åçŽã§ãã 2ã€ã®ããŒã¿ããŒã¹ããŒãïŒãã¹ã¿ãŒã¬ããªã«ãšã¹ã¬ãŒãã¬ããªã«ïŒããããŸãã åçŽããŒã¯ãããŒã¿ã»ã³ã¿ãŒã®æ¡ä»¶ä»ãåé¢ãè¡šããŸãã 1ã€ã®ããŒã¿ã»ã³ã¿ãŒã«ã¯ãããã³ããšã³ããšå·èµåº«ãåãããã¹ã¿ãŒãããããã1ã€ã®ããŒã¿ã»ã³ã¿ãŒã«ã¯ããã¹ã¿ãŒã«è¡ãããã³ããšã³ããšå·èµåº«ãåããã¹ã¬ãŒãããããŸãã
å°é£ã¯äœã§ããïŒ
äž»ãªåé¡ã¯ãããŒã¯ã³ãåç¶ããæéïŒ1æéïŒã§ãã ãããžã§ã¯ããèŠããšãèããæµ®ãã³äžãã£ãŠããŸãããããã¯é«è² è·ã¹ã±ãŒã«ã§ããïŒ1æé以å
ã«æŽæ°ããå¿
èŠããã1,000äžä»¶ã®ã¬ã³ãŒãã§ããïŒ åå²ãããšã3000çšåºŠã®RPSãåŸãããŸããã åé¡ã¯ãäœãã®æŽæ°ãæ¢ãŸã£ãç¬éã«å§ãŸããŸããããšãã°ãããŒã¹ã®ã¡ã³ããã³ã¹ãã¯ã©ãã·ã¥ãè»ã®ã¯ã©ãã·ã¥ãªã©ãäœã§ãèµ·ãããŸãã äºå®ãäœããã®çç±ã§ãµãŒãã¹ïŒãã¹ã¿ãŒããŒã¹ïŒã15åéæ©èœããªãå Žåã25ïŒ
ã®åæ¢ãçºçããŸãã ããŒã¿ã®4åã®1ãç¡å¹ã§ãããæŽæ°ãããŠããªãããã䜿çšã§ããŸããã ãµãŒãã¹ã30åã§ããå ŽåãæŽæ°ãªãã§ããŒã¿ã®ååã¯æ¢ã«ãããŸãã æé-æå¹ãªããŒã¯ã³ã¯1ã€ã§ã¯ãããŸããã ããŒã¹ã1æé眮ããããšä»®å®ãããšããããåŒãäžããããã1,000äžåãã¹ãŠã®ããŒã¯ã³ãéåžžã«è¿
éã«æŽæ°ããå¿
èŠããããŸãã ããã¯3000 RPSã§ã¯ãªããéåžžã«è² è·ã®é«ããµãŒãã¹ã§ãã
æåã¯ãã¹ãŠãæ£åžžã«åŠçããããšèšããªããã°ãªããŸããããçºå£²åŸ2幎ã§ãå¥ã®ããžãã¯ãšã€ã³ããã¯ã¹ãè¿œå ããã»ã«ã³ããªããžãã¯ãè¿œå ãå§ããŸãããäžè¬ã«ãTarantoolã¯ããã»ããµã䜿ãæãããŸããã äºæ³å€ã§ããããã©ã®ãªãœãŒã¹ã䜿ãæããããšãã§ããŸãã
åããŠç®¡çè
ãå©ããŠãããŸããã ç§ãã¡ãèŠã€ããæã匷åãªããã»ããµãã€ã³ã¹ããŒã«ããŸãããããã«ãããããã«6ãæéæé·ã§ããŸãããããã®éã«åé¡ãäœããã®åœ¢ã§è§£æ±ºããå¿
èŠããããŸããã ç§ãã¡ã¯æ°ããTarantoolã«åºäŒããŸããïŒã·ã¹ãã ã¯å€ãTarantool 1.5ã§æžãããŠãããMail.Ruã°ã«ãŒã以å€ã§ã¯ã»ãšãã©èŠãããŸããïŒã Tarantool 1.6ã«ã¯ããã®æç¹ã§æ¢ã«ãã¹ã¿ãŒãšãã¹ã¿ãŒã®ã¬ããªã±ãŒã·ã§ã³ããããŸããã ãããŠæåã«æãã€ããã®ã¯ã3ã€ã®ããŒã¿ã»ã³ã¿ãŒã«ããŒã¿ããŒã¹ã®ã³ããŒãé
眮ãããããã®éã§ãã¹ã¿ãŒãã¹ã¿ã¬ããªã±ãŒã·ã§ã³ãéå§ãããšããã¹ãŠãããŸãããããšã§ãã

3人ã®ãã¹ã¿ãŒã3ã€ã®ããŒã¿ã»ã³ã¿ãŒã3ã€ã®ãªãã¬ãã·ã£ãŒããããããèªåã®ãã¹ã¿ãŒãšé£æºããŠããŸãã 1ã€ãŸãã¯2ã€ããããã§ããŸããããã¹ãŠãæ©èœããŠããããã§ãã ããããããã§ã®æœåšçãªåé¡ã¯äœã§ããïŒ äž»ãªåé¡ã¯ãOAuthãããã€ããŒãžã®ãªã¯ãšã¹ãæ°ã3åã«å¢ããŠããããšã§ãã å®è³ªçã«åãããŒã¯ã³ãããããŠã¬ããªã«ãããéãäœåºŠãæ§ããŸãã ããã¯ãŸã£ããåœãŠã¯ãŸããŸããã æãããªè§£æ±ºçïŒããŒãèªäœããçŸæç¹ã§ã©ã®ããŒãããªãŒããŒã«ããããäœããã®æ¹æ³ã§æ±ºå®ããå¿
èŠããããŸãïŒã€ãŸãã1ã€ã®ã¬ããªã«ã®ã¿ããããŒã¯ã³ãæŽæ°ããïŒã
ãªãŒããŒãºãã§ã€ã¹
ã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã¯ããã€ããããŸãã ãããã®æåã®ãã®ã¯Paxosã§ãã ããªãè€éãªããšã ç§ãã¡ã¯ããããåºç€ã«ããŠäœããç°¡åã«ããæ¹æ³ãé©åã«ç解ããããšãã§ããŸããã§ããã æåŸã«ãæã
ã¯ããã ã«èœã¡çããŸããã ããã¯éåžžã«åçŽãªã³ã³ã»ã³ãµã¹ã¢ã«ãŽãªãºã ã§ãããåææãŸãã¯ãã®ä»ã®çç±ã§æ°ãããªãŒããŒãéžæããããŸã§ããªãŒããŒãéžæã§ããŸãã ãããç§ãã¡ã®ããæ¹ã§ãïŒ

Tarantoolã«ã¯ããã®ãŸãŸRaftãPaxosããããŸããã ãã ããé
ä¿¡ã«å«ãŸããæ¢è£œã®ã¢ãžã¥ãŒã«ãnet.boxã䜿çšããŸãã ãã®ã¢ãžã¥ãŒã«ã䜿çšãããšããã«ã¡ãã·ã¥ã¹ããŒã ã«åŸã£ãŠããŒããçžäºã«æ¥ç¶ã§ããŸããåããŒãã¯ä»ã®ãã¹ãŠã®ããŒãã«æ¥ç¶ãããŸãã ãããŠããã¹ãŠãç°¡åã§ãããããã®æ¥ç¶ã®äžã«ãRaftã§èª¬æãããŠãããªãŒããŒãéžæããŸãã ãã®åŸãåããŒãã¯ããããã£ãææãå§ããŸããããã¯ãªãŒããŒãŸãã¯ãã©ãã¯ãŒã®ããããã§ãããããªãŒããŒãŸãã¯ãã©ãã¯ãŒã®ãããã衚瀺ãããŸããã
Raftã®å®è£
ãé£ãããšæãããå Žåã¯ããµã³ãã«ã®Luaã³ãŒãã次ã«ç€ºããŸãã
local r = self.pool.call(self.FUNC.request_vote, self.term, self.uuid) self._vote_count = self:count_votes(r) if self._vote_count > self._nodes_count / 2 then log.info("[raft-srv] node %d won elections", self.id) self:_set_state(self.S.LEADER) self:_set_leader({ id=self.id, uuid=self.uuid }) self._vote_count = 0 self:stop_election_timer() self:start_heartbeater() else log.info("[raft-srv] node %d lost elections", self.id) self:_set_state(self.S.IDLE) self:_set_leader(msgpack.NULL) self._vote_count = 0 self:start_election_timer() end
ããã§ã¯ããªã¢ãŒããµãŒããŒãä»ã®Tarantoolã¬ããªã«ãããŒãããåãåã£ãæ祚æ°ããªã¯ãšã¹ãããŸãã å®è¶³æ°ãããå Žåã圌ãã¯ç§ãã¡ã«æ祚ããç§ãã¡ã¯ãªãŒããŒã«ãªããããŒãããŒããéå§ããŸã-ç§ãã¡ã¯ä»ã®ããŒãã«ç§ãã¡ãçããŠããããšãç¥ãããŸãã éžæã«æããå Žåãå床éžæãéå§ããŸãã ãã°ãããããšãæ祚ãŸãã¯éžåºã§ããããã«ãªããŸãã
ã¯ã©ãŒã©ã ãåãåã£ãŠãªãŒããŒã決å®ãããããã¹ãŠã®ããŒãã«ãªãã¬ãã·ã£ãŒãéä¿¡ã§ããŸãããåæã«ããªãŒããŒãšã®ã¿é£æºããããã«æ瀺ããŸãã
ãã®ããã«ããŠãéåžžã®ãã©ãã£ãã¯ãååŸããŸãã ã¿ã¹ã¯ã¯1ã€ã®ããŒãã«ãã£ãŠå²ãåœãŠããããããçŽ3åã®1ãåãªãã¬ãã·ã£ãŒã«ç§»åããŸããããã§ã®ã¿ããã¹ã¿ãŒãå®å
šã«å€±ãããšãã§ããŸã-åéžãçºçãããªãã¬ãã·ã£ãŒã¯å¥ã®ããŒãã«åãæ¿ãããŸãã ããããä»ã®åæ£ã·ã¹ãã ãšåæ§ã«ãã¯ã©ãŒã©ã ã«åé¡ãçºçããŸãã
ãæŸæ£ããããããŒã
ããŒã¿ã»ã³ã¿ãŒéã®æ¥ç¶ã倱ãããå Žåãã·ã¹ãã ãåŒãç¶ã皌åãããã¡ã«ããºã ãšãã·ã¹ãã ã®æŽåæ§ã埩å
ããã¡ã«ããºã ãå¿
èŠã§ãã Raftã¯ãã®åé¡ã解決ããŸãã

DatalineããŒã¿ã»ã³ã¿ãŒããªããªã£ããšããŸãããã ããã«ç«ã£ãŠããããŒãã¯ãæŸæ£ãã«ãªããä»ã®ããŒãã¯èŠããŸããã ã¯ã©ã¹ã¿ãŒã®æ®ãã®éšåã¯ãããŒãã倱ãããåéžãè¡ãããŠããããšãèªèããŸãããªãŒããŒã¯ãã¯ã©ã¹ã¿ãŒå
ã®æ°ããããŒããããšãã°æäžäœããŒãã§ãã ããŒãéã®ã³ã³ã»ã³ãµã¹ããŸã æ®ã£ãŠãããããã·ã¹ãã ã¯åŒãç¶ãæ©èœããŸãã åå以äžã®ããŒãããäºããèªèããŸãã
äž»ãªè³ªåã¯ãæ¥ç¶ã倱ãããéå»ã®ããŒã¿ã»ã³ã¿ãŒã«ãããªãã¬ãã·ã£ãŒã¯ã©ããªããŸããïŒ Raftä»æ§ã«ã¯ããã®ãããªããŒãã®åå¥ã®ååã¯ãããŸããã éåžžãã¯ã©ãŒã©ã ãŸãã¯ãªãŒããŒãšã®éä¿¡ãæããªãããŒãã¯éã¢ã¯ãã£ãã§ãã ããããçµå±ã®ãšããã圌ã¯ãŸã ãããã¯ãŒã¯ã«è¡ããããŒã¯ã³ãåå¥ã«æŽæ°ã§ããŸãã éåžžãããŒã¯ã³ã¯æ¥ç¶ã¢ãŒãã§æŽæ°ãããŸããããæŸæ£ããããããŒãã«æ¥ç¶ãããŠãããªãã¬ãã·ã£ãŒã§ããŒã¯ã³ãæŽæ°ããããšã¯å¯èœã§ããïŒ æåã¯ãããŒã¯ã³ãæŽæ°ããããšãçã«ããªã£ãŠãããã©ããã¯æããã§ã¯ãããŸããã§ãããïŒ äžèŠãªæŽæ°æäœã¯ãããŸããïŒ
ã·ã¹ãã ã®å®è£
ããã»ã¹ã§ãã®åé¡ã«å¯ŸåŠããŸããã æåã®èãã¯ãã³ã³ã»ã³ãµã¹ãã¯ã©ãŒã©ã ããããã¯ã©ãŒã©ã ãã誰ãã倱ã£ãå ŽåãæŽæ°ãå®è¡ããªãããšã§ãã ãããããã®åŸãå¥ã®ã¢ã€ãã¢ãæµ®äžããŸããã Tarantoolãã¹ã¿ãŒãã¹ã¿ãŒå®è£
ãèŠãŠã¿ãŸãããã ããæç¹ã§ãäž¡æ¹ããã¹ã¿ãŒã§ãã2ã€ã®ããŒãããããšããŸãã å€ã1ã§ããå€æ°ããŒXããããŸããåæã«ãã¬ããªã±ãŒã·ã§ã³ããã®ããŒãã«å°éãããŸã§ããã®ããŒãåæã«2ã€ã®ç°ãªãå€ã«å€æŽãããšããŸãïŒ1ã€ã®ããŒãã«2ã€ããã1ã€ã®ããŒãã«3ã€ãã¬ããªã±ãŒã·ã§ã³ãã°ãã€ãŸãå€ã亀æããŸãã äžè²«æ§ãšããç¹ã§ã¯ããã®ãããªãã¹ã¿ãŒ/ãã¹ã¿ãŒå®è£
ã¯ããçš®ã®ææã§ããTarantooléçºè
ã¯ç§ãèš±ããŸãã

å³å¯ãªäžè²«æ§ãå¿
èŠãªå Žåãããã¯æ©èœããŸããã ãã ãã2ã€ã®éèŠãªéšåã§æ§æãããOAuthããŒã¯ã³ãæãåºããŠãã ããã
- æ¡ä»¶ä»ãã§ç¡æéã«çãããªãã¬ãã·ã¥ããŒã¯ã³
- ããã³ã¢ã¯ã»ã¹ããŒã¯ã³-1æéæå¹ã§ãã
ãã ããåæã«ããªãã¬ãã·ã£ãŒã«ã¯ãªãã¬ãã·ã¥æ©èœãããããªãã¬ãã·ã¥ããŒã¯ã³ãããã€ã§ãä»»æã®æ°ã®ã¢ã¯ã»ã¹ããŒã¯ã³ãååŸã§ããŸãã ãããŠã圌ãã¯ãã¹ãŠçºè¡æ¥ãã1æé以å
ã«è¡åããŸãã
ã¹ããŒã ãèããŠã¿ãŸãããã2ã€ã®ããŒãããªãŒããŒãšæ£åžžã«åäœããããŒã¯ã³ãæŽæ°ããæåã®ã¢ã¯ã»ã¹ããŒã¯ã³ãåãåããŸããã 圌ã¯è€è£œããä»ã§ã¯èª°ãããã®ã¢ã¯ã»ã¹ããŒã¯ã³ãæã£ãŠããŸãã ã®ã£ãããããããã©ãã¯ãŒã¯ãæŸæ£ããããããŒãã«ãªããã¯ã©ãŒã©ã ãæããããªãŒããŒãä»ã®ãã©ãã¯ãŒãèŠããŸããã åæã«ããªãã¡ã©ãŒããæŸæ£ããããããŒãã«ååšããããŒã¯ã³ãæŽæ°ã§ããããã«ããŸãã ãããã¯ãŒã¯ããªãå Žåãåç·ã¯æ©èœããŸããã ããããåçŽãªåå²ïŒãããã¯ãŒã¯ãç ŽããŠããïŒã§ããã°ããã®éšåã¯èªåŸçã«æ©èœããŸãã
åæãçµäºããŠããŒããåå ãããšãåéžæãè¡ãããããããŒã¿ã亀æãããŸãã åæã«ã2çªç®ãš3çªç®ã®ããŒã¯ã³ã¯çãããè¯å¥œãã§ãã
ã¯ã©ã¹ã¿ãŒãåçµåãããåŸã次ã®æŽæ°æé ã¯1ã€ã®ããŒãã§ã®ã¿å®è¡ãããè€è£œãããŸãã ã€ãŸãããã°ããã®éãã¯ã©ã¹ã¿ãŒãåå²ããããããããç¬èªã®æ¹æ³ã§æŽæ°ãããåçµååŸãéåžžã®äžè²«ããããŒã¿ã«æ»ããŸãã ããã«ããã次ã®ããšãããããŸããéåžžãã¯ã©ã¹ã¿ãŒã«ã¯N / 2 + 1åã®ã¢ã¯ãã£ãããŒããå¿
èŠã§ãïŒ3ã€ã®ããŒãã®å Žåããããã¯2ã€ã§ãïŒã ç§ãã¡ã®å Žåãã·ã¹ãã ãæ©èœããã«ã¯å°ãªããšã1ã€ã®ã¢ã¯ãã£ãããŒãã§ååã§ãã å¿
èŠãªã ãæ£ç¢ºã«ãªã¯ãšã¹ããéä¿¡ãããŸãã
ãªã¯ãšã¹ãã®æ°ãå¢ããåé¡ã«ã€ããŠè©±ããŸããã ã¹ããªãããŸãã¯ããŠã³ã¿ã€ã ã®æéã«ã€ããŠã¯ãå°ãªããšã1ã€ã®ããŒããåç¶ãããããšãã§ããŸãã æŽæ°ããããŒã¿ãè¿œå ããŸãã ãããæçµçãªåå²ã§ããå Žåãã€ãŸãããã¹ãŠã®ããŒããåå²ãããå
šå¡ããããã¯ãŒã¯ãæã£ãŠããå ŽåãOAuthãããã€ããŒãžã®ãªã¯ãšã¹ãæ°ã3åã«ãªããŸãã ããããã€ãã³ãã®æéãçããããããã¯æãããããšã§ã¯ãªããåžžã«ã¹ããªããã¢ãŒãã§äœæ¥ããã€ããã¯ãããŸããã éåžžãã·ã¹ãã ã¯ã¯ã©ãŒã©ã ãæ¥ç¶ç¶æ
ã«ãããéåžžã¯ãã¹ãŠã®ããŒããæ©èœããŸãã
ã·ã£ãŒãã£ã³ã°
1ã€ã®åé¡ããããŸãã-CPUã®å€©äºã«ã¶ã€ãããŸããã æãããªè§£æ±ºçïŒã·ã£ãŒãã£ã³ã°ã

ããŒã¿ããŒã¹ã2ã€ããããããããè€è£œãããŠãããšããŸãããã ããã€ãã®ããŒãå
¥åã«æ¥ãç¹å®ã®æ©èœãããããã®ããŒã«ãã£ãŠãããŒã¿ãã©ã®ã·ã£ãŒãã«ããããå€å¥ã§ããŸãã é»åã¡ãŒã«ã§ã·ã£ãŒãããå Žåãã¢ãã¬ã¹ã®äžéšã¯1ã€ã®ã·ã£ãŒãã«ä¿åãããå¥ã®ã·ã£ãŒãã«ã¯ããã€ãã®ã¢ãã¬ã¹ãä¿åãããããŒã¿ã®å Žæãåžžã«ããããŸãã
ã·ã£ãŒãã£ã³ã°ãå®è£
ããã«ã¯ã2ã€ã®ã¢ãããŒãããããŸãã æåã¯ã¯ã©ã€ã¢ã³ãã§ãã CRC32ããŒãGuavaãSumburãªã©ã®æ°åãã·ã£ãŒããè¿ãäžè²«ããããã·ã¥é¢æ°ãéžæããŸãã ãã®æ©èœã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«çããå®è£
ãããŠããŸãã ãã®ã¢ãããŒãã«ã¯æ確ãªå©ç¹ããããŸããããŒã¿ããŒã¹ã¯ã·ã£ãŒãã£ã³ã°ã«ã€ããŠäœãç¥ããŸããã ããŒã¹ãäžããŠæšæºãšããŠæ©èœããã·ã£ãŒãã£ã³ã°ã¯åŽé¢ã®ã©ããã«ãããŸãã
ããããé倧ãªæ¬ ç¹ããããŸãã ãŸãã顧客ã¯ããªã倪ã£ãŠããã æ°ãããã®ãäœæããå Žåã¯ãã·ã£ãŒãã£ã³ã°ããžãã¯ãè¿œå ããå¿
èŠããããŸãã ããããææªã®åé¡ã¯ãããã¹ããŒã ã«åŸã£ãŠåäœããã¯ã©ã€ã¢ã³ããããã°ãå¥ã®ã¹ããŒã ã«åŸã£ãŠåäœããã¯ã©ã€ã¢ã³ãããããšããããšã§ãã åæã«ãåºå°èªäœã¯ããªããããŸããŸãªæ¹æ³ã§æ¥ãããããå±ã§ãããšããäºå®ã«ã€ããŠäœãç¥ããŸããã
å¥ã®ã¢ãããŒããéžæããŸãã-ããŒã¿ããŒã¹å
ã§ã®ã·ã£ãŒãã£ã³ã°ã ãã®å Žåãã³ãŒãã¯ããè€éã«ãªããŸãããåçŽãªã¯ã©ã€ã¢ã³ãã䜿çšã§ããŸãã ãã®ããŒã¿ããŒã¹ã«æ¥ç¶ããã¯ã©ã€ã¢ã³ãã¯ãã¹ãŠã®ããŒãã«ç§»åããããã§æ¥ç¶ããããŒããšè»¢éããã³ã³ãããŒã«ãèšç®ããé¢æ°ãããã§å®è¡ãããŸãã ã¯ã©ã€ã¢ã³ãã¯åçŽã§ã-ããŒã¿ããŒã¹ã¯ããè€éã§ãããåæã«ãã®ããŒã¿ã«å¯ŸããŠå®å
šã«è²¬ä»»ããããŸãã ããã«ãæãé£ããã®ã¯ãªã·ã£ãŒãã£ã³ã°ã§ãã ããŒã¿ããŒã¹ããã®ããŒã¿ã«è²¬ä»»ãè² ãå Žåããªã·ã£ãŒãã£ã³ã°ã¯ããŸã æŽæ°ã§ããªãã¯ã©ã€ã¢ã³ããããå Žåãããã¯ããã«ç°¡åã§ãã
ãããã©ããã£ãŠãã£ãã®ïŒ

å
è§åœ¢ã¯ã¿ã©ã³ããŒã«ã§ãã 3ã€ã®ããŒããåããã·ã£ãŒãçªå·1ãåŒã³åºããŸãã ãŸã£ããåãã¯ã©ã¹ã¿ãŒãé
眮ããã·ã£ãŒãçªå·2ãåŒã³åºããŸãã ãã¹ãŠã®ããŒããäºãã«æ¥ç¶ããŸãã ããã¯äœãäžããŸããïŒ ãŸããRaftããããŸããããªãã«ã®ãµãŒããŒå
ã§ã誰ããªãŒããŒã誰ããã©ãã¯ãŒãã¯ã©ã¹ã¿ãŒã®ç¶æ
ãææ¡ããŠããŸãã æ°ããã·ã£ãŒãã£ã³ã°æ¥ç¶ã®ãããã§ããšã€ãªã¢ã³ã®ã·ã£ãŒãã®ç¶æ
ãããããŸããã 誰ãã»ã«ã³ãã·ã£ãŒãã®ãªãŒããŒã§ããã誰ããã©ãã¯ãŒã§ããããªã©ãå®å
šã«ç¥ã£ãŠããŸãã äžè¬çãªã±ãŒã¹ã§ã¯ãæåã®ã·ã£ãŒã以äžã®ãã®ãå¿
èŠãªå Žåãæåã®ã·ã£ãŒãã«æ¥ããŠãŒã¶ãŒãã©ãã«ãªãã€ã¬ã¯ãããããåžžã«ç¥ã£ãŠããŸãã
ç°¡åãªäŸãèããŠã¿ãŸãããã
ãŠãŒã¶ãŒãæåã®ã·ã£ãŒãã«ããããŒãèŠæ±ãããšããŸãã 圌ã¯æåã®ç Žçããçµã³ç®ã«å
¥ããŸãã ãªããªã 圌ã¯ãªãŒããŒã誰ã§ããããç¥ã£ãŠããããªã¯ãšã¹ãã¯ãªãŒããŒã«ãªãã€ã¬ã¯ããããããŒãåãåã£ããæžã蟌ãã ãããŠãå¿çããŠãŒã¶ãŒã«è¿ãããŸãã
ããã§ããŠãŒã¶ãŒãåãããŒãã«æ¥ãŠãå®éã«2çªç®ã®ã·ã£ãŒãã«ããããŒãå¿
èŠã ãšããŸãã åãããšïŒæåã®ã·ã£ãŒãã¯ã2çªç®ã®ã·ã£ãŒãã誰ã§ããããç¥ã£ãŠããããã®ããŒãã«è¡ããããŒã¿ãåä¿¡ãŸãã¯æžã蟌ã¿ããŠãŒã¶ãŒã«æ»ããŸãã
éåžžã«åçŽãªã¹ããŒã ã§ãããããã«ã¯å°é£ããããŸãã äž»ãªåé¡ïŒæ¥ç¶ãå€ãããŸããïŒ ã¹ããŒã ã§ã¯ãåããŒããããããã«æ¥ç¶ããããšã6 * 5-30ã®æ¥ç¶ãååŸãããŸãã ã·ã£ãŒãããã1ã€å
¥ããŸã-ã¯ã©ã¹ã¿ãŒã§æ¢ã«72ã®æ¥ç¶ãååŸããŠããŸãã å€ãããã
ãã®åé¡ã次ã®ããã«è§£æ±ºããŸããTarantoolsãããã€ãé
眮ããã·ã£ãŒããŸãã¯ããŒã¹ã§ã¯ãªããã·ã£ãŒãã£ã³ã°ã®ã¿ãæ±ããããã·ãåŒã³åºããŸããããŒãèšç®ãããã®ã·ã£ãŒããŸãã¯ãã®ã·ã£ãŒãã®ãªãŒããŒãèŠã€ããRaftãã¯ã©ã¹ã¿ãŒåããŸããå
åçã§ãããç Žçèªäœã®å
éšã§ã®ã¿æ©èœããŸãã ã¯ã©ã€ã¢ã³ãããããã·ã«æ¥ããšãã¯ã©ã€ã¢ã³ãã¯å¿
èŠãªã·ã£ãŒããèšç®ãããªãŒããŒãå¿
èŠãªå Žåã¯ãªãŒããŒã«ãªãã€ã¬ã¯ãããŸãã 誰ã§ãããŸããªãå Žåã¯ããã®ã·ã£ãŒãããä»»æã®ããŒãã«ãªãã€ã¬ã¯ãããŸãã

ããŒãã®æ°ã«å¿ããŠãè€éãã¯çŽç·çã§ãã åããŒãã«3ã€ã®ããŒããæã€3ã€ã®ã·ã£ãŒããããå Žåãæ¥ç¶ã¯äœåãå°ãªããªããŸãã
ãããã·ã¹ããŒã ã¯ã3ã€ä»¥äžã®ã·ã£ãŒããããå Žåã«ããã«ã¹ã±ãŒãªã³ã°ããããã«èšèšãããŠããŸãã ã·ã£ãŒãã2ã€ããå Žåãæ¥ç¶ã®æ°ã¯åãã§ãããã·ã£ãŒãã®æ°ãå¢ãããšãæ¥ç¶ã倧å¹
ã«ç¯çŽãããŸãã ã·ã£ãŒãã®ãªã¹ãã¯Lua configã«ä¿åãããŸããæ°ãããªã¹ããååŸããã«ã¯ãã³ãŒãããªããŒãããã ãã§ãã¹ãŠãæ©èœããŸãã
ããã§ãç§ãã¡ã¯master-masterããå§ããRaftãå®è£
ããããã«ã·ã£ãŒãã£ã³ã°ããã蟌ã¿ããã®åŸãããã·ã§ãã¹ãŠãæžãçŽããŸããã ããã¯ã¬ã³ã¬ãã¯ã©ã¹ã¿ãŒã«ãªããŸããã åè·¯ã¯éåžžã«ã·ã³ãã«ã«ãªããŸããã
ç§ãã¡ã®ããã³ããšã³ãã¯æ®ã£ãŠãããããŒã¯ã³ãå
¥ãããåãåã£ããããã ãã§ãã ããŒã¯ã³ãæŽæ°ãããªãã¬ãã·ã¥ããŒã¯ã³ãååŸããOAuthãããã€ããŒã«æž¡ããæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãé
眮ãããªãã¬ãã·ã£ãŒããããŸãã
ããã»ããµãªãœãŒã¹ãäžè¶³ããããããŸã ã»ã«ã³ããªããžãã¯ããããšèšããŸããã å¥ã®ã¯ã©ã¹ã¿ãŒã«è»¢éããŠã¿ãŸãããã
ãã®ãããª2次ããžãã¯ã«ã¯ãäž»ã«ã¢ãã¬ã¹åž³ãå«ãŸããŸãã ãŠãŒã¶ãŒããŒã¯ã³ãããå Žåããã®ãŠãŒã¶ãŒã®ã¢ãã¬ã¹åž³ã¯ããã«å¯Ÿå¿ããŸãã ãããŠãéã«é¢ããããŒã¿ã¯ããŒã¯ã³ãšåããããå€ããããŸãã 1å°ã®ãã·ã³ã§ããã»ããµãªãœãŒã¹ãäžè¶³ããªãããã«ããã«ã¯ãæããã«åãã¯ã©ã¹ã¿ãŒãå¿
èŠã§ãå床è€è£œããå¿
èŠããããŸãã ã¢ãã¬ã¹åž³ãæ¢ã«æŽæ°ããããã«ãä»ã®ãªãã¬ãã·ã£ãŒãå€æ°é
眮ããŸãïŒããã¯ãŸããªã¿ã¹ã¯ãªã®ã§ãã¢ãã¬ã¹åž³ãããŒã¯ã³ã§æŽæ°ããŸããïŒã
ãã®çµæããã®ãããª2ã€ã®ã¯ã©ã¹ã¿ãŒãçµã¿åãããŠãã·ã¹ãã å
šäœã®éåžžã«åçŽãªã¢ãŒããã¯ãã£ãååŸããŸããã

ããŒã¯ã³æŽæ°ãã¥ãŒ
ãªãç§ãã¡ã¯ã¿ãŒã³ãããã®ã§ããïŒ æšæºçãªãã®ããšãããšã¯å¯èœã§ããã ãã€ã³ãã¯ãããŒã¯ã³æŽæ°ã¢ãã«ã«ãããŸãã ããŒã¯ã³ãåãåã£ãåŸãããã¯1æéçããŸãã ã¢ã¯ã·ã§ã³ã®çµäºæãæ¥ãããæŽæ°ããå¿
èŠããããŸãã ãããæéåŸ
ã¡è¡åã§ããããŒã¯ã³ã¯äžå®æéåã«æŽæ°ããå¿
èŠããããŸãã

çæçã§ããããšãªããããšãåæ¢ãçºçãããšä»®å®ããŸãããäžå®éã®æéåãããŒã¯ã³ããããŸãã ããããæŽæ°ãããšãããã«ããã€ãã¯å»æ¢ãããŸãã ãã¡ããããã¹ãŠã«è¿œãã€ããŸãããæåã«ïŒ60ç§åŸã«ïŒæ»ã«ãããªãã®ãæŽæ°ãã次ã«æ®ãã®ãªãœãŒã¹ã§æ¢ã«æ»ãã ãã®ãæŽæ°ããæ¹ãè¯ãã§ãããã æåŸã«ãé ãå°å¹³ç·ïŒæ»ãŸã§5åïŒãæŽæ°ããŸãã
ãµãŒãããŒãã£ã«ãã®ããžãã¯ãå®è£
ããã«ã¯ãæ±ããããªããã°ãªããŸããã Tarantoolã®å Žåãããã¯éåžžã«ç°¡åã§ãã åçŽãªã¹ããŒã ãèããŠã¿ãŸããããTarantoolããŒã¿ãé
眮ãããŠããã¿ãã«ããããããçš®ã®èå¥åIDããããããã«ãã£ãŠäž»ããŒããããŸãã ãããŠãå¿
èŠãªãã¥ãŒãäœæããã«ã¯ãã¹ããŒã¿ã¹ãšæéã®2ã€ã®ãã£ãŒã«ããè¿œå ããã ãã§ãã ã¹ããŒã¿ã¹ã¯ããã¥ãŒå
ã®ããŒã¯ã³ã®ç¶æ
ã瀺ããŸããæéã¯åãæå¹æéã§ãã

ãã¥ãŒãã2ã€ã®äž»èŠãªé¢æ°ã put
ãštake
ãŸãããã put
ã®ã¿ã¹ã¯ã¯ãããŒã¿ãæã£ãŠããããšã§ãã äœããã®ãã€ããŒããæäŸãã put
èªäœãã¹ããŒã¿ã¹ãæéãèšå®ããããŒã¿ãé
眮ããŸãã æ°ããtuple
ã衚瀺ãããŸãã
take
ã«æ¥take
ãã€ã³ããã¯ã¹ãèŠãŠãã ããã ã€ãã¬ãŒã¿ãäœæãã調ã¹å§ããŸãã åŸ
æ©äžã®ã¿ã¹ã¯ïŒæºåå®äºïŒãéžæããããããååŸããæéãæ¥ããã©ããããŸãã¯æéåããã©ããã確èªããŸãã ã¿ã¹ã¯ããªãå Žåã take
ã¯ã¹ã¿ã³ãã€ã¢ãŒãã«ãªããŸãã Tarantoolã®çµã¿èŸŒã¿Luaã«å ããŠããã¡ã€ããŒéã®åæã®ããªããã£ãïŒãã£ãã«ïŒããããŸãã ã©ããªãã¡ã€ããŒã§ããã£ãã«ãäœæããŠããç§ã¯ããã§åŸ
ã£ãŠããŸãããšèšãããšãã§ããŸãã ä»ã®ãã¡ã€ããŒã¯ããã®ãã£ãã«ããŠã§ã€ã¯ã¢ããããŠãã¡ãã»ãŒãžãéä¿¡ã§ããŸãã
ã¿ã¹ã¯ã解æŸãããæéã®å°æ¥ããŸãã¯ä»ã®äœããåŸ
ã€é¢æ°ã¯ããã£ãã«ãäœæããç¹å¥ãªæ¹æ³ã§ã©ãã«ãä»ããã©ããã«é
眮ããŠããåŸ
æ©ããŸãã ç·æ¥ã«æŽæ°ããå¿
èŠã®ããããŒã¯ã³ãç§ãã¡ã«æã£ãŠããããäŸãã°put
ããããŠãã®ãã£ã³ãã«ã«éç¥ãéä¿¡ããŸãã
Tarantoolã«ã¯1ã€ã®ç¹åŸŽããããŸãïŒäœããã®ããŒã¯ã³ã誀ã£ãŠãªãªãŒã¹ãããå Žåã誰ããããããªãã¬ãã·ã¥ã«äœ¿çšããããã¿ã¹ã¯ãå®è¡ããããããšãã¯ã©ã€ã¢ã³ãæ¥ç¶ã®åæã远跡ã§ããŸãã ã»ãã·ã§ã³ã¹ã¿ãã·ã¥ã§ã¯ãã©ã®æ¥ç¶ãã©ã®ã¿ã¹ã¯ãçºè¡ããããèŠããŠããŸãã ãã®ãããªã¿ã¹ã¯ããã®ã»ãã·ã§ã³ã«é¢é£ä»ããŸãã æŽæ°ããã»ã¹ãã¯ã©ãã·ã¥ãããããã¯ãŒã¯ãç Žå£ããããšä»®å®ããŸã-ããŒã¯ã³ãæŽæ°ãããã©ãããæ»ãããšãã§ãããã©ããã¯ããããŸããã åæãããªã¬ãŒãããã»ãã·ã§ã³å
ã®ãã¹ãŠã®ã¿ã¹ã¯ãæ€åºãããèªåçã«è§£æŸãããŸãã put
, .
, :
function put(data) local t = box.space.queue:auto_increment({ 'r', util.time(), data }) return t end function take(timeout) local start_time = util.time() local q_ind = box.space.tokens.index.queue local _,t while true do local it = util.iter(q_ind, {'r'}, { iterator = box.index.GE }) _,t = it() if t and t[F.tokens.status] ~= 't' then break end local left = (start_time + timeout) - util.time() if left <= 0 then return end t = q:wait(left) if t then break end end t = q:taken(t) return t end function queue:taken(task) local sid = box.session.id() if self._consumers[sid] == nil then self._consumers[sid] = {} end local k = task[self.f_id] local t = self:set_status(k, 't') self._consumers[sid][k] = { util.time(), box.session.peer(sid), t } self._taken[k] = sid return t end function on_disconnect() local sid = box.session.id local now = util.time() if self._consumers[sid] then local consumers = self._consumers[sid] for k,rec in pairs(consumers) do time, peer, task = unpack(rec) local v = box.space[self.space].index[self.index_primary]:get({k}) if v and v[self.f_status] == 't' then v = self:release(v[self.f_id]) end end self._consumers[sid] = nil end end
Put
space
, , , FIFO-, , .
take
, : . taken
, â , . on_disconnect
, , .
?
ãã¡ããã . , , . , . , . ( ). . , , , , , in memory, .
, , . â 7 tuple, . , .
ãŸãšãããš
outage, . .
. N 2 , -: , - . : Google, Microsoft, - OAuth-, .
, , , . Tarantool . ããããšã