MySQLã䜿çšããã¹ããŒãã¬ã¹ãUber Engineeringã®ã¹ã±ãŒã©ãã«ãªããŒã¿ã¹ãã¢ã®èšèš
ã€ã³ãã»ããŒã«ãã¬ãŒãã»ãã ã»ã³
2016幎1æ12æ¥
https://eng.uber.com/schemaless-part-one/

MySQLã䜿çšããã¹ããŒãã¬ã¹Uber EngineeringããŒã¿ãŠã§ã¢ããŠã¹ã®èšèšã ããã¯ãã¹ããŒãã¬ã¹ããŒã¿ãŠã§ã¢ããŠã¹ã«é¢ãã3éšæ§æã®èšäºã®ç¬¬1éšã§ãã
Project Mezzanineã§ã¯ã1ã€ã®Postgresã€ã³ã¹ã¿ã³ã¹ããUberããªããããŒã¿ãé«æ§èœã§ä¿¡é Œæ§ã®é«ãããŒã¿ãŠã§ã¢ããŠã¹ã§ããSchemalessã«ç§»è¡ããæ¹æ³ã説æããŸãã ã ãã®èšäºã§ã¯ããã®ã¢ãŒããã¯ãã£ãUberã€ã³ãã©ã¹ãã©ã¯ãã£ã«ããã圹å²ãããã³èšèšå±¥æŽã«ã€ããŠèª¬æããŸãã
æ°ããããŒã¿ããŒã¹ã®ããã®æŠã
2014幎ã®åãã«ãããªããæ°ã®å¢å ã«ããããŒã¿ããŒã¹ãªãœãŒã¹ã䜿ãæããããŸããã æ°ããéœåžãæ°ããæ è¡ã®ãã³ã«ç§ãã¡ã¯æ·±aã«å°ãããŸããããããæ¥ãUberã€ã³ãã©ã¹ãã©ã¯ãã£ã幎æ«ãŸã§ã«æ©èœããªããªãããšã«æ°ä»ããŸããã ç§ãã¡ã®ä»äºã¯ãUberã®ããŒã¿ããŒã¹ãã¯ãããžãŒãå€æŽããããšã§ãããããã¯ãäœã¶æãããã£ãä»äºã§ããããã®è§£æ±ºçãšããŠãäžçäžã®ãªãã£ã¹ããå€æ°ã®ãšã³ãžãã¢ãåŒãä»ããŸããã
ããããå€ãã®åçšããã³ãªãŒãã³ãœãŒã¹ãœãªã¥ãŒã·ã§ã³ãããã®ã«ããªãã¹ã±ãŒã©ãã«ãªããŒã¿ãŠã§ã¢ããŠã¹ãæ§ç¯ããã®ã§ããããïŒ æ°ããããŒã¿ãŠã§ã¢ããŠã¹ã«ã¯5ã€ã®éèŠãªèŠä»¶ããããŸããã
ããŒã¿ãŠã§ã¢ããŠã¹ã¯ ãPostgresã®ã€ã³ã¹ããŒã«ã«ã¯ãªãã£ãæ°ãããµãŒããŒãè¿œå ããããšã§ã容éãçŽç·çã«å¢å ãããããšãã§ããã¯ãã§ãã æ°ãããµãŒããŒãè¿œå ãããšã䜿çšå¯èœãªãã£ã¹ã¯é åãå¢å ããã·ã¹ãã ã®å¿çæéãççž®ãããŸãã
èšé²æã«ã¯ãããŒã¿ã¹ãã¬ãŒãžã®é«å¯çšæ§ãå¿ èŠã§ãã 以åã¯ãRedisã䜿çšããŠåçŽãªãããã¡ã¡ã«ããºã ãå®è£ ããŠãããããPostgresã®æžã蟌ã¿ã倱æããå Žåãæ è¡ã¯Redisã«ä¿åãããŠãããããåŸã§åè©Šè¡ã§ããŸãã ã¬ã³ãŒããRedisã«ä¿åãããPostgresã«ã¯ãŸã ä¿åãããŠããªãã£ãæç¹ã§ãè«æ±ãªã©ã®æ©èœã倱ããŸããã è¿·æã§ãããå°ãªããšãç§ãã¡ã¯æ ã倱ããŸããã§ããïŒ Uberã¯æéãšãšãã«æé·ããRedisããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã¯ã¹ã±ãŒã©ãã«ã§ã¯ãããŸããã ã¹ããŒãã¬ã¹ããŒã¿ã¹ãã¢ã¯ãRedisã䜿çšãããœãªã¥ãŒã·ã§ã³ãšåæ§ã®ã¡ã«ããºã ããµããŒãããã¯ãã§ããããèªã¿åããšæžã蟌ã¿ã®äžè²«æ§ãæäŸããŸãã
äŸåããã³ã³ããŒãã³ããšã¡ãã»ãŒãžã³ã°ããæ¹æ³ãå¿ èŠã§ã ã ãã®æç¹ã§åäœããŠããã·ã¹ãã ã§ã¯ãåãããã»ã¹å ã§äŸåã³ã³ããŒãã³ããé çªã«åŠçããŸããïŒããšãã°ã課éãåæãªã©ïŒã ãšã©ãŒãçºçããããããã»ã¹ã§ãããããã»ã¹ã®ããããã®ã¹ãããã倱æããå Žåãããã»ã¹ã®äžéšã®ã¹ããããæåãããšããŠããæåããããçŽãå¿ èŠããããŸããã ã¹ã±ãŒãªã³ã°ããªãã£ããããããã»ã¹ãããŒã¿ã®å€æŽã«å¿ããŠéå§ãããç¬ç«ããäžäœããã»ã¹ã«åå²ããããšèããŸããã Kafka 0.7ã«åºã¥ãéåæã¡ãã»ãŒãžã³ã°ã·ã¹ãã ãæ¢ã«ãããŸããã ããããããŒã¿ã倱ãããšãªãèµ·åããããšã¯ã§ããªãã£ãã®ã§ãåæ§ã®æ©èœãåããæ°ããã·ã¹ãã ãæè¿ããŸãããããŒã¿ã倱ãããšãªãæ©èœããŸãã
ã»ã«ã³ããªã€ã³ããã¯ã¹ãå¿ èŠã§ãã Postgresããé¢ããŠãããŸããããæ°ããããŒã¿ãŠã§ã¢ããŠã¹ã¯Postgresã¬ãã«ã§ã€ã³ããã¯ã¹ããµããŒãããããšã«ãªã£ãŠãããããåæ§ã«å¹ççã«ã»ã«ã³ããªã€ã³ããã¯ã¹ãæ€çŽ¢ã§ããŸããã
ããã·ã§ã³ã¯ãªãã£ã«ã«ãªããŒã¿ãå«ãŸããŠããããã絶察ã«ä¿¡é Œã§ããã·ã¹ãã ãå¿ èŠã§ãã åå3æã«ãããŒã¿ãŠã§ã¢ããŠã¹ãå¿çãããããžãã¹ãç Žå£ããããšèšãããå Žåãããã«åŸ©å ããããã®éçšæ å ±ããããŸããïŒ
åè¿°ã®èŠ³ç¹ãããCassandraãRiakãMongoDBãªã©ãåºã䜿çšãããŠãã代æ¿ã·ã¹ãã ã®å©ç¹ãšæœåšçãªå¶éãåæããŸããã補åïŒïŒ
ç·åœ¢ã®æ¡åŒµæ§ | æžã蟌ã¿ã¢ã¯ã»ã·ããªã㣠| ã¡ãã»ãŒãžã³ã° | äºæ¬¡ã€ã³ããã¯ã¹ | ä¿¡é Œæ§ | |
補å1 | â | â | â | ïŒâïŒ | â |
補å2 | â | â | â | ïŒâïŒ | ïŒâïŒ |
補å3 | â | â | â | ïŒâïŒ | â |
3ã€ã®ã·ã¹ãã ã¯ãã¹ãŠãæ°ãããµãŒããŒãè¿œå ããããšã§çŽç·çã«æ¡åŒµã§ããŸãããæžã蟌ã¿ã¢ã¯ã»ã¹æ§ã®é«ãã·ã¹ãã ã¯2ã€ã ãã§ãã ã©ã®ãœãªã¥ãŒã·ã§ã³ãããã«äœ¿ããã¡ãã»ãŒãžã³ã°ãå®è£ ããŠããªããããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§å®è£ ããå¿ èŠããããŸãã ãããã¯ãã¹ãŠã€ã³ããã¯ã¹ãæã£ãŠããŸãããå€ãã®ç°ãªãå€ã«ã€ã³ããã¯ã¹ãä»ããå Žåãã¹ãã£ãã¿ãŒã®ã£ã¶ãŒã³ãã³ãã䜿çšããŠãã¹ãŠã®ããŒãïŒã·ã£ãŒãïŒãããŒãªã³ã°ãããããã¯ãšãªãé ããªããŸãã
æåŸã«ãããžãã¹ã«ãšã£ãŠéèŠãªæ è¡ããŒã¿ãä¿åããå¿ èŠãããããã決å®ã¯æçµçã«ä¿¡é Œæ§ã«ãã£ãŠæ±ºå®ãããŸããã äžéšã®æ¢åã®ãœãªã¥ãŒã·ã§ã³ã¯ãçè«çã«ã¯ç¢ºå®ã«æ©èœããŸãã ãããããã®æœåšèœåãæ倧éã«çºæ®ããããã®éçšç¥èã¯ãããŸããïŒ å®éãç§ãã¡ã䜿çšããŠããæè¡ã ãã§ãªããç§ãã¡ã®ããŒã ã«ãã人ã ã«ã倧ããäŸåããŠããŸãã
2幎以äžåã«ãããã®ãªãã·ã§ã³ãæ€èšããæ è¡ã®ããŒã¿ãŠã§ã¢ããŠã¹ã䜿çšããå Žåã«ã¯é©çšã§ããªãããšãããã£ããããCassandraãšRiakã®äž¡æ¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®ä»ã®é åã«æ£åžžã«é©çšããæ°çŸäžäººã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããããã«æ¬çªç°å¢ã§äœ¿çšããŠããŸãã
Schemalessã§ã¯ãä¿¡é Œæ§ããããŸãã
äžèšã®ãªãã·ã§ã³ã¯ãããããæéæ ã«å¿ããèŠä»¶ã«å¯Ÿå¿ããŠããªãã£ããããä»ã®äººããã®ã¹ã±ãŒãªã³ã°ã¬ãã¹ã³ã䜿çšããŠãã§ããã ãäœæ¥ãç°¡åãªç¬èªã®ã·ã¹ãã ãäœæããããšã«ããŸããã èšèšã¯Friendfeedã«è§Šçºããããã³ã¿ãŒãºã«è§Šçºãããéçšé¢ã«çŠç¹ãåœãŠãããŸããã
ããŒãšå€ã®ã¹ãã¬ãŒãžãèšèšããå¿ èŠããããšããçµè«ã«éããŸãããããã«ãããå³å¯ãªã¹ããŒãæ€èšŒãªãã§JSONããŒã¿ãä¿åã§ããããã«ãªããŸãïŒãã®ãããã¹ããŒãã¬ã¹ãšããååã«ãªããŸãïŒã ã·ã£ãŒãã«åæ£ãããMySQLãµãŒããŒã«å®è£ ããããã©ãŒã«ããã¬ã©ã³ã¹ã®ããã®æžã蟌ã¿ãããã¡ãªã³ã°ãšãããªã¬ãŒåŒã³åºãã«åºã¥ãããŒã¿å€æŽã«é¢ãããããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¡ãã»ãŒãžã³ã°ãåããŠããŸãã æåŸã«ãã¹ããŒãã¬ã¹ããŒã¿ã¹ãã¢ã¯ã°ããŒãã«ã€ã³ããã¯ã¹ããµããŒãããŸãã
ã¹ããŒãã¬ã¹ããŒã¿ã¢ãã«
Schemalessã¯ãGoogleã®Bigtableã«äŒŒããè¿œå ã®ã¿ã®ã¹ããŒã¹ãª3次å ããã·ã¥ãããã§ãã Schemalessã®æå°ã®ããŒã¿ãªããžã§ã¯ãã¯ã»ã«ãšåŒã°ããäžå€ã§ãã èšé²åŸã¯ãå€æŽãŸãã¯åé€ã§ããŸããã ã»ã«ã¯JSONïŒBLOBïŒãªããžã§ã¯ãã§ãããè¡ããŒãååãããã³refããŒãšåŒã°ããåç §ããŒã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸãã è¡ããŒã¯UUIDãååã¯è¡ãåç §ããŒã¯æŽæ°ã§ãã
è¡ããŒããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®äž»ããŒãšããŠãååããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®åãšããŠè¡šãããšãã§ããŸãã ãã ããSchemalessã«ã¯äºåå®çŸ©ãŸãã¯åŒ·å¶ãããã¹ããŒãããªããååã¯è¡ã«å¯ŸããŠäºåå®çŸ©ãããŠããŸããã å®éãåã®ååã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠå®å šã«æ±ºå®ãããŸãã åç §ããŒã¯ãã»ã«ã®ããŒãžã§ã³ç®¡çã«äœ¿çšãããŸãã ãããã£ãŠãã»ã«ãæŽæ°ããå¿ èŠãããå Žåã¯ãããé«ãåç §ããŒã䜿çšããŠæ°ããã»ã«ãäœæããå¿ èŠããããŸãïŒæåŸã®ã»ã«ãæãé«ãåç §ããŒãæã¡ãŸãïŒã refããŒã¯é åã®ã€ã³ããã¯ã¹ãšããŠã䜿çšã§ããŸãããéåžžã¯ããŒãžã§ã³ç®¡çã«äœ¿çšãããŸãã refããŒã®äœ¿çšæ¹æ³ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠæ±ºå®ãããŸãã
éåžžãã¢ããªã±ãŒã·ã§ã³ã¯é¢é£ããŒã¿ã1ã€ã®åãåã«ã°ã«ãŒãåããååã®ãã¹ãŠã®ã»ã«ã¯ã¢ããªã±ãŒã·ã§ã³åŽã§ã»ãŒåãã¹ããŒããæã¡ãŸãã ãã®ã°ã«ãŒãåã¯ãå€åããããŒã¿ãçµåããåªããæ¹æ³ã§ãããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹åŽã§ããŠã³ã¿ã€ã ãçºçãããããšãªãã¹ããŒããè¿ éã«å€æŽã§ããããã«ããŸãã 以äžã«äŸã瀺ããŸãã
äŸïŒã¹ããŒãã¬ã¹æ è¡ããŒã¿ã®ä¿å
Schemalessãžã®æ è¡ãã·ãã¥ã¬ãŒãããæ¹æ³ã«é£ã³èŸŒãåã«ãUberãžã®æ è¡ã®è§£ååŠãèŠãŠã¿ãŸãããã æ è¡ããŒã¿ã¯ããŸããŸãªæç¹ã§çæãããŸããããšãã°ãæ è¡ã®çµãããæ è¡ã®æ¯æãããããã®ããŸããŸãªæ å ±ã¯éåæã«å°çããŸãã 以äžã®å³ã¯ããŠãŒããŒæ è¡ã®ããŸããŸãªéšåãçºçããå Žåã®ç°¡ç¥åããããããŒã§ãã

ãã®å³ã¯ãã€ãã³ããããŒã®ç°¡ç¥çã瀺ããŠããŸãã *ã¯ãªãã·ã§ã³ã§ãããè€æ°åååšããå¯èœæ§ã®ããéšåã瀺ããŸãã
æ è¡ã¯ã顧客ã®æ³šæãå±¥è¡ããéå§ãšçµäºã®ã¿ã€ã ã¹ã¿ã³ããæã€é転æã«ãã£ãŠé£çµ¡ãããŸãã ãã®æ å ±ã¯åºæ¬çãªïŒæšå®ïŒæ è¡ã§ãããããããæ è¡ã®æéïŒæéïŒãèšç®ããŸããããã¯ã¯ã©ã€ã¢ã³ãã®æéã§ãã æ è¡åŸãéè³ã®èª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã ã¯ã©ã€ã¢ã³ããŸãã¯ãã©ã€ããŒïŒäžèšã®å³ã«ã¢ã¹ã¿ãªã¹ã¯ã§ããŒã¯ïŒããã®ã¬ãã¥ãŒãèæ ®ããŠãæ è¡ã«ã¡ã¢ãè¿œå ã§ããŸãã ãŸãã¯ãã«ãŒãã®1ã€ããããã¯ãããŠããå Žåãã¯ã©ã€ã¢ã³ãã¯æ è¡ã®ä»£éãæ¯æãã«ãŒãã§äœåºŠãæ¯æãå¿ èŠããããŸãã Uberã§ã®ã€ãã³ãã®ãããŒã¯ãããŒã¿é§ååã®ããã»ã¹ã§ãã æ è¡äžã«ããŒã¿ãå©çšå¯èœãŸãã¯è¿œå ããããšãç¹å®ã®äžé£ã®ããã»ã¹ãå®è¡ãããŸãã ãµãŒãã¹ã®è³ªã®è©äŸ¡ãªã©ã®äžéšã®æ å ±ïŒäžã®å³ã®ã¡ã¢ã®äžéšãšèããããïŒã¯ãæ è¡ã®æ°æ¥åŸã«çºçããå ŽåããããŸãã
ã§ã¯ãäžèšã®æ è¡ã¢ãã«ãšSchemalessãã©ã®ããã«æ¯èŒããŸããïŒ
æ è¡ããŒã¿ã¢ãã«
ã€ã¿ãªãã¯äœã䜿çšããŠUUIDã瀺ãã倧æåã䜿çšããŠååã瀺ããŸãã以äžã®è¡šã¯ãæ è¡ãªããžããªã®ç°¡æããŒãžã§ã³ã®ããŒã¿ã¢ãã«ã瀺ããŠããŸãã 2ã€ã®æ è¡ïŒUUID trip_uuid1ãštrip_uuid2ïŒãš4ã€ã®åïŒBASEãSTATUSãNOTESãFARE ADJUSTMENTïŒããããŸãã åã»ã«ã¯ãçªå·ãšJSONãªããžã§ã¯ãïŒç¥ç§°{...}ïŒãæã€ãããã¯ã§è¡šãããŸãã ããŒãžã§ã³ç®¡çãè¡šãããã«ãããã¯ãéããŠè¡šç€ºãããŸãã

trip_uuid1ã«ã¯3ã€ã®ã»ã«ããããŸãã1ã€ã¯BASEåã«ã2ã€ã¯STATUSåã«ãFARE ADJUSTMENTsåã«ã¯ãããŸããã trip_uuid2ã®BASEåã«ã¯2ã€ã®ã»ã«ãããã1ã€ã¯NOTESåã«ãããFARE ADJUSTMENTSåã«ããããŸãã ã¹ããŒãã¬ã¹ã®å Žåãåã«éãã¯ãããŸããã ãããã£ãŠãåã®ã»ãã³ãã£ã¯ã¹ã¯ã¢ããªã±ãŒã·ã§ã³ïŒãã®å Žåã¯ã¡ã¶ãã³ãµãŒãã¹ïŒã«ãã£ãŠæ±ºå®ãããŸãã
ã¡ã¶ãã³ã§ã¯ãBASEã®åºæ¬ã»ã«ã«ããã©ã€ããŒã®UUIDãä¹è»æéãªã©ã®åºæ¬çãªä¹è»æ å ±ãå«ãŸããŠããŸãã STATUSåã«ã¯ãçŸåšã®æ è²»æ¯æãã¹ããŒã¿ã¹ãå«ãŸããŠãããè«æ±ã®è©Šè¡ããšã«æ°ããã»ã«ãæ¿å ¥ãããŸãã ïŒã¯ã¬ãžããã«ãŒãã«ååãªè³éããªãå ŽåããŸãã¯ã«ãŒãããããã¯ãããŠããå Žåãè©Šè¡ã¯å€±æããŸããïŒã ãã©ã€ããŸãã¯ãã£ã¹ãããã£ã«ãã£ãŠã¡ã¢ãæ®ã£ãŠããå ŽåãNOTESåã«ã¯ã»ã«ãå«ãŸããŸãã æåŸã«ãéè³ã調æŽãããŠããå ŽåãFARE ADJUSTMENTsåã«ã¯ã»ã«ãå«ãŸããŠããŸãã
ãã®åæ§é ã䜿çšããŠã競åç¶æ ãåé¿ããæŽæ°äžã«èšé²ããå¿ èŠãããããŒã¿ã®éãæå°éã«æããŸãã BASEåã¯ãæ è¡ã®å®äºæã«èšé²ãããéåžžã¯1åã ãèšé²ãããŸãã STATUSåã¯ãBASEåã«ããŒã¿ãæžã蟌ãã åŸã«çºçããæ è¡ã®ä»£éãæ¯æããšãã«èšé²ãããè«æ±æžã®æ¯æãã«å€±æããå Žåã«æ°åçºçããå¯èœæ§ããããŸãã NOTESåã¯ãBASEã¬ã³ãŒãã®åŸã®ããæç¹ã§è€æ°åæžã蟌ãããšãã§ããŸãããSTATUSåã¬ã³ãŒããšã¯å®å šã«åé¢ãããŠããŸãã åæ§ã«ãFARE ADJUSTMENTSåã¯ãããšãã°éå¹ççãªã«ãŒãã®ããã«éè³ãå€æŽãããå Žåã«ã®ã¿èšé²ãããŸãã
ãšã³ãããŒãšã³ãã®ããªã¬ãŒ
Schemalessã®äž»èŠãªæ©èœã¯ãSchemalessã®ã€ã³ã¹ã¿ã³ã¹ãžã®å€æŽãéç¥ã§ããããªã¬ãŒã§ãã ã»ã«ã¯äžå€ã§ãããæ°ããããŒãžã§ã³ãè¿œå ããããããåã»ã«ã¯å€æŽãŸãã¯ããŒãžã§ã³ãè¡šããã€ã³ã¹ã¿ã³ã¹ã®å€ãå€æŽãã°ãšããŠæ±ãããšãã§ããŸãã ãã®å Žåããããã®å€æŽããªãã¹ã³ããŠãKafkaãªã©ã®ã¡ãã»ãŒãžãã¹ã«éåžžã«é¡äŒŒããæ©èœãå®è¡ã§ããŸãã
ã¹ããŒãã¬ã¹ããªã¬ãŒã¯ãããŒã¿ãžã®çŽæ¥ã¢ã¯ã»ã¹ã«å ããŠãã¡ãã»ãŒãžã·ã¹ãã ãããªã¬ãŒæ©èœã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã³ãŒãïŒåæ§ã®ã·ã¹ãã ãLinkedBã®DataBusïŒãç£èŠããã³å®è¡ããããŒã¿ã®äœæãšåŠçãåé¢ã§ãããããã¹ããŒãã¬ã¹ãããŒã¿ã®ä¿¡é Œã§ãããœãŒã¹ã«ããŸãã
ä»ã®çšéã®äžã§ããUberã¯BASEåãã¡ã¶ãã³ã®ã€ã³ã¹ã¿ã³ã¹ã«æžã蟌ãŸãããšãã«ãã¹ããŒãã¬ã¹ããªã¬ãŒã䜿çšããŠè«æ±ããŸãã äžèšã®äŸã§ã¯ãtrip_uuid1ã«BASEåãæžã蟌ãŸãããšãBASEåã§å®è¡ããã課éãµãŒãã¹ããã®ã»ã«ãéžæããæ¯æãã«ãŒããä»ããŠæ è¡ã®æ¯æããè©Šã¿ãŸãã æåã倱æãã«é¢ä¿ãªããæ¯æãã«ãŒããä»ããæ¯æãã®çµæã¯ãã¹ããŒã¿ã¹åã®ã¡ã¶ãã³ã«èšé²ãããŸãã ãããã£ãŠãè«æ±ãµãŒãã¹ã¯æ è¡ã®äœæãšã¯å¥ã«ãSchemalessã¯éåæã¡ãã»ãŒãžãã¹ãšããŠæ©èœããŸãã

ã€ãŒãžãŒã¢ã¯ã»ã¹ã€ã³ããã¯ã¹
æåŸã«ãSchemalessã¯JSONãªããžã§ã¯ãã®ãã£ãŒã«ãã§å®çŸ©ãããã€ã³ããã¯ã¹ããµããŒãããŸãã ãããã®å®çŸ©æžã¿ãã£ãŒã«ããä»ããŠã€ã³ããã¯ã¹ã«ã¯ãšãªãå®è¡ããã¯ãšãªãã©ã¡ãŒã¿ã«äžèŽããã»ã«ãèŠã€ããŸãã ã€ã³ããã¯ã¹ã®ã¯ãšãªã¯ãè¿ãããã»ã«ã®ã»ãããèŠã€ããããã«ã¢ã¯ã»ã¹ããã·ã£ãŒãã1ã€ã ãå¿ èŠãšããããããããã®ã€ã³ããã¯ã¹ã®ã¯ãšãªã¯å¹æçã§ãã å®éãSchemalessã§ã¯ã€ã³ããã¯ã¹ã«çŽæ¥æžã蟌ãããšã§ã»ã«ããŒã¿ãéæ£èŠåã§ãããããã¯ãšãªãããã«æé©åã§ããŸãã ã€ã³ããã¯ã¹ã«éæ£èŠåããŒã¿ããããšããããšã¯ãã€ã³ããã¯ã¹ãã¯ãšãªããŠæ å ±ãååŸããããã«ã€ã³ããã¯ã¹ãã¯ãšãªããã®ã«å¿ èŠãªã·ã£ãŒãã¯1ã€ã ãã§ããããšãæå³ããŸãã å®éãéåžžãã¹ããŒãã¬ã¹ãŠãŒã¶ãŒã¯ãè¡ããŒãä»ããŠã»ã«ãçŽæ¥ååŸããããšã«å ããŠãé »ç¹ã«èŠæ±ãããããŒã¿ãã€ã³ããã¯ã¹ã«éæ£èŠåããããšããå§ãããŸãã
äŸãšããŠãã¡ã¶ãã³ã®å Žåãç¹å®ã®ãã©ã€ããŒã®æ è¡ãæ€çŽ¢ã§ããã€ã³ããã¯ã¹ããããŸãã ãŸããæ è¡ã®äœææéãšæ è¡ãè¡ãããéœåžãéæ£èŠåããŸããã ããã«ãããäžå®æéãåžå ã®ãã©ã€ããŒã®ãã¹ãŠã®æ è¡ãæ€çŽ¢ã§ããŸãã 以äžã«ãæ è¡ããŒã¿ã¹ãã¬ãŒãžã®äžéšã§ãããBASEåã®äžã«å®çŸ©ãããŠããYAML圢åŒã®driver_partner_indexã€ã³ããã¯ã¹ã®å®çŸ©ã瀺ããŸãïŒäŸã«ã¯æšæºïŒã䜿çšããŠã³ã¡ã³ããä»ããããŠããŸãïŒã
table: driver_partner_index # Name of the index. datastore: trips # Name of the associated datastore column_defs: â column_key: BASE # From which column to fetch from. fields: # The fields in the cell to denormalize â { field: driver_partner_uuid, type: UUID} â { field: city_uuid, type: UUID} â { field: trip_created_at, type: datetime}
ãã®ã€ã³ããã¯ã¹ã䜿çšããŠãcity_uuidããã³/ãŸãã¯trip_created_atã§ãã£ã«ã¿ãªã³ã°ããããæå®ãããdriver_partner_uuidã®æ è¡ãæ€çŽ¢ã§ããŸãã ãã®äŸã§ã¯ãBASEåã®ãã£ãŒã«ãã®ã¿ã䜿çšããŸãããSchemalessã¯è€æ°ã®åã®ããŒã¿ã®éæ£èŠåããµããŒãããŸããããã«ã¯ãäžèšã®column_defãªã¹ãã«è€æ°ã®ãšã³ããªãå«ãŸããŸãã
åè¿°ã®ããã«ãSchemalessã«ã¯ã圱ä»ããã£ãŒã«ãã«åºã¥ããŠã€ã³ããã¯ã¹ãã·ã£ãŒãã£ã³ã°ããããšã«ããå®è£ ãããå¹ççãªã€ã³ããã¯ã¹ããããŸãã ãããã£ãŠãã·ã§ãŒãã£ã³ã°ã€ã³ããã¯ã¹ã®å¯äžã®èŠä»¶ã¯ãã€ã³ããã¯ã¹å ã®ãã£ãŒã«ãã®1ã€ãã·ã§ãŒãã£ã³ã°ãã£ãŒã«ããšããŠæå®ãããŠããããšã§ãïŒäžèšã®äŸã§ã¯ãæåã«æå®ãããŠãããããdriver_partner_uuidã«ãªããŸãïŒã ã·ã£ãŒããã£ãŒã«ãã¯ãã€ã³ããã¯ã¹ãæžã蟌ã¿ãŸãã¯èªã¿åãã·ã£ãŒãã決å®ããŸãã ãããè¡ãã«ã¯ãã€ã³ããã¯ã¹ã®ã¯ãšãªæã«ã·ã£ãŒããã£ãŒã«ãã決å®ããå¿ èŠããããŸãã ããã¯ãã¯ãšãªã®æç¹ã§ãã€ã³ããã¯ã¹ãšã³ããªãååŸããã·ã£ãŒãã1ã€ã ãèŠæ±ããå¿ èŠãããããšãæå³ããŸãã ã·ã£ãŒããã£ãŒã«ãã®éèŠãªèŠä»¶ã¯ãã·ã£ãŒãéã§ããŒã¿ãé©åã«åæ£ããå¿ èŠãããããšã§ãã UUIDãæé©ã§ãããéœåžã®èå¥åã¯åªå 床ãäœããã¹ããŒã¿ã¹ïŒåæïŒãã£ãŒã«ãã¯å®³ããã害ã倧ãããªããŸãã
ã·ã£ãŒããã£ãŒã«ããé€ããSchemalessã¯ãçå€ãäžçãããã³ãã£ã«ã¿ãªã³ã°ã®ã¯ãšãªããµããŒãããã€ã³ããã¯ã¹å ã®ãã£ãŒã«ãã®ãµãã»ããã®ã¿ãéžæããã€ã³ããã¯ã¹ã¬ã³ãŒããæãè¡ããŒã®ç¹å®ãŸãã¯ãã¹ãŠã®åãååŸããããšããµããŒãããŸãã çŸåšãã·ã£ãŒããã£ãŒã«ãã¯äžå€ã§ããå¿ èŠããããŸããããã«ãããSchemalessã¯ããŒã¿ãååšããã·ã£ãŒããåç¬ã§æ±ºå®ã§ããŸãã ããããããã©ãŒãã³ã¹ã®ãªãŒããŒããããªãã§ãããå¯å€ã«ããæ¹æ³ãåŠãã§ããŸãã
ã€ã³ããã¯ã¹ã¯æçµçã«äžè²«ããŠããŸãã ã»ã«ã«ããŒã¿ãæžã蟌ããã³ã«ãã€ã³ããã¯ã¹ãšã³ããªãæŽæ°ããŸãããããã¯åäžã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã¯çºçããŸããã éåžžãã»ã«ãšã€ã³ããã¯ã¹ãšã³ããªã¯åãã·ã£ãŒãã«å±ããŸããã ãããã£ãŠãäžè²«æ§ã®ããã€ã³ããã¯ã¹ãå®è£ ããå Žåãæžã蟌ã¿æã«2ãã§ãŒãºã³ããããå°å ¥ããå¿ èŠããããããã«ã¯å€§ããªãªãŒããŒãããã䌎ããŸãã ãã®çµæãæçµçã«äžè²«ããã€ã³ããã¯ã¹ã䜿çšããŠãªãŒããŒããããåé¿ããŸãããã¹ããŒãã¬ã¹ãŠãŒã¶ãŒã¯ã€ã³ããã¯ã¹å ã®å€ãããŒã¿ãèŠãããšãã§ããŸãã ã»ãšãã©ã®å Žåãã©ã°ã¯ã»ã«ã®å€æŽãšå¯Ÿå¿ããã€ã³ããã¯ã¹ã®å€æŽã®éã§20ããªç§ãããå€§å¹ ã«çããªã£ãŠããŸãã
ãŸãšã
ããŒã¿ã¢ãã«ãããªã¬ãŒãããã³ã€ã³ããã¯ã¹ã®æŠèŠãæäŸããŸããããããã¯ãæ è¡ããŒã¿ã¹ãã¬ãŒãžãšã³ãžã³ã®ã³ã¢ã³ã³ããŒãã³ãã§ããSchemalessãå®çŸ©ããéèŠãªæ©èœã§ãã ä»åŸã®æçš¿ã§ã¯ã圌ãUberã€ã³ãã©ã¹ãã©ã¯ãã£ã®åªããã¢ã·ã¹ã¿ã³ãã«ãªã£ãæ¹æ³ã瀺ãããã«ãããã«ããã€ãã®Schemalessé¢æ°ãèŠãŠãããŸããã¢ãŒããã¯ãã£ã®è©³çŽ°ãMySQLãã·ã£ãŒããšããŠäœ¿çšããæ¹æ³ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ã確ä¿ããããã®ãšã©ãŒåŠçæ¹æ³ã§ãã
ããŒã2ïŒã¹ããŒãã¢ãŒããã¯ãã£
ããŒã3ïŒã¹ããŒãã¬ã¹ã§ããªã¬ãŒã䜿çšãã
Jakob Thomsenã¯ãSchemalessãããžã§ã¯ãã®ãœãããŠã§ã¢ãšã³ãžãã¢ããã³æè¡ãªãŒããŒã§ããããã³ããŒã¯ã®ãªãŒãã¹ã«ããUber Engineeringãªãã£ã¹ã§åããŠããŸãã Schemalessã®è©³çŽ°ã«ã€ããŠã¯ã2015幎9æã«éå¬ãããFacebookã®2åç®ã®@Scaleã«ã³ãã¡ã¬ã³ã¹ã§ã®è¬æŒãã芧ãã ããã
ããããŒã®åçã¯ã¬ãžããïŒCC-BY 2.0ã§ã©ã€ã»ã³ã¹ãããŠããNOAA Photo Libraryã®ãanim1069ãã ããããŒã®ãµã€ãºãšè²ãä¿®æ£ãããç»åãããªãã³ã°ããŸããã
ããããŒã®èª¬æïŒSchemalessã¯MySQLã䜿çšããŠæ§ç¯ãããŠããããã䌌ããããªããŒãºããšããMySQLã®ããŽãšã¯éã®åãã®ã€ã«ã«ã䜿çšããã·ãªãŒãºã玹ä»ããŸãã