äžé£ã®åºçç©ãPostgreSQLãšãã³ãžã§ãªã¹ãã®ã¡ã¢...ãïŒ 1ã2 ïŒã®ç¶ãã§ãé«äŸ¡ãªç·šéè ãåã³é£çµ¡ãåããŸããä»åã¯ãPostgreSQLãšMySQLã®ã¬ããªã±ãŒã·ã§ã³ã¡ã«ããºã ã®ã¬ãã¥ãŒãçŽæãããŠããŸãã å·çã®äž»ãªçç±ã¯ãMySQLã¬ããªã±ãŒã·ã§ã³ã«å¯Ÿããé »ç¹ãªæ¹å€ã§ããã ããããããšã§ãããå žââåçãªæ¹å€ã¯ãçå®ãåçå®ããããŠäŒéã®æ··boãšããæ··åç©ã§ãã ãããã¯ãã¹ãŠãèããããšãç解ããããšããç¹å¥ãªè©Šã¿ãªãã«ãããŸããŸãªäººã ã«ãã£ãŠç¹°ãè¿ãè€è£œãããŸãã ãããŠãããã¯ããªãåºç¯ãªãããã¯ãªã®ã§ãåæãå¥ã®åºçç©ã«å ¥ããããšã«ããŸããã
ãããã£ãŠã æå亀æµã®ãã¬ãŒã ã¯ãŒã¯ãšãããããéåžžã©ããMySQLã«å¯Ÿããå€ãã®æ¹å€ãããHighLoad ++ãèŠè¶ããŠãã¬ããªã±ãŒã·ã§ã³ã¡ã«ããºã ãæ€èšããŸãã æå§ãã«ããŸã æã£ãŠããªã人ã®ããã®å°ãéå±ãªåºæ¬çãªããšã
ã¬ããªã±ãŒã·ã§ã³ã®çš®é¡
è€è£œã¯è«ççããã³ç©ççã§ãã ç©çã¯ãããŒã¿ãã¡ã€ã«ã¬ãã«ã§ã®å€æŽã®èª¬æã§ãïŒç°¡ç¥åïŒãã®ãããªããŒãžã«ãã®ãããªãªãã»ããã§ãã®ãããªãã€ããæžã蟌ã¿ãŸãïŒã è«ççãªãã®ã¯ããã£ã¹ã¯äžã®ããŒã¿ã®ç¹å®ã®è¡šçŸãåç §ããã«ãããé«ãã¬ãã«ã§ã®å€æŽã説æããŸããããã«å¯èœãªãªãã·ã§ã³ããããŸãã ããŒãã«è¡ã®èŠ³ç¹ããå€æŽã説æã§ããŸããããšãã°ã
UPDATE
ã¯ãå€æŽãããåè¡ã®ãã¢ã®ã·ãŒã±ã³ã¹ïŒå€ãå€ãæ°ããå€ïŒãšããŠåæ ã§ããŸãã MySQLã§ã¯ããã®ã¿ã€ãã¯è¡ããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ãšåŒã°ããŸãã ãŸããããŒã¿ãå€æŽãããã¹ãŠã®SQLã¯ãšãªã®ããã¹ããåã«æžãããšãã§ããŸãã ãã®ã¿ã€ãã¯ãMySQLã§ã¯ã¹ããŒãã¡ã³ãããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ãšåŒã°ããŸãã
ç©çã¬ããªã±ãŒã·ã§ã³ã¯ããã°ãã°ïŒç¹ã«PostgreSQLã³ãã¥ããã£ã§ïŒãã€ããªãšåŒã°ããŸãããããã¯æ£ãããããŸããã è«ççè€è£œãšç©ççè€è£œã®äž¡æ¹ã®ããŒã¿åœ¢åŒã¯ãããã¹ãïŒã€ãŸãã人éãèªã¿åããïŒãŸãã¯ãã€ããªïŒäººéãèªãããã®åŠçãå¿ èŠãšããïŒã®ããããã§ãã å®éã«ã¯ãMySQLãšPostgreSQLã®äž¡æ¹ã®åœ¢åŒã¯ãã¹ãŠãã€ããªã§ãã æããã«ãMySQLã®ã¹ããŒãã¡ã³ãããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ã®å Žåãã¯ãšãªããã¹ãã¯èçŒã§èªãããšãã§ããŸããããã¹ãŠã®ãµãŒãã¹æ å ±ã¯ãã€ããªåœ¢åŒã®ãŸãŸã§ãã ãããã£ãŠãã¬ããªã±ãŒã·ã§ã³ã§äœ¿çšããããžã£ãŒãã«ã¯ãã¬ããªã±ãŒã·ã§ã³åœ¢åŒã«é¢ä¿ãªããã€ããªãšåŒã°ããŸãã
è«çè€è£œã®æ©èœïŒ
- ããŒã¿ã¹ãã¬ãŒãžãã©ãŒãããã®ç¬ç«æ§ïŒãã¹ã¿ãŒãšã¹ã¬ãŒãã¯ããã£ã¹ã¯äžã®ããŒã¿ã®ç°ãªãè¡šçŸãç°ãªãããã»ããµã¢ãŒããã¯ãã£ãç°ãªãããŒãã«æ§é ïŒã¹ããŒã ã®äºææ§ã«äŸåïŒãããŒã¿ãã¡ã€ã«ã®ç°ãªãæ§æãšå Žæãç°ãªãã¹ãã¬ãŒãžãšã³ãžã³ïŒMySQLã®å ŽåïŒãç°ãªãããŒãžã§ã³ã®ãµãŒããŒãå®éããã¹ã¿ãŒãšã¹ã¬ãŒãã¯ç°ãªãDBMSã§ããå ŽåããããŸãïŒã¯ãã¹ãã©ãããã©ãŒã ã¬ããªã±ãŒã·ã§ã³ã®ããã®ãã®ãããªãœãªã¥ãŒã·ã§ã³ãååšããŸãïŒã ãããã®ããããã£ã¯ãç¹ã«å€§èŠæš¡ãããžã§ã¯ãã§é »ç¹ã«äœ¿çšãããŸãã ããšãã°ãããŒãªã³ã°ã¹ããŒãã®ã¢ããã°ã¬ãŒãã
- èªã¿åãã¢ã¯ã»ã¹å¯èœæ§ïŒå¶éãªãã§ã¬ããªã±ãŒã·ã§ã³ã®åããŒãããããŒã¿ãèªã¿åãããšãã§ããŸãã ç©ççãªè€è£œã§ã¯ãããã¯ããã»ã©ç°¡åã§ã¯ãããŸããïŒä»¥äžãåç §ïŒ
- ãã«ããœãŒã¹æ©èœ ïŒ1ã€ã®ã¹ã¬ãŒãäžã®ç°ãªããã¹ã¿ãŒããã®å€æŽãçµåããŸãã 䜿çšäŸïŒçµ±èšããã³ã¬ããŒããäœæããããã®è€æ°ã®ã·ã£ãŒãããã®ããŒã¿ã®éçŽã åããŠã£ãããã£ã¢ã§ã¯ããããã®ç®çã§ãã«ããœãŒã¹ã䜿çšããŠããŸãã
- ãã«ããã¹ã¿ãŒæ©èœïŒä»»æã®ããããžã§ãå¿ èŠã«å¿ããŠè€æ°ã®æžã蟌ã¿å¯èœãªãµãŒããŒã䜿çšã§ããŸã
- éšåè€è£œïŒåã ã®ããŒãã«ãŸãã¯ã¹ããŒãã®ã¿ãè€è£œããæ©èœ
- ã³ã³ãã¯ãïŒãããã¯ãŒã¯ãä»ããŠéä¿¡ãããããŒã¿ã®éã¯å°ãªããªããŸãã å Žåã«ãã£ãŠã¯ãã¯ããã«å°ãªãã
ç©çã¬ããªã±ãŒã·ã§ã³ã®æ©èœïŒ
- æ§æãšäœ¿çšãç°¡åïŒãããµãŒããŒèªäœãå¥ã®ãµãŒããŒã«ãã€ããã©ãŒãªã³ã°ããã¿ã¹ã¯ã¯ãå€ãã®ãŠãŒã¹ã±ãŒã¹ãšããããžãæã€è«çã¬ããªã±ãŒã·ã§ã³ãããã¯ããã«ç°¡åã§ãã ãããã£ãŠããã¹ãŠã®MySQLãšPostgreSQLã®holivovã§æåãªãã»ããã¢ããããŠå¿ãããã
- ãªãœãŒã¹ã®æ¶è²»éãå°ãªãïŒå€æŽã®è«ççãªèª¬æãç©ççã«ãå€æãããå¿ èŠããããããè«çè€è£œã«ã¯è¿œå ã®ãªãœãŒã¹ãå¿ èŠã§ãã ãã£ã¹ã¯ã«äœãã©ãã«æžã蟌ãããæ£ç¢ºã«ç解ãã
- 100ïŒ ã®ããŒãIDèŠä»¶ïŒç©çã¬ããªã±ãŒã·ã§ã³ã¯ãããã»ããµã¢ãŒããã¯ãã£ãããŒãã«ã¹ããŒã¹ãã¡ã€ã«ãžã®ãã¹ãªã©ãå®å šã«åäžã®ãµãŒããŒéã§ã®ã¿å¯èœã§ãã å€ãã®å Žåãããã¯å€§èŠæš¡ãªã¬ããªã±ãŒã·ã§ã³ã¯ã©ã¹ã¿ã§ã¯åé¡ã«ãªãããšããããŸãã ãããã®èŠå ã®å€æŽã«ãããã¯ã©ã¹ã¿ãŒãå®å šã«åæ¢ããŸãã
- ã¹ã¬ãŒãã«ãšã³ããªããããŸããïŒåã®æ®µèœããç¶ããŸãã äžæããŒãã«ã§ããäœæã§ããŸããã
- ã¹ã¬ãŒãããã®èªã¿åãã«ã¯åé¡ããããŸããã¹ã¬ãŒãããã®èªã¿åãã¯å¯èœã§ãããåé¡ããªãããã§ã¯ãããŸããã 以äžã®ãPostgreSQLã®ç©çã¬ããªã±ãŒã·ã§ã³ããåç §ããŠãã ãã
- éãããããããžãŒïŒãã«ããœãŒã¹ããã³ãã«ããã¹ã¿ãŒã¯äžå¯èœã§ãã ããããã«ã¹ã±ãŒãè€è£œã
- éšåçãªè€è£œãªãïŒãã¹ãŠã®åãèŠä»¶ãããŒã¿ãã¡ã€ã«ã®100ïŒ ã®ã¢ã€ãã³ãã£ãã£ã«åŸããŸã
- 倧ããªãªãŒããŒãããïŒããŒã¿ãã¡ã€ã«å ã®ãã¹ãŠã®å€æŽã転éããå¿ èŠããããŸãïŒã€ã³ããã¯ã¹ãããã¥ãŒã ãããã³ãã®ä»ã®å éšã¢ã«ãŠã³ãã£ã³ã°ã®æäœïŒã ããã¯ããããã¯ãŒã¯äžã®è² è·ãè«çã¬ããªã±ãŒã·ã§ã³ãããé«ãããšãæå³ããŸãã ãã ããéåžžã®ãã¹ãŠã¯ãã€ã³ããã¯ã¹ã®æ°/ã¿ã€ããè² è·ãããã³ãã®ä»ã®èŠå ã«äŸåããŸãã
ãŸããè€è£œã¯ã圢åŒã«é¢ä¿ãªããåæãéåæãããã³ååæã«ããããšãã§ããŸãã ãããããã®äºå®ã¯ããã§èª¬æãããã®ãšã¯ã»ãšãã©é¢ä¿ããªããããæ¬åŒ§ã®å€ã«çœ®ããŸãã
MySQLã®ç©çã¬ããªã±ãŒã·ã§ã³
ããèªäœã§ã¯ãªããå°ãªããšããµãŒããŒèªäœã«ã¯çµã¿èŸŒãŸããŠããŸããã ããã«ã¯ã¢ãŒããã¯ãã£äžã®çç±ããããŸãããããã¯ååçã«äžå¯èœãšããæå³ã§ã¯ãããŸããã ãªã©ã¯ã«ã¯ãæ¯èŒçå°ãªãåŽåã§InnoDBã®ç©çã¬ããªã±ãŒã·ã§ã³ãå®è£ ã§ããŸããããããã¯ã»ãšãã©ã®ãŠãŒã¶ãŒã®ããŒãºããã§ã«ã«ããŒããŠããŸããã ããæŽç·Žãããã¢ãããŒãã§ã¯ãç©ççãªè€è£œããµããŒãã§ãã代æ¿ãšã³ãžã³ãå®è£ ããAPIãäœæããå¿ èŠããããŸããããããèµ·ãããšã¯æããŸããã
ãã ããå Žåã«ãã£ãŠã¯ã DRBDãããŒããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ã䜿çšãããªã©ãå€éšæ段ã«ãã£ãŠç©çã¬ããªã±ãŒã·ã§ã³ãå®è£ ã§ããŸãã ãã®ã¢ãããŒãã®é·æãšçæã¯ãç¹°ãè¿ã詳现ã«è°è«ãããŠããŸããã
PostgreSQLãšã®æ¯èŒã®ã³ã³ããã¹ãã§ã¯ãDRBDããã³é¡äŒŒã®MySQLç©çã¬ããªã±ãŒã·ã§ã³ãœãªã¥ãŒã·ã§ã³ã®äœ¿çšã¯ãPostgreSQLã®ãŠã©ãŒã ã¹ã¿ã³ãã€ã«æã䌌ãŠããããšã«æ³šæããå¿ èŠããããŸãã ãã ããDRBDã¯ãããã¯ããã€ã¹ã¬ãã«ã§åäœãããããDRBDã®ãããã¯ãŒã¯ãä»ããŠéä¿¡ãããããŒã¿ã®éã¯å€ããªããŸããã€ãŸããREDOãã°ïŒãã©ã³ã¶ã¯ã·ã§ã³ãã°ïŒã®ãšã³ããªã ãã§ãªããããŒã¿ãã¡ã€ã«ãšãã¡ã€ã«ã·ã¹ãã ã®ã¡ã¿æ å ±ã®æŽæ°ãèšé²ãããŸãã
MySQLã®è«çè€è£œ
ãã®ãããã¯ã¯æãè奮ãåŒãèµ·ãããŸãã ããã«ãæ¹å€ã®ã»ãšãã©ã¯ãOleg Tsarev zabivatorã«ãããæ€é²ã®ãªãéåæMySQLã¬ããªã±ãŒã·ã§ã³ããŸãã¯PostgreSQLãäžçãåŸæããçç±ããšHabréã«é¢ããé¢é£èšäºã«åºã¥ããŠããŸãã
以åã®èšäºã«é¢ãã10件ã®ã³ã¡ã³ãã®ãã¡çŽ1件ã§èšåãããŠããªãã£ãå Žåãç¹å®ã®ã¬ããŒãã1ã€åŒ·èª¿ããŸããã ãããã£ãŠãç§ã¯çããªããã°ãªããŸããããå®ç§ãªå ±åã¯ãªãïŒç§ã¯å人çã«æªãå ±åãåããŸãïŒããã¹ãŠã®æ¹å€ã¯è©±è ã§ã¯ãªããå ±åã®æè¡çãªäžæ£ç¢ºãã«åããããŠããããšã匷調ããããšæããŸãã ãããå°æ¥ã®ããŒãžã§ã³ã®æ¹åã«åœ¹ç«ã£ããå¬ããã§ãã
äžè¬ã«ãã¬ããŒãã«ã¯æè¡çã«äžæ£ç¢ºãŸãã¯åçŽã«èª€ã£ã声æãããªãå€ãå«ãŸããŠããããã®äžéšã¯äŒéè ã®ã¡ã¢ã®æåã®éšåã§åãäžããŸããã ããããç§ã¯ããããªããšã§drããããªãã®ã§ãèŠç¹ãåæããŸãã
ãã®ãããMySQLã§ã¯ãè«çã¬ããªã±ãŒã·ã§ã³ã¯ãã¹ããŒãã¡ã³ãããŒã¹ãšè¡ããŒã¹ã®2ã€ã®ãµãã¿ã€ãã§è¡šãããŸãã
ã¹ããŒãã¡ã³ãããŒã¹ã¯ã¬ããªã±ãŒã·ã§ã³ãæŽçããããã®æãçŽ æŽãªæ¹æ³ã§ãïŒãã ããSQLã³ãã³ããã¹ã¬ãŒãã«æž¡ããŠã¿ãŸãããïŒïŒããããMySQLã§æåã«ç»å Žããçç±ã§ãããããªãåã®ããšã§ãã SQLã³ãã³ããå³å¯ã«æ±ºå®ãããŠããéãæ©èœããŸãã ã©ã³ã¿ã€ã ãã³ã³ããã¹ããããªã¬ãŒãªã©ã«é¢ä¿ãªãåãå€æŽããããããŸãã ããã«ã€ããŠå€ãã®èšäºãæžãããŠããŸãããããã§ã¯è©³ãã説æããŸããã
ç§ã®æèŠã§ã¯ãã¹ããŒãã¡ã³ãããŒã¹ã®è€è£œã¯ãããã³ã°ã§ãããMyISAMã¹ã¿ã€ã«ã®ãã¬ã¬ã·ãŒãã§ãã ãã£ãšä»ã®èª°ãã圌女ã®äœ¿çšãèŠã€ããŸããã å¯èœã§ããã°ãããé¿ããŠãã ãã ã
èå³æ·±ãããšã«ããªã¬ã°ã¯ã¬ããŒãã§ã¹ããŒãã¡ã³ãããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ã®äœ¿çšã«ã€ããŠãèªã£ãŠããŸãã ãã®çç±ã¯ãè¡ããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ã1æ¥ã«ãã©ãã€ãã®æ å ±ãçæããããã§ãã äžè¬çã«ã©ã¡ããè«ççã§ãããPostgreSQLã«ã¹ããŒãã¡ã³ãããŒã¹ã®éåæã¬ããªã±ãŒã·ã§ã³ããŸã£ãããªãå ŽåããPostgreSQLã¯äžçãåŸæããããšããæãšã©ã®ããã«äžèŽããŸããïŒ ã€ãŸããPostgreSQLã¯1æ¥ã«æ°ãã©ãã€ãã®æŽæ°ãçæãããã£ã¹ã¯ãŸãã¯ãããã¯ãŒã¯ã¯äºæ³ã©ãããããã«ããã¯ãã«ãªããäžçã®åŸæã§ã¯åŸ ããªããã°ãªããŸãã ã
Olegã¯ãéåžžãè«çã¬ããªã±ãŒã·ã§ã³ã¯CPUã«ãã€ã³ããããŠãããã€ãŸãããã»ããµäžã«ãããç©çã¬ããªã±ãŒã·ã§ã³ã¯éåžžI / Oã«ãã€ã³ããããŠãããã€ãŸããããã¯ãŒã¯/ãã£ã¹ã¯äžã«ãããšããäºå®ã«æ³šç®ããŸãã ç§ã¯ãã®å£°æãå®å šã«ç¢ºä¿¡ããŠããŸãããçæã§ã®CPUãã€ã³ãã®èªã¿èŸŒã¿ã¯ãã¢ã¯ãã£ããªããŒã¿ã»ãããã¡ã¢ãªã«åãŸããªããªããšããã«ãšã¬ã¬ã³ããªI / Oãã€ã³ãã«å€ãããŸãïŒããšãã°ãFacebookã®å žåçãªç¶æ³ïŒã ããã«äŒŽããè«ççè€è£œãšç©ççè€è£œã®éãã®å€§éšåãå¹³æºåãããŸãã ããããäžè¬çã«ã¯ãè«çè€è£œã«ã¯æ¯èŒçå€ãã®ãªãœãŒã¹ãå¿ èŠã§ããïŒãããäž»ãªæ¬ ç¹ã§ãïŒãç©ççãªãœãŒã¹ãå°ãªããŠæžã¿ãŸãïŒãããŠãããã»ãšãã©å¯äžã®å©ç¹ã§ãïŒã
ãã¹ããŒããŠã³ãã¬ããªã±ãŒã·ã§ã³ã«ã¯å€ãã®çç±ããããŸããããã¯ãã·ã³ã°ã«ã¹ã¬ãããŸãã¯ããã»ããµäžè¶³ã ãã§ãªãããããã¯ãŒã¯ããã£ã¹ã¯ãéå¹ççãªèŠæ±ãäžé©åãªæ§æãªã©ã§ãã ãã®ã¬ããŒãã®äž»ãªå®³ã¯ããMySQLã®ã¢ãŒããã¯ãã£äžã®èª€ããã«é¢ãããã¹ãŠã®åé¡ã説æãããããã®åé¡ã«ã¯è§£æ±ºçããªããšããå°è±¡ãæ®ããŠãããšããäºå®ã«ãããŸãã ãããã圌ããã¹ãŠã®çžã®äŒéè ã«åãã§å¥ä»ãããçç±ã§ãã å®éã1ïŒã»ãšãã©ã®åé¡ã«ã¯è§£æ±ºçãããã2ïŒãããã®åé¡ã¯ãã¹ãŠãPostgreSQLã®è«çã¬ããªã±ãŒã·ã§ã³ã®å®è£ ã«ååšããããããããæ·±å»ãªåœ¢åŒã§ãã£ãŠã確ãã§ãïŒãPostgreSQLã®è«çã¬ããªã±ãŒã·ã§ã³ããåç §ïŒã
Olegã®ã¬ããŒãããã圌ã®ãã¹ãã§å®éã«äœãåé¡ã«ãªã£ãããç解ããããšã¯éåžžã«å°é£ã§ããåæããè©Šã¿ã¯ãªããOSã¬ãã«ã§ããµãŒããŒã¬ãã«ã§ãã¡ããªãã¯ã¯ãããŸããã æ¯èŒã®ããïŒBooking.comããã®åããããã¯ã«é¢ãããšã³ãžãã¢ã®å ¬é ã詳现ãªåæãšãçŠé³äž»çŸ©çãçµè«ãªãã Under the Hoodã»ã¯ã·ã§ã³ãèªãããšãç¹ã«ãå§ãããŸãã ããããã³ãããŒã¯ãå®è¡ããŠè¡šç€ºããæ£ããæ¹æ³ã§ãã Olegã®ã¬ããŒãã§ã¯ã3ã€ã®ã¹ã©ã€ãããã³ãããŒã¯ã«å²ãåœãŠãããŸããã
èããããåé¡ãšãã®è§£æ±ºçãç°¡åã«ãªã¹ãããŸãã ç§ã¯ãããã象ã§ã¯ãã¹ãŠãã·ã£ãŒãããºã ãªãã§ããŸãããããšãã粟ç¥ã§å€ãã®ã³ã¡ã³ããäºæ³ããŠããŸãã äžåºŠçããŸãããããã¯ããŸãããç©ççã¬ããªã±ãŒã·ã§ã³ã¯è«ççãããæ§æãç°¡åã§ããã誰ããååãªæ©èœãåããŠããããã§ã¯ãããŸããã è«ççãªå¯èœæ§ã¯ãã£ãšãããŸãããæ¬ ç¹ããããŸãã MySQLã®æ¬ é¥ãæå°éã«æããæ¹æ³ã以äžã«ç€ºããŸãã
ãã£ã¹ã¯ã«å¯ãããã£ãã
å€ãã®å ŽåãããŸããããã¯ã¡ã€ã³ãµãŒããŒã§ã¯ãªãããã®å€ãæµåãããŠã³ããããšããçç±ã§ãã¹ã¬ãŒãã«åŒ±ããã·ã³ãå²ãåœãŠãããŸãã å€ãçå°ã«ã¯ãéåžžããã¹ãŠã眮ãããŠãã匱ããã£ã¹ã¯ããããŸãã
ã¬ããªã±ãŒã·ã§ã³äžã«ãã£ã¹ã¯ãããã«ããã¯ã§ããããã匷åãªãã®ã䜿çšã§ããªãå Žåã¯ããã£ã¹ã¯ã®è² è·ãæžããå¿ èŠããããŸãã
ãŸãããã¹ã¿ãŒããã€ããªãã°ã«æžã蟌ãæ å ±ã®éã調æŽã§ããŸããããã¯ããããã¯ãŒã¯ãä»ããŠéä¿¡ãããã¹ã¬ãŒãã§æžã蟌ã¿/èªã¿åããè¡ãããããšãæå³ããŸãã
binlog_rows_query_log_events
䟡å€ã®ããèšå®ïŒ
binlog_rows_query_log_events
ã
binlog_row_image
ã
次ã«ãã¹ã¬ãŒãã®ãã€ããªãã°ãç¡å¹ã«ããããšãã§ããŸãã ããã¯ãã¹ã¬ãŒãèªäœããã¹ã¿ãŒã§ããå Žåã«ã®ã¿å¿ èŠã§ãïŒãã«ããã¹ã¿ãŒããããžå ããŸãã¯ã«ã¹ã±ãŒãã¬ããªã±ãŒã·ã§ã³ã®äžéãã¹ã¿ãŒãšããŠïŒã ãã§ãŒã«ãªãŒããŒã®å Žåã«ã¹ã¬ãŒãã®ãã¹ã¿ãŒã¢ãŒããžã®åãæ¿ããé«éåããããã«ããã€ããªãã°ãæå¹ã«ããŠãããã®ããããŸãã ãã ãããã£ã¹ã¯ã®ããã©ãŒãã³ã¹ã«åé¡ãããå Žåã¯ãç¡å¹ã«ããããšãã§ããŸãã
第äžã«ãã¹ã¬ãŒãã®èä¹ æ§èšå®ãç·©ããããšãã§ããŸãã å®çŸ©ã«ãããã¹ã¬ãŒãã¯ïŒéåæã®ããïŒç¡é¢ä¿ã§ãããããŒã¿ã®å¯äžã®ã³ããŒã§ã¯ãããŸãããã€ãŸããããŒã¿ãèœã¡ãå Žåãããã¯ã¢ããããã¹ã¿ãŒããŸãã¯å¥ã®ã¹ã¬ãŒãã®ããããããåäœæã§ããŸãã ãããã£ãŠãå³å¯ãªèä¹ æ§èšå®ãããŒã¯ãŒãïŒ
sync_binlog
ã
innodb_flush_log_at_trx_commit
ã
innodb_doublewrite
ãä¿æããããšã¯æå³ããããŸããã
æåŸã«ãéäžçãªèšé²ã®ããã«InnoDBã®äžè¬çãªæ§æããã£ã³ã»ã«ãã人ã¯ããŸããã§ããã ããŒã¯ãŒãïŒ
innodb_max_dirty_pages_pct
ã
innodb_stats_persistent
ã
innodb_adaptive_flushing
ã
innodb_flush_neighbors
ã
innodb_write_io_threads
ã
innodb_io_capacity
ã
innodb_purge_threads
ã
innodb_log_file_size
ä»ã®ãã¹ãŠã倱æããå Žåãç¹ã«ããŒã¿ãã¡ã¢ãªã«åãŸããªãå Žåã¯éäžçãªèšé²çšã«æé©åããã次ã«èªã¿åãäžèŠãªã¬ããªã±ãŒã·ã§ã³ãæŽçããæ©èœãæäŸããTokuDBãšã³ãžã³ã®æ¹åãèŠãããšãã§ããŸãã ããã«ãããIOããŠã³ããšCPUããŠã³ãã®äž¡æ¹ã®è² è·ã®åé¡ã解決ã§ããŸãã
ããã»ããµã«ééããå Žå
ãã¹ã¿ãŒã§ããªãæ¿ããé²é³ãè¡ãããã¹ã¬ãŒãïŒãããã¯ãŒã¯ããã£ã¹ã¯ïŒã«ä»ã®ããã«ããã¯ãååšããªãå Žåãããã»ããµã«ã¢ã¯ã»ã¹ã§ããŸãã 䞊åã¬ããªã±ãŒã·ã§ã³ã¯ããã§ã®å©ããšãªãããã«ãã¹ã¬ããã¹ã¬ãŒãïŒMTSïŒã§ããããŸãã
5.6ã§ã¯ãMTSã¯éåžžã«éå®çãªæ¹æ³ã§äœæãããŸãããç°ãªãããŒã¿ããŒã¹ãžã®æŽæ°ã®ã¿ã䞊è¡ããŠå®è¡ãããŸããïŒPostgreSQLã®çšèªã§ã®ã¹ããŒã ïŒã ãããã確ãã«äžçã«ã¯ãããã§ååãªç©ºã§ãªããŠãŒã¶ãŒã®ã»ãããããŸãïŒããã«ã¡ã¯ããã¹ãã£ã³ã°äŒç€ŸïŒïŒã
5.7ã§ã¯ãMTSã¯ä»»æã®æŽæ°ã䞊è¡ããŠå®è¡ããããã«æ¡åŒµãããŸããã åæã®ãã¬ãªãªãŒã¹ããŒãžã§ã³5.7ã§ã¯ãåæå®è¡ã¯ã°ã«ãŒãã³ãããå ã§åæã«ã³ãããããããã©ã³ã¶ã¯ã·ã§ã³ã®æ°ã«ãã£ãŠå¶éãããŠããŸããã ç¹ã«é«éãã£ã¹ã¯ãåããã·ã¹ãã ã®å Žåããã®å¶éããã䞊ååŠçã¯ããããã®åæããŒãžã§ã³ããã¹ããã人ã«ãšã£ãŠã¯äžååãªå¹æãããããå¯èœæ§ãé«ãã§ãã ããã¯éåžžã«æ£åžžãªããšã§ãããšããã®ãããããã¯ä»¥åã®ããŒãžã§ã³ã§ãããããé¢å¿ã®ãããŠãŒã¶ãŒããã¹ãããŠscãããšãã§ããããã§ãã ãããããã¹ãŠã®ãŠãŒã¶ãŒããPostgreSQLãäžçãåŸæããããšããçµè«ãåºããŠã¬ããŒããäœæããããšããŠããããã§ã¯ãããŸããã
ããã«ãããããããOlegãã¬ããŒãã«äœ¿çšãããã¹ãŠã®åãsysbenchãã¹ãã®çµæãããã«ãããŸãã ãGAãªãªãŒã¹5.7ã§æ¢ã«ã§ãã 也ç¥æ®çç©ã«èŠããããã®ïŒ
- ã¹ã¬ãŒãäžã®MTSã¯ãã·ã³ã°ã«ã¹ã¬ããã¬ããªã±ãŒã·ã§ã³ã®10åã®ããã©ãŒãã³ã¹åäžãå®çŸããŸãã
-
slave_parallel_workers=4
ã䜿çšãããšããã§ã«ã¹ã¬ãŒãã®ã¹ã«ãŒãããã3.5å以äžå¢å ããŸãã - è¡ããŒã¹ã®ã¬ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã¯ãã»ãšãã©ã®å Žåãã¹ããŒãã¡ã³ãããŒã¹ãããé«ããªããŸãã ãã ããMTSã¯ã¹ããŒãã¡ã³ãããŒã¹ã«ãã倧ããªåœ±é¿ãäžããŸããOLTPããŒãã®ããã©ãŒãã³ã¹ã«é¢ããŠã¯ãäž¡æ¹ã®ãã©ãŒããããå€å°çãããªããŸãã
Booking.comãã¹ãã®ãã1ã€ã®éèŠãªçµè«ïŒãã©ã³ã¶ã¯ã·ã§ã³ãµã€ãºãå°ããã»ã©ãããå€ãã®äžŠååŠçãå®çŸã§ããŸãã 5.6ã§ã®ã°ã«ãŒãã³ãããã®ç»å Žã«å ç«ã£ãŠãéçºè ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãå¯èœãªéã倧ããããããšããŸããããã¢ããªã±ãŒã·ã§ã³ã®èŠ³ç¹ããã¯äžå¿ èŠã«å€ãå ŽåããããŸããã 5.6以éãããã¯å¿ èŠãããŸãããã5.7ã®äžŠåã¬ããªã±ãŒã·ã§ã³ã®å Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³ãåæ€èšããå¯èœãªéãå°ãããã©ã³ã¶ã¯ã·ã§ã³ã«åå²ããããšããå§ãããŸãã
ããã«ããŠã£ã¶ãŒãã§
binlog_group_commit_sync_delay
ããã³
binlog_group_commit_sync_no_delay_count
ã調æŽã§ã
binlog_group_commit_sync_no_delay_count
ãããã«ãããé·ããã©ã³ã¶ã¯ã·ã§ã³ã®å Žåã§ãã¹ã¬ãŒãã§è¿œå ã®äžŠååŠçãå¯èœã«ãªããŸãã
ãã®ãããã¯ã§ã¯ãMySQLã§ã®ã¬ããªã±ãŒã·ã§ã³ãšäžè¬çãªã¬ããŒãã䜿çšããŠãçµäºãããšæãã®ã§ãPostgreSQLã«é²ã¿ãŸãã
PostgreSQLã®ç©çã¬ããªã±ãŒã·ã§ã³
åè¿°ã®ç©çã¬ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®é·æãšçæã«å ããŠãPostgreSQLã®å®è£ ã«ã¯å¥ã®éèŠãªæ¬ ç¹ããããŸããWALã®äºææ§ã¯ä¿èšŒãããªããããPostgreSQLã®ã¡ãžã£ãŒãªãªãŒã¹éã§ã¬ããªã±ãŒã·ã§ã³ã®äºææ§ã¯ä¿èšŒãããŸããã ããã¯ãããŒãããããããžã§ã¯ããšå€§èŠæš¡ãªã¯ã©ã¹ã¿ãŒã«ãšã£ãŠæ¬åœã«æ·±å»ãªæ¬ ç¹ã§ãããŠã£ã¶ãŒããåæ¢ããã¢ããã°ã¬ãŒãããŠãããã¹ã¬ãŒããå®å šã«åäœæããå¿ èŠããããŸãã æ¯èŒã®ããã«ãå€ãããŒãžã§ã³ããæ°ããããŒãžã§ã³ãžã®ã¬ããªã±ãŒã·ã§ã³ã®åé¡ã¯MySQLã§çºçããŸãããä¿®æ£ãããŠãããã»ãšãã©ã®å Žåã¯æ©èœããŸãããäºææ§ãæåŠãã人ã¯ããŸããã 倧èŠæš¡ãªã¯ã©ã¹ã¿ãŒãã¢ããã°ã¬ãŒããããšãã«äœ¿çšããããã®-ãæ¬ é¥ã®ãããè«çè€è£œã®å©ç¹ã
PostgreSQLã¯ãã¹ã¬ãŒãïŒãããããããã¹ã¿ã³ãã€ïŒããããŒã¿ãèªã¿åãæ©èœãæäŸããŸãããããã¯è«çã¬ããªã±ãŒã·ã§ã³ã®ããã«åçŽã§ã¯ãããŸããã ãããã¹ã¿ã³ãã€ã«é¢ããããã¥ã¡ã³ãããã次ã®ããšãããããŸããã
-
SELECT ... FOR SHARE | UPDATE
ããŒã¿ãã¡ã€ã«ã®å€æŽãå¿ èŠãªãããSELECT ... FOR SHARE | UPDATE
ãµããŒããããŠããŸãã - 2PCã³ãã³ãã¯åãçç±ã§ãµããŒããããŠããŸãã
- ãèªã¿åãæžã蟌ã¿ããã©ã³ã¶ã¯ã·ã§ã³ã¹ããŒã¿ã¹ã®æ瀺çãªè¡šç€ºïŒ
BEGIN READ WRITE
ãªã©ïŒãLISTENãUNLISTENãNOTIFYãã·ãŒã±ã³ã¹ã®æŽæ°ã¯ãµããŒããããŠããŸããã ããã¯äžè¬çã«ç解ã§ããŸãããããã¯ãäžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯ãããŒã¿ãå€æŽããªããŠãããããã¹ã¿ã³ãã€ã«ç§»è¡ãããšãã«æžãæããå¿ èŠãããããšãæå³ããŸã - èªã¿åãå°çšã®ãªã¯ãšã¹ãã§ããããŠã£ã¶ãŒãã®DDLããã³ããã¥ãŒã æäœãšç«¶åããå¯èœæ§ããããŸãïŒãç©æ¥µçãªãããã¥ãŒã èšå®ã«ãããŒïŒïŒã
- ã¹ã¬ãŒãã¯ããŠã£ã¶ãŒãã«ããã£ãŒãããã¯ããæäŸããããã«æ§æã§ããŸãïŒ
hot_standby_feedback
ãã©ã¡ãŒã¿ãŒïŒã ããã¯è¯ãããšã§ãããããŒããããã·ã¹ãã ã§ã®ãã®ã¡ã«ããºã ã®ãªãŒããŒãããã¯èå³æ·±ããã®ã§ãã
ããã«ãåãããã¥ã¡ã³ãã§ãã°ãããèŠåãèŠã€ããŸããã
- ãçŸåšãããã·ã¥ã€ã³ããã¯ã¹ã®æäœã¯WALãã°ã«èšé²ãããŠããªãããããªãã¬ã€ã¯ãããã®ã€ã³ããã¯ã¹ãæŽæ°ããŸããã -ãããšãã©ãã§ããïŒ ç©ççãªããã¯ã¢ããã¯ã©ãã§ããïŒ
ãã§ãŒã«ãªãŒããŒåŸãå€ããã¹ã¿ãŒã«åäœæããã«å ã®ãã¹ã¿ãŒã«æ»ãããšãã§ããªããªã©ãMySQLãŠãŒã¶ãŒã«ãšã£ãŠã¯å¥åŠã«æããæ©èœãããã€ããããŸãã ç§ã¯ããã¥ã¡ã³ããåŒçšããŸãïŒ
ã¹ã¿ã³ãã€ãžã®ãã§ãŒã«ãªãŒããŒãçºçãããšãåäœããŠãããµãŒããŒã¯1ã€ã ãã«ãªããŸãã ããã¯çž®éç¶æ ãšåŒã°ããŸãã 以åã®ã¹ã¿ã³ãã€ããã©ã€ããªã«ãªããŸãããã以åã®ãã©ã€ããªã¯ããŠã³ããŠãããããŠã³ãããŸãŸã«ãªãå¯èœæ§ããããŸãã éåžžã®åäœã«æ»ãã«ã¯ãã¹ã¿ã³ãã€ãµãŒããŒãã以åã®ãã©ã€ããªã·ã¹ãã ãèµ·åãããšãã«ããŸãã¯3çªç®ã®ïŒå Žåã«ãã£ãŠã¯æ°ããïŒã·ã¹ãã ã§åäœæããå¿ èŠããããŸãã
PostgreSQLã«ã¯ãç©çââã¬ããªã±ãŒã·ã§ã³ã®å¥ã®ç¹å®ã®æ©èœããããŸãã äžã§æžããããã«ãç©çã¬ããªã±ãŒã·ã§ã³ã®ãã©ãã£ãã¯ãªãŒããŒãããã¯äžè¬ã«è«çã¬ããªã±ãŒã·ã§ã³ãããé«ããªããŸãã ãã ããPostgeSQLã®å Žåããã§ãã¯ãã€ã³ãïŒ
full_page_writes
ïŒã®åŸã«æŽæ°ãããããŒãžã®å®å šãªç»åãWALã«æžã蟌ãŸããŸãïŒãããã£ãŠããããã¯ãŒã¯çµç±ã§éä¿¡ãããŸãïŒã ãã®ãããªè¡åãçœå®³ã«ãªããããªãè² è·ãç°¡åã«æ³åã§ããŸãã ããã§ã確ãã«ãäœäººãã®äººãæ¥ãã§
full_page_writes
ã®æå³ã説æããŠãããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãä»ããã«ãInnoDBã§å®è£ ãå°ãç°ãªãããšãç¥ã£ãŠããŸãã
æŽæ°ããã2016幎9æ28æ¥ïŒã¬ããªã±ãŒã·ã§ã³ã«é¢ããåãåé¡ã§ãããPostgreSQLããMySQLã«åãæ¿ããçç±ã«é¢ããUberãšã³ãžãã¢ã®èšäºã®è±èªã®åèªïŒ eng.uber.com/mysql-migration
2017幎10æ30 æ¥æŽæ°ïŒ PostgreSQLã¬ããªã±ãŒã·ã§ã³ãç©ççã§ãããšããäºå®ããæ£ç¢ºã«çããèå³æ·±ãåé¡ïŒ thebuild.com/blog/2017/10/27/streaming-replication-stopped-one-more-thing-to-check
ãã以å€ã®å ŽåãPostgreSQLã®ç©çã¬ããªã±ãŒã·ã§ã³ã¯ãããããç©çã¬ããªã±ãŒã·ã§ã³ãäžè¬çã«é©ããŠãã人ã«ãšã£ãŠã¯ãéåžžã«ä¿¡é Œæ§ãé«ãèšå®ã容æãªã¡ã«ããºã ã§ãã
ããããPostgreSQLãŠãŒã¶ãŒã人éã§ããã人éã«ãšã£ãŠç°è³ªãªãã®ã¯ãããŸããã誰ããæã ãã«ããœãŒã¹ãæãã§ããŸãããããŠãã ããããã«ããã¹ã¿ãŒè€è£œãŸãã¯éšåè€è£œãæ¬åœã«å¥œãã§ãããããããããååšããçç±ã§ã...
PostgreSQLã®è«çã¬ããªã±ãŒã·ã§ã³
ç§ã¯PostgreSQLã®è«çè€è£œã®ç¶æ ãç解ããããšããŸããããèœèããŸããããã«ãã€ã³ã¯ãªãããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ããããããããŸãïŒèª°ããæ··ä¹±ããšèšã£ãã®ã§ããïŒïŒïŒSlony-IïŒãšããã§ãSlony-IIã¯ã©ãã§ããïŒïŒãBucardoãLondisteãBDRãpgpool 1/2ãLogical DecodingããããŠããã¯æ»è ãæ°ããŸãããŸãã¯ç¬èªã®ãããžã§ã¯ãã
誰ããç¬èªã®åé¡ãæ±ããŠããŸã-èŠæ £ããŠããããã«èŠãããã®ïŒMySQLã§ã®è€è£œã¯ãã°ãã°æ¹å€ãããŸãïŒãMySQLãŠãŒã¶ãŒã«ãšã£ãŠã¯å¥åŠã«èŠãããã®ããããŸããè«çãã³ãŒãã§ããµããŒããããŠããªããDDLã¬ããªã±ãŒã·ã§ã³ã«é¢ããããçš®ã®å®å šãªãã©ãã«ïŒãªãã ãããïŒïŒ
BDRã«ã¯ãããããé©çšããPostgreSQLãå¿ èŠã§ãïŒèª°ãããã©ãŒã¯ããšèšã£ãã®ã§ããïŒïŒã
ç§ã¯ããã©ãŒãã³ã¹ã«ã€ããŠããã€ãã®çåãæã£ãŠããŸããã³ã¡ã³ãã®èª°ããPerl / Pythonã®ããªã¬ãŒãšã¹ã¯ãªããã®è€è£œãéãããšã説æãå§ãããšç¢ºä¿¡ããŠããŸãããåãããŒããŠã§ã¢ã§MySQLãšã®æ¯èŒè² è·ãã¹ããèŠããšãã«ã®ã¿ãããä¿¡ããŸãã
è«çãã³ãŒãã¯èå³æ·±ãããã§ãããããïŒ
- ããã¯ãã¬ããªã±ãŒã·ã§ã³ãã®ãã®ã§ã¯ãªãããµãŒãããŒãã£ã®è«çã¬ããªã±ãŒã·ã§ã³ãœãªã¥ãŒã·ã§ã³ãäœæããããã®ã³ã³ã¹ãã©ã¯ã¿ãŒ/ãã¬ãŒã ã¯ãŒã¯/ APIã§ãã
- è«çãã³ãŒãã䜿çšããã«ã¯ãè¿œå æ
å ±ãWALã«æžã蟌ãå¿
èŠããããŸãïŒã€ã³ã¹ããŒã«ãå¿
èŠã§ã
wal_level=logical
ïŒãMySQLã®ãã€ããªãã°ã®æ¹è©å®¶ã«ããã«ã¡ã¯ïŒ - ãµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ã®äžéšã¯ãã§ã«è«çãã³ãŒãã«ç§»è¡ããŠããŸãããäžéšã¯ç§»è¡ããŠããŸããã
- , row-based MySQL, : , GTID ( failover/switchover ?), .
- SQL Logical Decoding Poll , Push . , Push , - ?
- , . , ?
-
REPLICA IDENTITY
.binlog_row_image
MySQL. MySQL , , . PostgreSQL? - , « PostgreSQL »? ã .
ç§ãèšã£ãããã«ãç§ã¯PostgreSQLã«ã€ããŠç¥èããããµããããŸãããããã®ãããããäžæ£ç¢ºãŸãã¯äžæ£ç¢ºãªå Žåã¯ãã³ã¡ã³ãã§ãç¥ãããã ãããééããªãä¿®æ£ããŸããç§ãéäžã§æã£ãŠãã質åãžã®çããåŸãããšãèå³æ·±ãã§ãããã
ããããç§ã®å šäœçãªå°è±¡ã¯ãPostgreSQLã®è«çè€è£œã¯åæ段éã«ãããšããããšã§ãã MySQLã§ã¯ãè«ççãªè€è£œãé·ãéååšããŠããããã®é·æãçæãããã³èœãšãç©Žã¯ãã¹ãŠãããŸããŸãªã¬ããŒãã§ããç¥ãããç 究ãããè°è«ããã瀺ãããŠããŸããããã«ã圌女ã¯æè¿å€§ããå€ãããŸããã
ãããã«
ãã®åºçç©ã«ã¯PostgreSQLã«å¯Ÿããæ¹å€ãå«ãŸããŠããããããç§ã®å人ãšç§ã¯äžç·ã«çèã«åãçµã¿ããã¹ãŠãæªãã£ãããä»ã§ã¯è±¡ã«åãçµã¿ã人çã¯é 調ã«é²ãã§ããŸãããšããã¹ã¿ã€ã«ã®ã³ã¡ã³ãã®ççºãäºæ³ããŠããŸããä¿¡ããŸããããããæ¬åœã«ãããããã©ããã«ç§»åããããäœããå€æŽãããããããšã¯èª°ã«ãå§ããŸããã
ãã®èšäºã«ã¯2ã€ã®ç®æšããããŸã
ã1ïŒMySQLã«å¯Ÿããæ¹å€ããŸã£ããæ£ãããªããšããçããããã³
2ïŒMySQLãšPostgreSQLã®å€ãã®éããäœç³»åããè©Šã¿ããã®ãããªæ¯èŒã«ã¯å€ãã®äœæ¥ãå¿ èŠã§ãããããã¯ç§ãã³ã¡ã³ãã§ãã°ãã°æåŸ ããããšã§ãã
次ã®æçš¿ã§ã¯ãä»åã¯ããââã©ãŒãã³ã¹ã«ç §ãããŠæ¯èŒãç¶ããŸãã