ããŒãšå€ã®ãã¢ã®ä¿åãªã©ãNoSQLã®äœ¿çšã·ããªãªãèŠããšãããã©ãŒãã³ã¹ã䜿ãããããå®å®æ§ã®ç¹ã§MySQLãæãŸããããšãããããŸãã MySQLã¯ãåºæ¬çãªæäœããšã©ãŒè§£æããè€è£œãããŸããŸãªäœ¿çšãã¿ãŒã³ã«è³ããŸã§ã®ãã¹ãŠã®ãããã¯ã網çŸ
ããè±å¯ãªãªã³ã©ã€ã³è³æãåããå
ç¢ãªã·ã¹ãã ã§ãã ããã«ãããMySQLã¯ãã®ãããªçµéšã®ãªãè¥ãNoSQLã·ã¹ãã ãããæå©ã«ãªããŸãã
è¿å¹ŽãNoSQLã·ã¹ãã ãäž»æµã«ãªããŸããã å€ãã®éçºè
ã¯ãMongoDBãCassandraãRedisãHadoopãªã©ã®NoSQLã·ã¹ãã ã§ãå€ãSQLã·ã¹ãã ãæžäŸ¡ãããåäžã®è£œåãã¡ããªãšèŠãªããŠãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æè¯ã®ãªãã·ã§ã³ãèªèããŠããŸãã
å€ãã®å ŽåãNoSQLããŒã¿ããŒã¹ã䜿çšãã決å®ã¯ã宣äŒã®èªå€§åºåãŸãã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã¯NoSQLããŒã¿ããŒã¹ãšåãããã©ãŒãã³ã¹ãæäŸã§ããªããšãã誀ã£ã信念ã«åºã¥ããŠããŸãã ããŒã¿ããŒã¹ã®éžæã«é¢ããŠã¯ãæè¡è
ã¯éçšã³ã¹ãã ãã§ãªããæè¡ã®å®å®æ§ãšæç床ã«é¢ããèæ
®äºé
ãèŠèœãšããã¡ã§ãã ããŸããŸãªNoSQLïŒããã³SQLïŒã·ã¹ãã ã®å¶éãšæ¬ é¥ã®è©³çŽ°ã«ã€ããŠã¯ãAphyr.comã§å
¬éãããŠããJepsenãããžã§ã¯ãã·ãªãŒãºãã芧ãã ããã
ãã®èšäºã§ã¯ãMySQLã䜿çšããŠããŒãšå€ã®ãã¢ãä¿åããæ¹ããã»ãšãã©ã®ç¹æ®ãªNoSQLã·ã¹ãã ãããåªããŠããçç±ã説æããMySQLã®äœ¿çšæé ã瀺ããŸãã
Wixãµã€ãã®å®çŸ©
誰ããWixãµã€ãã®ãªã³ã¯ãã¯ãªãã¯ãããšããã©ãŠã¶ã¯ãµã€ãã¢ãã¬ã¹ãšãšãã«WixãµãŒããŒã«HTTPãªã¯ãšã¹ããéä¿¡ããŸãã ããã¯ãç¬èªã®ãã¡ã€ã³ïŒdomain.comãªã©ïŒãæã€Wixãã¬ãã¢ã Webãµã€ããšãWixãµããã¡ã€ã³ïŒuser.wix.com/siteãªã©ïŒã«ç¡æã®Webãµã€ããããå Žåã§ãã ãµãŒããŒã¯ãURLãµã€ããã¢ã®ããŒãšå€ã®æ€çŽ¢ãå®è¡ããŠããµã€ãã¢ãã¬ã¹ã§èŠæ±ããããµã€ããèªèããå¿
èŠããããŸãã 次ã®èª¬æã§ã¯ãURLããã«ãŒãããšããŠæå®ããŸãã
ã«ãŒãããŒãã«ã¯ããµã€ãã¢ãã¬ã¹ããµã€ããªããžã§ã¯ãã«å€æããããã«äœ¿çšãããŸãã ããŸããŸãªãã¹ã䜿çšããŠãµã€ãã«ã¢ã¯ã»ã¹ã§ãããããå€å¯Ÿ1ã®é¢ä¿ããããŸãã ãµã€ããèŠã€ãããšãã¢ããªã±ãŒã·ã§ã³ã¯ãã®ãµã€ããããŠã³ããŒãããŠæäœããŸãã 次ã«ããµã€ããªããžã§ã¯ãã¯è€éãªæ§é ãæã¡ãããã«ã¯ããµã€ãã§äœ¿çšãããããŸããŸãªãµãŒãã¹ã§ããåãªããžã§ã¯ãã®2ã€ã®ãªã¹ããå«ãŸããŸãã 以äžã¯æœèšã®ã¢ãã«äŸã§ãã ããã§ã¯ãæ£èŠåãããæ§é ãæã€æšæºSQLããŒã¿ããŒã¹ã䜿çšããããšä»®å®ããŸãã
åŸæ¥ã®æ£èŠåã¢ãã«ã§ãµã€ããæŽæ°ããå Žåããã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠè€æ°ã®ããŒãã«ãæŽæ°ããããŒã¿ã®æŽåæ§ã確ä¿ããå¿
èŠããããŸãïŒãã©ã³ã¶ã¯ã·ã§ã³ã¯ããŒã¿ããŒã¹ã¬ãã«ã®ããã¯ã䜿çšããé¢é£ããããŒãã«ããã®åææžã蟌ã¿ãèªã¿åããé²ãããšã«æ³šæããŠãã ããïŒã ãã®ãããªã¢ãã«ã§äœæ¥ãç¶ãããšãåããŒãã«ã®SERIALã¿ã€ãã®ããŒãå€éšããŒãã«ãŒãããŒãã«ã®URLãã£ãŒã«ãã®ã€ã³ããã¯ã¹ã«ãã©ãçãã§ãããã
ãã ããæ£èŠåã¹ããŒã ã«åºã¥ããããŒã¿ã®ã¢ããªã³ã°ã«ã¯ãå€ãã®è€éãªåé¡ã䌎ããŸãã
â¢ããã¯ã¯ããŒãã«ãžã®ã¢ã¯ã»ã¹ãå¶éããããã倧éã®ããŒã¿ããããšããã©ãŒãã³ã¹ãå¶éãããå¯èœæ§ããããŸãã
â¢ãªããžã§ã¯ããèªã¿åãã«ã¯ãããã€ãã®SQLã¯ãšãªïŒãã®å Žåã¯4ã€ïŒãŸãã¯JOINã®äœ¿çšãå¿
èŠã§ããããã¯é
延æéã«ã圱é¿ããŸãã
â¢SERIALå±æ§ãæã€ããŒã«ã¯ããã¯ãå¿
èŠã§ãããããæžã蟌ã¿ããã©ãŒãã³ã¹ãå¶éããŸãã
ãããã®åé¡ã¯ãMySQLïŒãŸãã¯ä»ã®SQLã·ã¹ãã ïŒãæäŸã§ãã垯åå¹
ãšã¯ãšãªã®äžŠååãå¶éããŸãã ãããã®åŒ±ç¹ãšãæ¬è³ªçã«ããŒãšå€ã®ãã¢ã§ãããšããäºå®ã«ãããå€ãã®éçºè
ã¯ãå®å®æ§ãæŽåæ§ãå¯çšæ§ãç ç²ã«ããŠããããã©ãŒãã³ã¹ãšäžŠååãåäžãããNoSQLãœãªã¥ãŒã·ã§ã³ãæ¢ãããšã奜ã¿ãŸãã
Wixã§ã¯ãMySQLãããŒãšå€ã®ãã¢ã®ã¹ãã¬ãŒãžãšããŠåµé çã«äœ¿çšãããšãæ£èŠåãããããŒã¿ã¢ãã«ïŒäžèšïŒã䜿çšããMySQLããããã»ãšãã©ã®NoSQLã·ã¹ãã ãããåªããåäœãããããšãããããŸããã çŸåšã®ã·ã¹ãã ã¯ãã¹ã±ãŒãªã³ã°ã垯åå¹
ãã¯ãšãªã®äžŠååãé
延æéãªã©ã®ãã©ã¡ãŒã¿ãŒãæäŸããNoSQLã·ã¹ãã ãå°éããŸãã ã·ã¹ãã ã®è©³çŽ°ã¯æ¬¡ã®ãšããã§ãã
â¢3ã€ã®ããŒã¿ã»ã³ã¿ãŒãžã®ã¢ã¯ãã£ãã€ã³ã¹ããŒã«ïŒactive-active-activeïŒã
â¢çŽ200,000 RPMã®ã¹ã«ãŒãããã
â¢ã«ãŒãããŒãã«ã«ã¯ãçŽ1å件ã®ã¬ã³ãŒãã10 GBã®ãã£ã¹ã¯å®¹éããããŸãã
â¢ãµã€ãããŒãã«ã«ã¯ãçŽ1åã®ã¬ã³ãŒãã200 GBã®ãã£ã¹ã¯é åããããŸãã
â¢å¹³åèªã¿åãé
延ã¯1.0ã1.5ããªç§ã§ãïŒå®éã«ã¯ã0.2ã0.3ããªç§ã1ã€ã®ããŒã¿ã»ã³ã¿ãŒã§ïŒã
é
延ã¯çŽ1.0ããªç§ã§ããããšã«æ³šæããŠãã ããã ããã¯ãã¯ã©ãŠãã·ã¹ãã ãšãªãŒãã³ãœãŒã¹ã·ã¹ãã ã®äž¡æ¹ãå«ããããŒãšå€ã®ãã¢ã§æ§ç¯ãããã»ãšãã©ã®ã·ã¹ãã ã§å°è±¡çãªææšãšèŠãªãããŸãã ãŸããMySQLïŒäžè¬çã«ä¿¡ããããŠããæãåçŽãªSQLã·ã¹ãã ïŒã䜿çšããŠãããå®çŸããŸããã
䜿çšããåè·¯ã¯æ¬¡ã®ãšããã§ãã
CREATE TABLE `routes` ( `route` varchar(255) NOT NULL, `site_id` varchar(50) NOT NULL, `last_update_date` bigint NOT NULL, PRIMARY KEY (`key`), KEY (`site_id`) ) CREATE TABLE `sites` ( `site_id` varchar(50) NOT NULL, `owner_id` varchar(50) NOT NULL, `schema_version` varchar(10) NOT NULL DEFAULT '1.0', `site_data` text NOT NULL, `last_update_date` bigint NOT NULL, PRIMARY KEY (`site_id`) ) ;
ã¯ãšãªæ¡ä»¶ãšããŠäœ¿çšãããŠããªããã¹ãŠã®ãã£ãŒã«ãã¯ãblobã¿ã€ãã®åäžãã£ãŒã«ãïŒããã¹ããã£ãŒã«ãsite_dataïŒã«çž®å°ãããŸããã ãµããªããžã§ã¯ãããŒãã«ãšãããŒãã«ãªããžã§ã¯ãèªäœã®ãã£ãŒã«ããå«ãŸããŸãã SERIALã¿ã€ãã®ããŒã¯äœ¿çšããããŠãŒã¶ãŒãäœæããGUIDå€æ°ãå«ãVARCHARïŒ50ïŒã¿ã€ãã®ãã£ãŒã«ãã䜿çšããããšã«æ³šæããŠãã ããïŒããã«ã€ããŠã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãïŒã
以äžã¯äœ¿çšããŠããã¯ãšãªã§ãã垯åå¹
ãåºããåŸ
ã¡æéãçãã§ãã
select * from sites where site_id = ( select site_id from routes where route = ? )
ããã§ã¯ãã«ãŒãããŒãã«ãžã®ã¯ãšãªã¯æåã«äžæã®ã€ã³ããã¯ã¹ã§å®è¡ãããã¯ãšãªã¯1ã€ã®å€ã®ã¿ãè¿ãå¿
èŠããããŸãã 次ã«ãäž»ããŒã䜿çšããŠãµã€ããåç
§ããåã³1ã€ã®å€ãæ¢ããŸãã ãã¹ããããæ§æã䜿çšãããšãããŒã¿ããŒã¹ãžã®1åã®åŒã³åºãã§äž¡æ¹ã®SQLã¯ãšãªãåŠçã§ããŸãã
äžèšã®çµæã«ã¯çŽ1ããªç§ããããŸãã é«ããã©ãã£ãã¯ãšé«ããªãã¬ãã·ã¥ã¬ãŒãã®æ¡ä»¶äžã§ã®äžè²«ããäœæ¥ã ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããªãå Žåã§ããåãã©ã³ã¶ã¯ã·ã§ã³ã®æŽæ°ã ããã¯ã1ã€ã®INSERTã³ãã³ãã䜿çšããŠãµã€ãå
šäœãå
¥åããã«ãŒãã«ããŒã¿ãå
¥åãããŸã§ããªã¯ãšã¹ãããããæ€åºããªãããã«å¯èœã§ãã ã€ãŸããæåã«ãµã€ãã«é¢ããããŒã¿ãå
¥åãã次ã«ãã¹ã«é¢ããããŒã¿ãå
¥åãããšãsitesããŒãã«ã®ããŒã¿ãæ¥ç¶ããããŸã§ãå¢çç·ã®ç¶æ³ã§ãã£ãŠãããŒã¿ã®æŽåæ§ã«èªä¿¡ããããŸãã
MySQLãNoSQLã·ã¹ãã ãšããŠäœ¿çšããããã®æé
äžèšã®äŸã§åŸãããçµéšïŒããã³Wixãã©ã¯ãã£ã¹ããã®ä»ã®åæ§ã®ã±ãŒã¹ïŒã䜿çšããŠãMySQLãNoSQLã·ã¹ãã ãšããŠäœ¿çšããããã®æšå¥šäºé
ã®çããªã¹ããäœæããŸããã
MySQLãNoSQLã·ã¹ãã ãšããŠäœ¿çšããéã«èŠããŠããã¹ãäž»ãªããšã¯ãããŒã¿ããŒã¹ã¬ãã«ã®ããã¯ãšè€éãªã¯ãšãªãåé¿ããããšã§ãã
â¢ãããã¯ã䌎ããã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããªãã§ãã ããã 代ããã«ãã¢ããªã±ãŒã·ã§ã³ã§ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŸãã
â¢SERIALã¿ã€ãã®ããŒã䜿çšããªãã§ãã ããã ãã®ãããªããŒã¯ãããã¯ã䌎ããã¢ã¯ãã£ã/ã¢ã¯ãã£ããã¥ãŒã®æ§æãè€éã«ããŸãã
â¢é¡§å®¢ãäœæããäžæã®ããŒã䜿çšããŸãã GUIDã䜿çšããŠããŸãã
èªã¿äžãã®æ§é ãæé©åããå Žåãããã€ãã®è¿œå ã®æšå¥šäºé
ã«æ³šæããŠãã ããã
â¢æ£èŠåãå®è¡ããªãã§ãã ããã
â¢ãã£ãŒã«ããããå Žå-ã€ã³ããã¯ã¹ãäœæããå¿
èŠããããŸãã ã€ã³ããã¯ã¹ã®ãã£ãŒã«ããäžèŠãªå Žåã¯ãBLOB / TEXTã¿ã€ãã®1ã€ã®ãã£ãŒã«ãã«ä¿åããŸãïŒJSONãŸãã¯XMLãšããŠïŒã
â¢å€éšããŒã䜿çšããªãã§ãã ããã
â¢ãªã¯ãšã¹ãã«å¿ããŠå¥ã®ã·ãªãŒãºãèªãããšãã§ããããã«æ§é ãèšèšããŸãã
â¢ALTER TABLEã¹ããŒãã¡ã³ãã䜿çšããªãã§ãã ããã ãããã®ã³ãã³ãã¯ãããã¯ãšäžæçãªéã¢ã¯ãã£ãæéã䌎ããŸãã 代ããã«ãã©ã€ã移è¡ããŒã¿ç§»è¡ã䜿çšããŠãã ããã
ããŒã¿ããªã¯ãšã¹ãããå ŽåïŒ
â¢äž»ããŒãŸãã¯ã€ã³ããã¯ã¹ã§ãšã³ããªãæ¢ããŸãã
â¢JOINã䜿çšããªãã§ãã ããã
â¢éçŽé¢æ°ã䜿çšããªãã§ãã ããã
â¢èŠªããŒã¹ã§ã¯ãªãã¬ããªã«ã§æ€èšŒæ©èœïŒBIãããŒã¿ãã€ãã³ã°ïŒãå®è¡ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãä»ããã©ã€ããã€ã°ã¬ãŒã·ã§ã³ã®ããŒã¿ãšãã©ã³ã¶ã¯ã·ã§ã³ã®è»¢éã«ã€ããŠè©³ãã説æããå¥ã®èšäºãæžãäºå®ã§ãã
ããªãã¯æ°ããæ¹æ³ã§èããããšãã§ããŸã
ãããããããããã®èšäºã®æãéèŠãªçµè«ã§ãã MySQLãNoSQLã·ã¹ãã ãšããŠäœ¿çšããã®ã¯çŽ æŽãããããšã§ããã€ãŸããèšèšãããæ¹æ³ã§ã¯ãããŸããã ãã®èšäºã§ç€ºããããã«ãäŸãšããŠã¯ãMySQLã䜿çšããŠããã®ããã«ç¹å¥ã«èšèšãããNoSQLã·ã¹ãã ã®ä»£ããã«ããŒãšå€ã®ãã¢ãæäœããŸãã Wixã§MySQLãéžæããã®ã¯ãããŒãšå€ã®ãã¢ïŒã ãã§ãªãïŒãæäœããããã§ãã䜿ããããã管çãããããçŽ æŽããããšã³ã·ã¹ãã ã ããã§ãã ããŸããšããŠãã»ãšãã©ã®NoSQLã·ã¹ãã ãããåªããã¬ã€ãã³ã·ãã¹ã«ãŒããããããã³äžŠååããã©ãŒãã³ã¹ãæäŸããŸãã
WixãŠã§ããµã€ããã¶ã€ã³ã®ããŒãã¢ãŒããã¯ããã¶ã€ããŒã
ãšã¢ãŽã»ã¢ãã©ãã
å
ã®èšäºïŒ
Wix Engineers Blog