PGãã€ãéå¬ãããã®ã¯ããã§4åç®ã§ãã ãã®éã«ãç§ãã¡ã¯ã¹ããŒã«ãŒããæçšãªè³æã®å€§èŠæš¡ãªããŒã¿ããŒã¹ãèç©ããŸããã æ¥çã®ã¬ããŒãã®ã¬ãã«ã¯å¹Žã
é«ããªã£ãŠããŸãããè¯ãã¯ã€ã³ã®ããã«ããã®é¢é£æ§ã倱ããªããããã¯ããããŸãã
Zalandoã®ããŒã¿ãšã³ãžãã¢ãªã³ã°è²¬ä»»è
ã§ããValentin Gogichashvili㯠ã æè¿ã® PG Dayã§ãéçºè
ãéåžžã«åçãªããã»ã¹ã®å€§èŠæš¡ãªã¹ã¿ãããããäŒç€Ÿã§PostgreSQLãã©ã®ããã«äœ¿çšãããã©ã®ããã«ãã®éžæããããã説æããŸããã
ZalandoãPG Dayã®åžžé£å®¢ã§ããããšã¯ç§å¯ã§ã¯ãããŸããã PG Day'17 Russiaã§ã¯ããã€ãã®ååããã®3ã€ã®çŽ æŽãããã¬ããŒãã玹ä»ããŸãã Murat KabilovãšAlexey Klyukinã¯ã ã¢ã¯ã»ã¹ããããPostgreSQLã¯ã©ã¹ã¿ãŒãå±éããããã®Zalandoã®å
éšéçºã«ã€ããŠè©±ããŸã ã Alexander Kukushkinã ãAWSã§PostgreSQLã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸã ã Dmitry Dolgovã¯ãããã¥ã¡ã³ãæåã®ã¹ãã¬ãŒãžãšããŠPââostgreSQLã䜿çšããå Žåã®JSONBããŒã¿åã®å
éšãšããã©ãŒãã³ã¹ãç解ããã®ã«åœ¹ç«ã¡ãŸããç§ã®äººçã§åããŠãç§ã¯ãã·ã¢èªã§çºè¡šããŸãã ããã€ãã®ç¿»èš³ãçšèªãããªãã«ãšã£ãŠéåžžã«é¢çœãå Žåãç§ã責ããªãã§ãã ããã ç§ã¯èªåããå§ããŸãã Zalandoã®ããŒã¿ãšã³ãžãã¢ãªã³ã°è²¬ä»»è
ã§ãããã¬ã³ã¿ã€ã³ã§ãã
Zalandoã¯ãšãŒãããã§éåžžã«æåãªãªã³ã©ã€ã³éŽå±ã§ãããè¡£é¡ã«é¢é£ãããã¹ãŠã®ãã®ã§ãã ããã¯ãããã©ã®ããã«èŠãããã§ãã ãã€ãã§ã®çŽ98ïŒ
ã®ãã©ã³ãèªç¥åºŠã¯ãåœç€Ÿã®ããŒã±ãã£ã³ã°æ
åœè
ãéåžžã«è¯ãä»äºãããŸããã æ®å¿µãªãããããŒã±ãã£ã³ã°æ
åœè
ãããŸãæ©èœãããšãæè¡éšéã¯éåžžã«æªããªããŸãã ç§ã4幎åã«ã¶ã©ã³ãã«æ¥ããšããç§ãã¡ã®éšçœ²ã¯50人ã§æ§æãããæã«100ïŒ
æé·ããŸããã ãããŠããã¯éåžžã«é·ãéç¶ããã çŸåšãç§ãã¡ã¯æ倧ã®ãªã³ã©ã€ã³ã¹ãã¢ã®1ã€ã§ãã 3ã€ã®å庫ã»ã³ã¿ãŒãæ°çŸäžã®ãŠãŒã¶ãŒã8,000人ã®åŸæ¥å¡ãããŸãã
ç»é¢ã®èåŸã§ããã®ãããªå庫ãå«ãã²ã©ãããšãèµ·ãã£ãŠããããšãæ³åã§ããŸãããããã®ãã¡3ã€ããããŸãã ãããŠãããã¯äžŠã¹æ¿ããè¡ãããŠãã1ã€ã®å°ããªéšå±ã§ãã æè¡çãªèŠ³ç¹ããèŠããšããã¹ãŠãããçŸãããå³ãæãã®ã¯ãšãŠãè¯ãããšã§ãã çµµãæãããšãã§ããçŽ æŽããã人ãããŸãã
Postgresã¯ãŠãŒã¶ãŒããŒã¿ã«é¢é£ãããã¹ãŠãèšé²ãããããæ§é ã®äžã§æãéèŠãªãããã®1ã€ãå ããŠããŸãã å®éãPostgresã¯æ€çŽ¢ããŒã¿ä»¥å€ã®ãã¹ãŠãèšé²ããŸãã Solar'ahã§æ¢ããŠããŸãã çŸåšãåœç€Ÿã®ãã¯ãããžãŒãªãã£ã¹ã§ã¯700人ãéçšããŠããŸãã ç§ãã¡ã¯æ¥éã«æé·ããŠãããåžžã«äººãæ¢ããŠããŸãã ãã«ãªã³ã«å€§ããªãªãã£ã¹ããããŸãã ãã«ãã ã³ãããããªã³ããã«ã·ã³ãã®å°èŠæš¡ãªãã£ã¹ã ãã«ã·ã³ãã¯å
æãªãŒãã³ããŸããããçŸåšæ¡çšäžã§ãã
ãã¯ãããžãŒäŒæ¥ãšããŠäœãããŸããïŒä»¥åã¯
Javaãš
Postgresã®äŒç€Ÿã§ããããã¹ãŠãJavaã§æžãããPostgresã§æžãããŠããŸããã 2015幎3æã«ãç§ãã¡ã¯ããŒã ã«ç¡éã®èªåŸæ§ãšæè¡ã®éžæè¢ãæäŸããã
æ ¹æ¬çãªä¿ææ§ã®æŠå¿µãçºè¡šããŸããã ãããã£ãŠãç§ãã¡ã«ãšã£ãŠãPostgresãéçºè
ã®ããã«åœŒããèªåã§éžæããæè¡ãç¶æããããšã¯éåžžã«éèŠã§ãããããããPostgresã«æžããŸãããããšã¯èšããŸããã ããã©ã³ã¶ã¯ã·ã§ã³ãããŒã¿ã®ããŒã¹ã¯6ãã©ãã€ãã§ãã ããã«å«ãŸããŠããªãæ倧ã®ããŒã¿ããŒã¹ã¯ãæç³»åãããžãã¹ã€ãã³ãïŒçŽ7ãã©ãã€ãïŒãèšé²ããããã«äœ¿çšããã€ãã³ããã°ã§ãã ãã®ããŒã¿ãæ±ãã®ã¯èå³æ·±ãã§ãã ããªãã¯ãã¹ãŠã«ã€ããŠå€ãã®æ°ããããšãåŠã³ãŸãã
ã©ã®ãããªåé¡ããããŸããïŒç¶ç¶çãªæé·ãé«éãæ¯é±ã®éçºãµã€ã¯ã«ïŒæ°ããæ©èœã¯æ¯é±å±éãããŸãã ãŸããããŠã³ã¿ã€ã ã¯æšå¥šãããŸããã æè¿ãåé¡ãçºçããŸãã-èªåŸéçºããŒã ã¯ããŒã¿ããŒã¹ãAmazon AWSã¢ã«ãŠã³ãã«ãã©ãã°ããŠãããDBAãŠãŒã¶ãŒã¯ãããã®ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸããã
ãããã¯ã·ã§ã³ãã¢ã€ãã«ç¶æ
ã«ãªããªãããã«ããŒã¿ã¹ããŒã ãå€æŽããæ¹æ³ã«ã€ããŠèª¬æããŸãã ããŒã¿ã®æäœæ¹æ³ïŒZalandoã®ããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ã¯ãã¹ãã¢ãããã·ãŒãžã£ã®ã¬ã€ã€ãŒãä»ããŠè¡ãããŸãïŒã ãããéèŠã ãšèããçç±ãç°¡åã«èª¬æããŸãã ãããŠãç§ãã¡ãã©ã®ããã«ã·ã£ãŒãããã©ã®ããã«ããŒã¿ããŒã¹ãç Žå£ãããã«ã€ããŠãã話ããŸãã
ãããã£ãŠãPostgresã§æãéèŠãªæ©èœã®1ã€ã¯ã
å®è³ªçã«ããã¯ãªãã§ããŒã¿ã¹ããŒã ãå€æŽãã
æ©èœã§ãã OracleãMySQLãããã³ä»ã®å€ãã®ã·ã¹ãã ã«ååšããNoSQLããŒã¿ããŒã¹ã芪ãã¿ã®ããããŒã¿ããŒã¹ãã¡ããªãŒã®å®å
šãªã¡ã³ããŒãšããŠæ¬è³ªçã«å¢å ãããšããäºå®ã«ã€ãªãã£ãåé¡ã¯ãä»ã®ããŒã¿ããŒã¹ãããã»ã©éããããŸãã§ããªãããšã§ããããŒã¿ã¹ããŒããå€æŽããŸãã PostgreSQLã§ã¯ãåã®è¿œå ãååã®å€æŽãããã©ã«ãå€ã®åé€ãè¿œå ããã£ã¬ã¯ããªã®å±éã®ããã«ããã¯ãå¿
èŠãšããŸããã
å¿
èŠãªã®ã¯ãä»ã®èª°ããã®ããŒãã«ã«è§Šããªãããšã確èªãããã£ã¬ã¯ããªãå€æŽããããªã¢ããã¯ã ãã§ãã ã»ãšãã©ãã¹ãŠã®æäœã§ãã®ã¬ãã€ãã®ããŒã¿ãæžãæããå¿
èŠã¯ãããŸããã ãããæãéèŠã§ãã ç¹ã«ãCONCURRENTLYã€ã³ããã¯ã¹ãäœæããã³åé€ã§ããŸãïŒããŒãã«ããããã¯ããã«ã€ã³ããã¯ã¹ãäœæãããŸãïŒã
å¶çŽã«ã¯ãŸã åé¡ããã
ãŸã ã 巚倧ãªå·šå€§ããŒãã«ã«
NOT NULLå¶çŽãè¿œå ããæ¹æ³ã¯ãŸã ãããŸãããããŒãã«ã®åã«å®éã«NULLå€ããªãããšã確èªããå¿
èŠã¯ãããŸããã å¶çŽãä¿¡é Œãããããããã¯æ£ããã§ãã ããããæ®å¿µãªããšã«ãããããã¹ãŠãããŸãæ©èœããããã«é©çšããªããã°ãªããªãããã€ãã®äŸå€ããããã·ã¹ãã å
šäœãåæ¢ããæãããããã¯ã¯ãããŸããã§ããã
ãããã©ã®ããã«æŽçããŸãããïŒ ç§ãå§ãããšããZalandoã§ã¯ç§ãå¯äžã®DBAã§ããã ããŒã¿ããŒã¹ã®æ§é ãå€æŽãããã¹ãŠã®ã¹ã¯ãªãããäœæããŸããã ãã®åŸããã¹ãŠã®ã¹ããŒãžã³ã°ç°å¢ã§ãããè¡ãå¿
èŠãããããããããæãããããšã§ããããšã«æ°ä»ããŸããã ããŸããŸãªç°å¢ã§ãã£ã¬ã¯ããªããã³ãããããããå·®åãšæ¯èŒãå§ããŸããã dbdiffã®äœæãèªååãããšããã¢ã€ãã¢ããããŸããã ãã®ãããªããŒã«ã«æéãè²»ããããšãã§ããªãããšã«æ°ä»ããŸããããŸããããããŒãžã§ã³ããå¥ã®ããŒãžã§ã³ã«ã¹ã¯ãªãããæžãã»ããç°¡åã§ãã ãã ããdbdiffãšããååã¯æ®ããŸãã
ç§ãã¡ã®æé·ã«äŒŽããdbdiffãèªåã§æžãããšã¯äžå¯èœã«ãªããŸããã ãããã£ãŠãããŒã¿ããŒã¹ã®ä»çµã¿ãããã¯ãçºçããçç±ããªã°ã¬ãã·ã§ã³ãçºçããå Žæãªã©ãç解ã§ããããã«ãéçºè
ã«SQLã®äœæããã¬ãŒãã³ã°ãPostgreSQLã®åºæ¬ã®èªå®ãè¡ãå¿
èŠããããŸããã ãã®ãããããªãªãŒã¹ãã®èªèšŒãå°å
¥ããŸããã ç§ãã¡ã®ããŒã ãããã®ãããªèšŒææžãæã£ãŠãã人ã ããããŒã¿ããŒã¹ã®ç®¡çè
æš©éãåãåããã·ã¹ãã ãåæ¢ã§ããŸãã ãã¡ãããç§ãã¡ã¯æå©ã«æ¥ãŠãã¿ããªãåé¡ãèµ·ãããªãããã«ããããããšãå©ããå©èšããå©ããŸãã
以äžã«ãéåžžã«åçŽãªdbdiffã®äŸã瀺ããŸããorder_addressããŒãã«ãšå€éšããŒããŒãã«ãè¿œå ãããŸãã åé¡ã¯ãéçºäžã«ããŒãã«ãå€æŽãããå Žåããã®ããŒãã«ã®ãœãŒã¹ãæ¯åå€æŽããå¿
èŠãããããšã§ãã åãªããžã§ã¯ããåããŒãã«ã¯gitã®åå¥ã®ãã¡ã€ã«ã«ãããããæ¯ådbdiffãå€æŽããå¿
èŠããããŸããpl/ pgsqlã®çŽ æŽãããæ©äŒãå©çšããŠããã£ã¬ã¯ããªãããã¡ã€ã«ãã¢ããããŒãã§ããŸãã
èå³æ·±ãããšã«ãããŒãã«å
šäœãããã¯ããå¿
èŠããããããå€éšããŒå¶çŽãè¿œå ããæäœã«ã¯åé¡ããããŸããããã«ã¯å€ãã®æéããããå¯èœæ§ããããŸãã èªåèªèº«ãä¿è·ããããã«ãstatement_timeoutïŒã·ã¹ãã ãããã¯ãä¿æããã®ã«èš±å®¹ãããç§æ°ïŒãèšå®ããããšããå§ãããŸãã ããŒãã«ãã¡ã¢ãªã«ä¿åãããŠããå Žåãéåžžã¯3ç§ã§ååã§ãã é©åããªãå Žåã3ç§ã§ã¹ãã£ã³ã§ããŸããã
ä»ã«äœãç§ãã¡ãå©ããŸããïŒ ç§ãã¡ãæžããããŒã«ã¯ç§ãã¡ãå©ããŠãããŸãã
pg_viewã¯ãããã¯ãxlogã§ã®ããŒãã£ã·ã§ã³ã®å æãªã©ãå¿
èŠãªãã¹ãŠã®ããŒã¿ããŒã¹æ
å ±ãåéããŸãã ã»ãŒãããã®ããã«èŠããŸãã ãã®ããŒã«ã¯ãäœãåé¡ãçºçããå Žåã«æéå
ã«ç§»è¡ãåæ¢ã§ããããã«ãæ®ãã®ãã£ã¹ã¯å®¹éã«é¢ããæ
å ±ãåéããããŒã¿ããŒã¹ã«è¡šç€ºãããããã¯ã衚瀺ããŸãã
nice_updaterã¯ãããŒã¿ããŒã¹ãç£èŠãããã®è² è·ãxlog-partitionsã®è² è·ããã£ãããšããããã
10ã100,000ã¬ã³ãŒãã調㹠ãæŽæ°ã¹ããŒãã¡ã³ããå®è¡ããå®æçã«ããã¥ãŒã ãéå§ããããã°ã©ã ã§ãã ãããã£ãŠã倧èŠæš¡ãªç§»è¡ãå®è¡ããŸãã ããŒãã«ãè¿œå ããããè¿œå ã®åã«æ°ããå€ãæžã蟌ãã ãããå¿
èŠãããå Žåãnice_updaterã®äœ¿çšã¯éåžžã«ç°¡åã§ãã 圌ãã¯ããã€ãã®æäœãå±éããŸããããã®ãããæ°ã®ã¬ãã€ãã®äžæ£ãªããŒã¿ã圢æããããããæžãæããå¿
èŠããããŸã-nice_updaterã¯éåžžã«åœ¹ç«ã¡ãŸãã ç§ã®æèŠã§ã¯ããã§ã«ãªãŒãã³ãœãŒã¹ã«ãªã£ãŠããŸãã ç§ãã¡ã¯ãã¹ãŠã®ããŒã«ãããªãŒãã³ãœãŒã¹ãã«ããããšããŠããŸããã³ãŒãã®å質ã¯éåžžã«åäžããŠãããããã¥ã¡ã³ããç»å ŽããŠããŸãã
ç§ãã§ããæ倧ã®ã¢ããã€ã¹ã¯ãããŒã¿ããŒã¹ãããããªãããæ°ã«ããªãã³ãŒããããã°ã©ããŒã«æžãããããšã§ãã ç§ãã¡ã®æ倧ã®ééãã¯ãPostgresãããŸãæ©èœããããŠããããšã§ãéçºè
ã¯ããŒã¿ããŒã¹ã¯åžžã«éåã®ãããªãã®ã ãšèããŠããŸããã ãããã£ãŠã2ç§éããŒã¿ããŒã¹ãã·ã£ããããŠã³ããããšãéçºè
ã¯ææãšå®å
šãªçœå®³ãšã¿ãªããŸãã ROLLBACKãèšè¿°ããããã®ã¿ã€ãã®ãšã©ãŒãåŠçããããã¹ããè¡ããŸããã
ããŒã¿ããŒã¹ãã¢ããã°ã¬ãŒãããããããŒã¿ããŒã¹ã䜿çšããŠäœãä»ã®ããšããããããããã«ã30ç§éããŒã¿ããŒã¹ãç¡å¹ã«ããæ©èœãæã€ããšããæåã«ãã¹ãããšã§ãã ä»æ¥ãã¢ã³ãã¬ã¹ãšç§[ããããã
EdãïŒAndres Freund ]ã¯ãéçºè
ãéåžžã®ã³ãŒããæžãããšãåŠã¶ããã«ãã©ã³ãã ãªæ¥ç¶ãåæããã¢ãŒããäžè¬çã«äœæããå¿
èŠããããšè¿°ã¹ãŸããã 5å以äžããããã¹ãŠã匷å¶çµäºããã¹ã¯ãªããããããŸãã ã¹ããŒãã¡ã³ãã®ã¿ã€ã ã¢ãŠãã¯ããã©ã«ãã§30ç§ã«èšå®ãããŠããŸãã 誰ãã30ç§ä»¥äžãããæé ãæžãå Žåãæ£åœãªçç±ãäžããå¿
èŠããããŸãã
ã¹ãã¢ãããã·ãŒãžã£ããåŸããããã®æ倧ã®å©ç¹ã¯ãå€åºå
ã§ããŒã¿ã亀æã§ããããšã§ããå€ãåããããŒã¿ãèªã¿åã£ãŠæ°ãã空ã®åãè¿œå ããŸãã 次ã«ãäž¡æ¹ã®åã®ã¬ã³ãŒãããªã³ã«ããŠãæ°ããåããèªã¿åããåäœã䜿çšããŠå€ãåãžã®ãã©ãŒã«ããã¯ãå®è¡ããŸãã 次ã«ãããŒã¿ãæ°ããåã«ç§»è¡ããŸãã ãããŠãããªãã¯ãã§ã«å€ããã®ãæšãŠãããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã³ãŒããããŒãã«ããŸã£ããèªèããªãããã«ãããŒãã«ã®æ£èŠåãæ°åè¡ããŸããã ãã®æ©èœã¯ãã·ã¹ãã ãå¥å
šãªç¶æ
ã«ç¶æããããã«éèŠã§ãã
åªãããã¬ãŒãã³ã°ãšåªããããŒã«ã䜿çšããŠãååãšããŠãããŒã¿æ§é ã®ç§»è¡ãŸãã¯å€æŽã«èµ·å ããããŠã³ã¿ã€ã ãåé¿ããããšãã§ããŸããã å€æŽæ°ã®èŠæš¡ãç解ããããã«ãããŒã¿ããŒã¹ã§é±ã«çŽ100 dbdiffsãå±éãããŠããŸãã ãããŠãåºæ¬çã«ããŒãã«ãå€æŽããŸãã ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ã¯ãããŒã¿æ§é ãå€æŽããæè»æ§ãæ¬ ããŠãããšå®æçã«èšãããŠããŸãã ããã¯çå®ã§ã¯ãããŸããã
dbdiffãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããããšããŸãããæ®å¿µãªãããenumã®å€æŽãªã©ããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ãªãã³ãã³ãããããŸãã
ããŒã¿ã¯éåžžã©ã®ããã«ã¢ã¯ã»ã¹ãããŸããïŒããã«ã¯ãå€å
žçãªæ§é ããããŸã-ãªããžã§ã¯ãã®éå±€ïŒé¡§å®¢ã圌ã¯éè¡å£åº§ãæã£ãŠããŸãã å€ãã®ç°ãªã泚æããããã¢ã€ãã ã¯æ³šæã«ãªã¹ããããŸãã ãã®éå±€ã¯äœãè¯ãã§ããïŒ é¡§å®¢ã«é¢é£ä»ããããŠãããªããžã§ã¯ãã¯ã顧客ã®ã¿ã«é¢é£ä»ããããŠããŸãã ã»ãšãã©ã®å Žåããã®éå±€ãè¶
ããå¿
èŠã¯ãããŸããã 顧客Aã«æ³šæãããšãã顧客Bã§ã©ã®ãããªæ³šæãå©çšã§ãããããŸããã®éã«ã€ããŠã¯ããŸã£ããé¢å¿ããããŸããã 誰ããå€ãã®å©ç¹ãããããšãç¥ã£ãŠããŸããå¿«é©ãªé åã«çãŸããããžãã¹ããžãã¯ãèšè¿°ããã®ãšåãèšèªã䜿çšããŸãã
ãããããã€ãããŒãã«ã¯å€§ããªåé¡ããããéçºè
ã«ãã©ã³ã¶ã¯ã·ã§ã³ã§ããŸãæ©èœããã³ãŒããæžãããã«æããŸããã éçºè
ã¯ãããŒãã«å
šäœãã¡ã¢ãªã«ããŒãããŠãããããã䜿ã£ãŠããã€ãã®éšåãæ°åã§ã³ãããããããšããŸãã é·ããã©ã³ã¶ã¯ã·ã§ã³ãããããããé·ããªãã»ã©ãã¹ããŒã ã§ã®ç§»è¡ãé£ãããªããŸãã ããŒãã«ã¯åžžã«ã³ãŒãã§è¡šç€ºããå¿
èŠããããŸãã ç§ãã¡ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãšã¯å¥ã®ããŒã¹ãšããŠã®æŠå¿µã¯ãããŸããã ãããããŒã¿ããžãã¯ãšåŒã³ãŸãã å®éããããã¯ããŒã¿ã«éç³ãããå¶çŽã§ãããã¹ãã¢ãããã·ãŒãžã£ã«ä¿æãããšäŸ¿å©ã§ãã ããã¯ã移è¡ã§ã¯å®è¡ã§ããŸããã å®éãããã¯å¥ã®ããŒã¿å±€ã§ãã
ã¹ãã¢ãããã·ãŒãžã£ããªãå Žåã¯ãã¢ããªã±ãŒã·ã§ã³å
ã«æœè±¡ã¬ã€ã€ãŒãé
眮ããããšããå§ãããŸãã ããšãã°ãNetflixããããè¡ããŸãã ããŒã¿ã¬ã€ã€ãŒãä»ããããŒã¿ã¢ã¯ã»ã¹ãå®å
šã«æœè±¡åããç¹å¥ãªã©ã€ãã©ãªããããŸãã ãããã£ãŠãOracleããCassandraã«ç§»è¡ããŸãããããžãã¯ãããžãã¹ãšããŒã¿ã«åå²ããããžãã¹ããžãã¯ãå¥ã®ããŒã¿ããŒã¹ã«çœ®ãæããŸãã ãããããã®ãããªç¶æ³ã§ãµãŒããããå€æŽããã®ã¯æªå€¢ã§ãã
NoSQLã¯ãã°ãããããšã§ãããã®éå±€å
šäœããã¹ãŠã®æ³šæãšäžç·ã«äœ¿çšããŠã1ã€ã®ããã¥ã¡ã³ããäœæã§ããŸãã åæåããå¿
èŠã¯ãããŸããããã¹ãŠãJSONã«çŽæ¥æžã蟌ãŸããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã¯äžèŠã§ããæžãçããããŠãããã®ã¯æžãçããããŸãã æé»çãªã¹ããŒã ãçºçããŸãã ææžã®æ§é ãå€åãå§ãããšãããããã©ã®ããã«æäœãããã®ãã¹ãŠã®ããžãã¯ãã©ãã«çªãåºããïŒ ããã¯æãã§ãã çŸæç¹ã§ã¯ãæ®å¿µãªãããACIDã®ããŒã¿ã倱ããªãPostgreSQL以å€ã®NoSQLããŒã¿ããŒã¹ã¯ãããŸããã
ãããã£ãŠãNoSQLã«ã¯SQLããããŸããã SQLã¯åææäœã«éåžžã«åŒ·åãªèšèªã§ãããããŒã¿ãéåžžã«è¿
éã«å€æããŸãã ããããã¹ãŠãããšãã°Javaã§è¡ãããšãããªããšãªãæãã§ãã
ORMã®ä»£æ¿æ段ã¯äœã§ããïŒçŽæ¥SQLã¯ãšãªã ã¹ãã¢ãããã·ãŒãžã£ã䜿çšããã«ãããŒã¿ããŒã¹ããéèšããã«ã§ããŸãã æ確ãªãã©ã³ã¶ã¯ã·ã§ã³å¢çããããŸã-1ã€ã®SQLãèµ·åããããã©ã³ã¶ã¯ã·ã§ã³éã§ããŒã¿ãåŠçããæéãç¡é§ã«ãªããŸããã éåžžã«è¯ãäŸïŒClojureäžã®YeSQLã¯ãã»ãšãã©ã¹ãã¢ãããã·ãŒãžã£ã®ããã«æ©èœããŸãã Scala Slick-Scalaã«æºãã£ãŠãããSlickããŸã èŠãããšããªãå Žåã¯ããœãŒã¹ã³ãŒãã確èªããå¿
èŠããããŸããããã¯ããããŸã§èŠãäžã§æãå°è±¡çãªã³ãŒãã®1ã€ã§ãã
ã¹ãã¢ãããã·ãŒãžã£ã ãã©ã³ã¶ã¯ã·ã§ã³å¢çãã¯ãªã¢ããŸãã ããŒã¿å±€ããã®æœè±¡åã ããã¯ãå€å
žçãªJavaã¢ããªã±ãŒã·ã§ã³ã®ã¬ã·ãã§ãã
ããžãã¹ããžãã¯ãJDBCãã©ã€ããŒãããã³ããŒã¿ããŒãã«ããããŸãã ç§ãã¡ã¯äœãããŸãããïŒ ãŸããã¹ãã¢ãããã·ãŒãžã£ã¬ã€ã€ãŒãå®è£
ããŸããã
getFullCustomerInformationãªã©ã®è¡ãè¿ããšããŸãããã®è¡ã«ã¯é
åãããããã®é åºã¯Postgresã«ãã£ãŠã·ãªã¢ã«åãããŸããå
éšã«ã¯äœçœ®ãæã€é
åããããå
éšã«ã¯éè¡ããŒã¿ãæã€é
åããããŸãã éåžžã«ããåä»ããããéå±€æ§é ã«ãªããŸãã ããããã¹ãŠJavaã§èšè¿°ãããŠããå Žåãããæç¹ã§ã¯ã©ã¹ã«50ã®ã¡ã³ããŒããŒãžããããŸãã ããã«ãããã²ã©ãçµæãçãããããç¬èªã®ã©ã€ãã©ãªãäœæããããšã«ããŸããã 圌ãã¯åœŒå¥³ã®Sproc WrapperãšåŒã°ããããŒã¿ããŒã¹ã®APCã¬ã€ã€ãŒãšããŠæ©èœããŸãã åºæ¬çã«ãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒããŒã¿ããŒã¹ãäœæããŸãã
ã©ã®ããã«èŠããŸããïŒã¹ãã¢ãããã·ãŒãžã£ãèšè¿°ãããåŸã泚éä»ãã®ãã®ãããªå°ããªã€ã³ã¿ãŒãã§ã€ã¹ãèšè¿°ãããŸãã register_customeråŒã³åºãã¯ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠå®å
šã«ééçã§ãããããŒã¿ããŒã¹å
ã®ã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºãããŸããåæ§ã«ããã¹ãŠã®ã²ã©ããã¹ããããé
åãããã·ã¥ããããªã©ã®ã·ãªã¢ã«å/éã·ãªã¢ã«åãåŒã³åºãããŸãã 泚æã®ãªã¹ããšããŠããããã泚æäœææ§é ãå«ãã
äœã®åé¡ïŒã¹ãã¢ãããã·ãŒãžã£ã®åé¡ã¯ã倧éã®ã³ãŒããèšè¿°ããå¿
èŠãããããšã§ãã å€ãã®CRUDæäœãè¡ãå¿
èŠãããå ŽåïŒæ°ããExcelãäœæããŠããå ŽåïŒãã¹ãã¢ãããã·ãŒãžã£ã®äœ¿çšã¯ãå§ãããŸããã 100åã®ããŒãã«ãããå Žåãååã«åå¥ã®ã¹ãã¢ãããã·ãŒãžã£ãšããŠå€æŽãå
¥åããå¿
èŠããããŸãããã®åŸãã ãŸãããšãã§ããŸãã ãããã®ã¹ãã¢ãããã·ãŒãžã£ãçæããããŒãã¹ãã©ãããäœæãã人ãããŸããã ãããããã®åŸããã®ç¶æ³ã§äŒæ¢ç¶æ
ã䜿çšãããããã®ããŒãã«ãç·šéããæ¹ãè¯ããšèšããŸããã ããšãã°ã調éããŒã ã«è£œåæ
å ±ãé§åããããŒã«ããããããã¯äŒæ¢ç¶æ
ã§æžãããŠããŸãã 500人ããããã®ããŒã«ã䜿çšãã1500äžäººãã¡ã€ã³ãµã€ãã䜿çšããŠããŸãã
ããžãã£ããšã¯ïŒ SQLãåŠã¶å¿
èŠãããã ããã¯æ¬åœã«éçºè
ãå©ããŸãã ClosureãšScalaãåŠã³å§ããéçºè
ã¯ãå®æçã«ç§ã«é ŒãããScalaã¯ã»ãšãã©SQLã«äŒŒãŠããŸããããã!!!ããšèšã£ãŠããŸãã ååãšããŠãã¯ãã æ©èœãã£ã«ã¿ãŒãä»ããŠäžããäžã«æµãããã€ãã©ã€ã³ããŒã¿ã¯ãSQLãåžžã«è¡ã£ãŠããããšã§ãã æ®å¿µãªãããScalaã«ã¯ãŸã å®è¡ãã©ã³ããŒããããŸããã
ãã¹ãŠãèªååããŸããæäœæ¥ã§è¡ãããããšã¯ãã¹ãŠãããããäžååã«è¡ãããŸãã PostgreSQLãã©ã®ããã«æ©èœããããã·ã¹ãã ãã©ã®ããã«æ©èœããããç¥ãããšãéåžžã«éèŠã§ãã
ããŒãžã§ã³ç®¡çæ¹æ³æåã«ãã¹ãã¢ãããã·ãŒãžã£ã®äœ¿çšãéå§ãããšããããã·ãŒãžã£ãå€æŽãããšãè¿ãããããŒã¿ã®ã¿ã€ããå€æŽãããŸããã å€ãæé ãåé€ããæ°ããæé ãå±éããå¿
èŠããããŸãã ããããã¹ãŠã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§è¡ããŸãã ã¹ãã¢ãããã·ãŒãžã£éã«äŸåé¢ä¿ãããå Žåããã³ãã«ã䜿çšããŠããããæ€çŽ¢ããå¿
èŠããããŸããã å®å
šã«ããããããŠãåã³å±éããŸãã ç§ãäŒç€Ÿã§å¯äžã®DBAã ã£ããšããã¹ãã¢ãããã·ãŒãžã£ãæŽæ°ãããããã®æãããdbdiffãæžããã ãã§ãã ãããããã©ãã«ã座ã£ãŠãã»ãã·ã§ã³ã§ãªããžã§ã¯ããèŠã€ããããã®ãã¹ãå¶åŸ¡ããçŽ æŽãããPostgreSQLã®search_pathæ©èœã䜿çšã§ãããšããã¢ã€ãã¢ãæãã€ããŸããã ããŒãžã§ã³15.01ã®ã¢ããªã±ãŒã·ã§ã³ãéããsearch_pathãèšå®ãããšãæ€åºããããªããžã§ã¯ãã¯ãã®ã¹ããŒã ã«é
眮ãããŸãã
ãã®ã¹ãã¢ãããã·ãŒãžã£ã®ã»ããã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®ããŒã«ã¢ãŠãäžã®å±éããŒã«ã¯ãç®çã®ããŒãžã§ã³ã®ã¹ããŒããäœæããããã«ãã¹ãŠãããŒãããŸãã ãã®åŸãã¢ããªã±ãŒã·ã§ã³ã¯ãããã䜿çšããŸãã æ°ããããŒãžã§ã³ãããŒã«ã¢ãŠããããšã©ããªããŸããïŒ å±éããŒã«ã¯ãææããŠããã¹ãã¢ãããã·ãŒãžã£ã®ã»ããå
šäœã§æ°ããã¹ããŒã ãå±éããæ°ããããŒãžã§ã³ã®ããŒã«ã¢ãŠããçºçããŠããéãäž¡æ¹ã®ããŒãžã§ã³ãå®éã«æ©èœããããããã«ç¬èªã®ã¹ãã¢ãããã·ãŒãžã£ã®ã»ããããããŸãã ããŒã¿ã«é¢é£ãããã®ã¯äœããããŸããã ãããã¯ãããŒã¿ã¢ã¯ã»ã¹ã¬ã€ã€ãŒãæäŸãããããããAPIã¹ããŒã ã§ãã çºçãããã¹ãŠã®ç§»è¡ã¯ãããã§çºçããŸãã ãã®ããã移è¡ãçºçããå Žåã以åã®ããŒãžã§ã³ãšäºææ§ããªããã°ãªããã以åã®ããŒãžã§ã³ã¯ãŸã æ©èœããŠããŸãã
èŽè¡ããã®è³ªå ïŒ
éçºè
ã«ãã®ãããªãããŒã«åãçµãããšãã©ã®ãããæããŸãããïŒ èª°ãããŸãã«ãããè¡ãã以åã®ããŒãžã§ã³ãšäºææ§ã®ãªã移è¡ãè¡ããªãããã«ããæ¹æ³ã¯ïŒ 移è¡ãæ¬åœã«æ£ããããšãæ°ããAPIãå€ãããŒã¿ãæ£ããèªã¿åããåæã«ã¯ã©ãã·ã¥ããªãããšãäœããã®æ¹æ³ã§ããã«ãã¹ãããŸããïŒãã¬ã³ã¿ã€ã³ïŒãã¡ãããããã¯ãã¹ãã«ãã¬ããžãã©ãã ãããŸãæ©èœãããããããŠãã¹ãŠããã¹ããããããšããåé¡ã§ããéçºè
ã¯ããŒã«ã«ããŒã¹ã§äœæ¥ãããã®åŸãçµ±åã¹ããŒãžã³ã°ããã¹ãã¹ããŒãžã³ã°ããªãªãŒã¹ã¹ããŒãžã³ã°ãããã³å®çšŒåãè¡ããŸããèŽè¡ããã®è³ªåïŒAPIãDBAããŸãã¯éçºè
ã¯èª°ãæžããŠããŸããïŒã¢ã¯ã»ã¹æš©ã¯ã©ã®ããã«åå²ãããŸããïŒãã¬ã³ã¿ã€ã³ïŒéçºè
ãäœæããŸãã DBAããããè¡ããªãã·ã§ã³ã¯ã¹ã±ãŒã©ãã«ã§ã¯ãããŸãããäžè¬ã«ãDBAããã¹ãŠã®APIãäœæããŠããããã€ãã®å°ããªäŒç€Ÿãç¥ã£ãŠããŸãã圌ããç§ã«é»è©±ãããšãã圌ãã¯ç§ãAPIãæžããšæã£ããããããããã¯äžå¯èœã§ãããŸããæã«5人ãéããŸããããä»ã§ã¯æã«40人ãéã£ãŠããŸãããããã£ãŠãéçºè
ãããŒã¿ããŒã¹ãæäœããæ¹æ³ãåŠã¶ã®ã«æéãè²»ããæ¹ãç°¡åã§ããå®éã«ã¯ããã¹ãŠãç©ççã«ã©ã®ããã«æ ŒçŽããã³é
眮ãããŠãããã説æãããšãéåžžã«ç°¡åã§ããAPIå±€å
šäœããã¹ãããã移è¡ãå¿
èŠãªãããããã¹ãã¯éåžžã«äŸ¿å©ã§ãããã¹ãŠãèªååã§ããŸãã1ã€ã®å€§ããªæ ç¹ãæã€ããšã®è¯ãç¹ã¯äœã§ããïŒãã¹ãŠã1ã€ã®å€§ããªæ ç¹ã§è¡ãããšãã§ãããã©ãããå°ããããããçããŸããäœè£ãããéãã1ã€ã®å€§ããªæ ç¹ã«ãšã©ãŸããŸããããžãã¹ã®ãã¹ãŠã®ããŒã¿ãããŒã¿ããŒã¹RAMã«é
眮ããŠããå Žåã¯ãäœãããå¿
èŠã¯ãããŸããã1ã€ã®ããŒã¿ããŒã¹ã«ãšã©ãŸããŸããéåžžã«ããŸããããŸããåæããã°ããè¡ãããªããžã§ã¯ãéã§ããŒã¿ããªã³ã¯ã§ããŸããããŸããŸãªããŒã¿ã«ã¢ã¯ã»ã¹ããããã®æŠç¥ã¯ç°¡åã§ããå€æ°ã®ç°ãªãããŒãã§ã¯ãªãã1å°ã®ãã·ã³ããµããŒãããã°ååã§ãããã ããRAMãããå€ãã®ããŒã¿ãããå Žåã«åé¡ãçºçããŸãã移è¡ãããã¯ã¢ãããã¡ã³ããã³ã¹ãã¢ããã°ã¬ãŒããªã©ããã¹ãŠãé
ããªããŸããåºéšã倧ããã»ã©ãé çã倧ãããªããŸããããŒã¿ãå
±æããŸãã1ã€ã®å€§ããªè«çããŒã¹ãååŸããå€ãã®PostgreSQLã€ã³ã¹ã¿ã³ã¹ã«é
眮ããŸããäœããããªã«è¯ãã®ïŒç¹°ãè¿ããŸãããç§ãã¡ã®æ ç¹ã¯å°ãããªã£ãŠããŸããããªãã¯ããã«åœŒããšä»äºãããããšãã§ããŸãããåé¡ã¯ãã¡ãããåå ããããšã¯ãã§ã«äžå¯èœã ãšããããšã§ããã¢ããªã¹ãã«ã¯ããã«ããŒã«ãå¿
èŠã§ããããŒã¿ãæäœããã«ã¯ãããå€ãã®ããŒã«ãå¿
èŠã§ããããã»ã¹ãèªååããã€ã³ãã©ã¹ãã©ã¯ãã£ã®éçºã«æè³ããããšãªãã倧éã®ããŒã¿ãæ±ãããšãã§ãããšèããŠããå Žåãããªãã¯ééã£ãŠããŸããããã¯äžå¯èœã§ããããããã®ããŒã«ãæžãå¿
èŠããããŸããç§ãã¡ã«ã¯å©ç¹ããããŸãããããŒã¿ã¬ã€ã€ãŒãæäŸããSproc Wrapperãæ¢ã«ãããŸãããç°ãªãããŒã¿ããŒã¹ã®äœ¿çšæ¹æ³ã圌ã«æããŸãããã©ã®ããã«èŠããŸããïŒ
ãã©ã¡ãŒã¿ãŒrunOnAllShards = trueã§findOrdersé¢æ°ãåŒã³åºããŠããŸããç»é²ãããã¹ãŠã®ã·ã£ãŒãã§ã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºããŸãããŸãã¯ãCustomerNumberãããããããã·ã£ãŒãããŒã§ãããšèšããŸããæ§æã§ã¯ã䜿çšã§ããæ€çŽ¢æŠç¥ïŒã«ãã¯ã¢ããæŠç¥ïŒãæå®ã§ããŸããã·ã£ãŒããã·ã£ãŒãèªèIDãããã³ããã·ã¥ã«ãã䞊åæ€çŽ¢ããµããŒããããŠããŸããã·ã£ãŒãäžã®ãªããžã§ã¯ããèŠã€ããããã«æãåºã䜿çšãããŠããæŠç¥ã¯ãããããä»®æ³ã·ã£ãŒãIDã§ããã¢ã€ãã¢ã¯æ¬åœã«ã·ã³ãã«ã§ããããŒãã£ã·ã§ã³åããŒããããŸã-ç§ã瀺ããéå±€ã§ã¯ãCustomerNumberã«ãªããŸããããŒãã£ã·ã§ã³åããŒã¯ãåãªããžã§ã¯ãã«ã€ããŠããªããžã§ã¯ãéã®ãªã³ã¯ã®å¢çãå®çŸ©ããããŒã§ããããŒã®åœ¢æãäž»ãªããšã¯ãããŒãã£ã·ã§ã³åããŒãäœã§ããããç解ããããšã§ããããšãã°ããŠãŒã¶ãŒãããŸãããŠãŒã¶ãŒã«ã¯æ³šæããããããããçš®é¡ã®ããžã·ã§ã³ããããã®æ³šæã«é¢é£ä»ããããŠããŸããããŒãã£ã·ã§ã³åããŒ-åããŠãŒã¶ãŒã«å±ãããªããžã§ã¯ãã®ã°ã«ãŒããå²ãåœãŠãå
±æããŒããã®é¡§å®¢çªå·ãäžæã®ãŠãŒã¶ãŒçªå·ããããŸãã顧客ãã©ãã«ããã®ããç解ããããã«ãéå±€å
ã®åºæ¬ãªããžã§ã¯ãã§ããOrderã¿ã€ãã®ãã¹ãŠã®ãªããžã§ã¯ããšãšãã«ãã©ãã°ããå¿
èŠããããŸããéå±€ã®ãªããžã§ã¯ãã®èŠªãã©ãã«ããããåžžã«ææ¡ã§ããå¿
èŠããããŸãã IDã¯æè¡çãªããŒã§ãããããã«ã¹ã¿ããŒIDãšèšãã®ã¯æãã§ããç§ãã¡ã¯æè¡çãªããŒã«ã€ããŠè©±ããŠããŸãããè«çããŒã«ã€ããŠè©±ããŠãããæè¡çãªããŒã¯è«çãã¬ãŒã ã¯ãŒã¯å
ã§äžæã§ã¯ãªãããã§ããéåžžã顧客IDã«UUIDã䜿çšããŸããã客æ§çªå·ãšã客æ§IDãåºå¥ããŸãã 1ã€ã®é¡§å®¢IDã¯ãã·ã¹ãã å
ã®8ã€ã®ããŒã¿ããŒã¹ã«8åååšããŸãããããŠã顧客çªå·ã¯åžžã«1ã§ãã MD5ã§ããã·ã¥ããŸããããã£ãšããŸãããããšãã§ããŸããäž»ãªããšã¯ãããã·ã¥ãåçã«åæ£ãããããšã§ããããã¯ãã·ã£ãŒãã£ã³ã°æŠç¥ã®ã¬ãã«ã§è¡ãããŸããå®éãã¢ããªã±ãŒã·ã§ã³ããªããžã§ã¯ãã®éå±€ã®å Žæããã°ããèŠã€ããå¿
èŠãããå Žåã¯ãã€ã§ããããã·ã¥ãå®è£
ããå¿
èŠããããŸãã Sproc Wrapperã䜿çšããç¶æ³ã§ã¯ãããã¯Customerãªããžã§ã¯ãã®ã·ã£ãŒãã£ã³ã°æŠç¥ã«ãããŸããããã®ããŒã®ããã·ã¥ã®ãµã€ãºã«ãã£ãŠãä»®æ³ã·ã£ãŒãã®æ°ã決ãŸããŸããããŒã¹ãåå²ãããå Žåã¯ã©ããªããŸããïŒããŒã¹ãå
±æããããã·ã¥ã®æåã®ãããã䜿çšãå§ããŠãããšããã ãã§ãããããã£ãŠãããŒã¿ããŒã¹ãåå²ããããšãããŒã¿ããŒã¹ããã¹ã¿ãŒã§ãããã¹ã¬ãŒãã«ãªã£ãããšã瀺ãããšãã§ãããã®ãããªç¬éã«éåžžã«çãã·ã¹ãã ã·ã£ããããŠã³ãçºçããŸããçŸæç¹ã§ã¯ãããã¯ããã§ããééçã«ãªãããã«å®å
šã«èªååã§ããŸããã·ã¹ãã ã®é»æºãåããã·ã£ãŒãã£ã³ã°æŠç¥ãå€æŽãããããããããšããã«ã¢ã¯ã»ã¹ã§ãããšèšããŸãããæåã®ãããã1ã§ããããŒã¿ããæ¢ã«ããŒã¿ãååšããå¥ã®ããŒã¿ããŒã¹ã«æžã蟌ã¿ãŸãããã®åŸã«è¡ãå¿
èŠãããã®ã¯ããã®ããŒã¹ããäžæ¹ã«å±ãããã¹ãŠã®ãªããžã§ã¯ããæ¶å»ããããäžæ¹ãããŒããåç
§ãããã¹ãŠã®ããŒã¿ãæ¶å»ããããšã ãã§ãããªã©ãªã©ã
é察称ã«åå²ããããšãã§ããŸããã·ã£ãŒãã£ã³ã°æŠç¥ã¯ãããã·ã¥ããŒãããå§ãŸãå Žåãããã€ãã®ã·ã£ãŒããããããšãç¥ã£ãŠãããããããŸãããããªãã¯å€¢äžã«ãªãå¯èœæ§ããããããããã¯ããªãããšããå§ãããŸããååãšããŠãããããã§ã«2åå
±æããŠããŸããçŸåšãçŽ æŽãããPostgreSQLã®æ©èœã§ããè«çè€è£œãå®éšããŠããŸããããã¯ãã«ããã¹ã¿ãŒã§ããã·ã¹ãã ãåæ¢ããããšãªããã¡ãžã£ãŒããŒãžã§ã³ã«ã¢ããã°ã¬ãŒããããã¹ãŠããã£ãããšèŠçãªãå®è¡ããæ©èœã§ããéšåã¬ããªã±ãŒã·ã§ã³-ããŒã¿ããŒã¹ãã1ã€ã®ããŒãã«ãŸãã¯ããŒãã«ã®äžéšã®ã¿ããââã«ã§ããŸãããã£ãã·ã¥ã®æŽæ°ãè¡ããŸããçŸåšãRDSãæäŸããåªããæ©èœã䜿çšããŠãPostgreSQLãAWSã«åã蟌ãããã«äžçæžåœåãçµãã§ããŸããAWSããŒã ã¯ãSTUPSãšåŒã°ããã·ã¹ãã ãéçºããŸãããããã«ãããSpiloã§ããã«ãŒã€ã¡ãŒãžãããŒã«ã¢ãŠããã远跡ããã³ç£èŠããããšãã§ããŸããSpiloã¯3ã€ã®ã³ãã³ãã®å©ããåããŠãAWSã§PostgreSQLã¯ã©ã¹ã¿ãŒãå±éã§ããŸããããã¯é«å¯çšæ§ã«ãªããããŒãã®1ã€ããªãã«ãªã£ããšãã«èªåçã«åãæ¿ããããŠã£ã¶ãŒããéžæããŸããããããããã¯å¥ã®è°è«ã®ãããã¯ã§ãã