æè¿ããã·ã¢ã®å€§äŒæ¥ã¯ãæé ãªäŸ¡æ Œã®ã¹ãã¬ãŒãžãœãªã¥ãŒã·ã§ã³ã«ãŸããŸã泚ç®ããŠããŸãããªãŒãã³ãœãŒã¹DBMSã¯ãOracleãSAP HANAãSybaseãInformixïŒPostgreSQLãMySQLãMariaDBãªã©ïŒã®ç«¶å補åã«ãªããŸãã欧米ã®å·šäººïŒAlibabaãInstagramãSkypeïŒã¯ãITæ¥çã§é·ãéãããã䜿çšããŠããŸããã
JetInfosystemsãæ°ããAISOSAGOã®ITã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ããŠãããã·ã¢èªåè»ä¿éºäŒç€Ÿé£åïŒRSAïŒã®ãããžã§ã¯ãã§ã¯ãéçºè ã¯PostgreSQLDBMSã䜿çšããŸããããããŠãããŒããŠã§ã¢é害ãçºçããå Žåã«ããŒã¿ããŒã¹ã®å¯çšæ§ãæ倧åããããŒã¿ã®æ倱ãæå°åããæ¹æ³ã«ã€ããŠèããŸããããããŠããã®ãœãªã¥ãŒã·ã§ã³ã®ãçŽé¢ã§ã®ã説æã¯2 + 2ã®ããã«åçŽã«èŠããŸããå®éãç§ãã¡ã®ããŒã ã¯èé害æ§ãéæããããã«äžçæžåœåªåããªããã°ãªããŸããã§ããã
PostgreSQLçšã®ãã§ã€ã«ãªãŒããŒã¯ã©ã¹ã¿ãªã³ã°ããŒã«ãããã€ããããŸãããããã¯ãStolonãPatroniãRepmgrãPacemaker + Corosyncãªã©ã§ãã
Patroniãéžæããã®ã¯ããã®ãããžã§ã¯ãã掻çºã«éçºãããŠããããã§ããåæ§ã®ãããžã§ã¯ããšã¯ç°ãªããæ確ãªããã¥ã¡ã³ãããããããŒã¿ããŒã¹ç®¡çè ã®éžæè¢ã«ãªãã€ã€ãããŸãã
ãã¹ãŒãã»ãããã®æ§æ
Patroniã¯ãPostgreSQLããŒã¿ããŒã¹ãµãŒããŒã®äž»èŠãªåœ¹å²ãã¬ããªã«ã«èªåçã«åãæ¿ããããã®äžé£ã®pythonã¹ã¯ãªããã§ãããŸããPostgreSQL DBMSèªäœã®ãã©ã¡ãŒã¿ãä¿åãå€æŽãããã³é©çšããããšãã§ããŸãã PostgreSQLæ§æãã¡ã€ã«ãåãµãŒããŒã§åå¥ã«ææ°ã®ç¶æ ã«ä¿ã€å¿ èŠã¯ãªãããšãããããŸããã
PostgreSQLã¯ãªãŒãã³ãœãŒã¹ã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§ããããã¯ã倧èŠæš¡ã§è€éãªåæããã»ã¹ã§ããèªäœã蚌æãããŠããŸãã
Keepalived-ãã«ãããŒãæ§æã§ã¯ããã©ã€ããªPostgreSQLããŒãã®åœ¹å²ãçŸåšäœ¿çšãããŠããã¯ã©ã¹ã¿ãŒã®ãŸãã«ããŒãã§å°çšIPã¢ãã¬ã¹ãæå¹ã«ããããã«äœ¿çšãããŸãã IPã¢ãã¬ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ãšãŠãŒã¶ãŒã®ãšã³ããªãã€ã³ããšããŠæ©èœããŸãã
DCSã¯åæ£æ§æã¹ãã¬ãŒãžã§ããPatroniã¯ããã䜿çšããŠãã¯ã©ã¹ã¿ãŒã®æ§æãã¯ã©ã¹ã¿ãŒãµãŒããŒã®åœ¹å²ã«é¢ããæ å ±ãæ ŒçŽããç¬èªã®PostgreSQLæ§æãã©ã¡ãŒã¿ãŒãæ ŒçŽããŸãããã®èšäºã§ã¯ãetcdã«çŠç¹ãåœãŠãŸãã
ãã¥ã¢ã³ã¹ã®ããå®éš
èé害æ§ã®æé©ãªãœãªã¥ãŒã·ã§ã³ãæ¢ããããŸããŸãªãªãã·ã§ã³ã®åäœã«é¢ãã仮説ããã¹ãããããã«ãããã€ãã®ãã¹ããã³ããäœæããŸãããæåã«ãã¿ãŒã²ããã¢ãŒããã¯ãã£ãšã¯ç°ãªããœãªã¥ãŒã·ã§ã³ãæ€èšããŸãããããšãã°ãPostgreSQLã®ãã©ã€ããªããŒããšããŠHaproxyã䜿çšããããDCSãPostgreSQLãšåããµãŒããŒã«é 眮ãããããŸãããå éšããã«ãœã³ãéå¬ãããµãŒããŒã³ã³ããŒãã³ãã®é害ããããã¯ãŒã¯ã®äœ¿çšäžå¯ããã¡ã€ã«ã·ã¹ãã ã®ãªãŒããŒãããŒãªã©ãçºçããå Žåã«Patroniãã©ã®ããã«åäœãããã調æ»ããŸãããã€ãŸãã圌ãã¯ããŸããŸãªé害ã·ããªãªãèãåºããŸããããããã®ãç§åŠçç 究ãã®çµæãšããŠãèé害æ§ãœãªã¥ãŒã·ã§ã³ã®æçµçãªã¢ãŒããã¯ãã£ã圢æãããŸããã
ãã€ITæçã®æç
PostgreSQLã«ã¯ãµãŒããŒã®åœ¹å²ããããŸããprimary-ããŒã¿ã®æžã蟌ã¿/èªã¿åãæ©èœãåããã€ã³ã¹ã¿ã³ã¹ãã¬ããªã«-èªã¿åãå°çšã€ã³ã¹ã¿ã³ã¹ã§ãããåžžã«ãã©ã€ããªãšåæãããŸãããããã®åœ¹å²ã¯ãPostgreSQLã®å®è¡äžã¯éçã§ããããã©ã€ããªã®åœ¹å²ãæã€ãµãŒããŒã«é害ãçºçããå ŽåãDBAã¯ã¬ããªã«ã®åœ¹å²ãæåã§ãã©ã€ããªã«äžããå¿ èŠããããŸãã
Patroniã¯ããã§ã€ã«ãªãŒããŒã¯ã©ã¹ã¿ãŒãäœæããŸããã€ãŸãããµãŒããŒããã©ã€ããªããã³ã¬ããªã«ã®åœ¹å²ãšçµã¿åãããŸããé害ãçºçããå Žåããããã®éã§èªåçã«åœ¹å²ãé転ããŸãã
äžã®å³ã¯ãã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãPatroniã¯ã©ã¹ã¿ãŒå ã®ãµãŒããŒã®1ã€ã«æ¥ç¶ããæ¹æ³ã瀺ããŠããŸãããã®æ§æã§ã¯ã1ã€ã®ãã©ã€ããªããŒããš2ã€ã®ã¬ããªã«ã䜿çšãããã®ãã¡ã®1ã€ã¯åæããŠããŸããåæã¬ããªã±ãŒã·ã§ã³ã§ã¯ãPostgreSQLã¯ããã©ã€ããªãåžžã«å€æŽãã¬ããªã«ã«æžã蟌ãŸããã®ãåŸ ã€ããã«æ©èœããŸããåæã¬ããªã«ã䜿çšã§ããªãå Žåããã©ã€ããªã¯ããèªäœã«å€æŽãæžã蟌ã¿ãŸãããèªã¿åãå°çšã«ãªããŸãããããPostgreSQLã®ã¢ãŒããã¯ãã£ã§ãã ããã®æ§è³ªãå€æŽãããããã«ã2çªç®ã®ã¬ããªã«ã䜿çšãããŸã-éåæïŒåæã¬ããªã±ãŒã·ã§ã³ãå¿ èŠãªãå Žåã¯ã1ã€ã®ã¬ããªã«ã«å¶éã§ããŸãïŒã
2ã€ä»¥äžã®ã¬ããªã«ã䜿çšããŠåæã¬ããªã±ãŒã·ã§ã³ãæå¹ã«ããå ŽåãPatroniã¯åžžã«1ã€ã®åæã¬ããªã«ã®ã¿ãäœæããŸãããã©ã€ããªããŒãã«é害ãçºçãããšãPatroniã¯åæã¬ããªã«ã®ã¬ãã«ãäžããŸãã
次ã®å³ã¯ãç£æ¥çšãšã³ã¿ãŒãã©ã€ãºãœãªã¥ãŒã·ã§ã³ã«äžå¯æ¬ ãªè¿œå ã®Patroniæ©èœïŒããã¯ã¢ãããµã€ããžã®ããŒã¿è€è£œïŒã瀺ããŠããŸãã
Patroniã¯ããã®æ©èœãstandby_clusterãšåŒã³ãŸããããã«ãããRatroniã¯ã©ã¹ã¿ãŒããªã¢ãŒããµã€ãã§éåæã¬ããªã«ãšããŠäœ¿çšã§ããŸããã¡ã€ã³ãµã€ãã倱ããããšãPatroniã¯ã©ã¹ã¿ãŒã¯ã¡ã€ã³ãµã€ãã§ãããã®ããã«æ©èœãå§ããŸãã
ããã¯ã¢ãããµã€ãã¯ã©ã¹ã¿ãŒã®ããŒãã®1ã€ã¯ãã¹ã¿ã³ãã€ãªãŒããŒãšåŒã°ããŸããããã¯ãã¡ã€ã³ãµã€ãã®ãã©ã€ããªããŒãã®éåæã¬ããªã«ã§ããããã¯ã¢ãããµã€ãã¯ã©ã¹ã¿ãŒã®æ®ãã®2ã€ã®ããŒãã¯ãã¹ã¿ã³ãã€ãªãŒããŒããããŒã¿ãåä¿¡ããŸãããããã«ã¹ã±ãŒãã¬ããªã±ãŒã·ã§ã³ã®å®è£ æ¹æ³ã§ãããæè¡ãµã€ãéã®ãã©ãã£ãã¯éãåæžããŸãã
Patroniã¯ã©ã¹ã¿ãŒã¢ããªã±ãŒã·ã§ã³ã®æ§æ
èµ·åãããšãPatroniã¯å¥ã®TCPããŒããäœæããŸãããã®ããŒãã«HTTPèŠæ±ãè¡ããšãã¯ã©ã¹ã¿ãŒã®ã©ã®ããŒãããã©ã€ããªã§ãã©ã®ããŒããã¬ããªã«ã§ããããç解ã§ããŸãã
keepalivedã§ã¯ãPatroniTCPããŒããããŒãªã³ã°ããç£èŠãªããžã§ã¯ããšããŠå°ããªèªäœã®ã¹ã¯ãªãããæå®ããŸãããã¹ã¯ãªããã¯HTTPGET 200å¿çãæ³å®ããŠããŸããå¿çããã¯ã©ã¹ã¿ãŒããŒãã¯ãã©ã€ããªããŒãã§ãããkeepalivedã¯ãã®äžã§ã¯ã©ã¹ã¿ãŒãžã®æ¥ç¶å°çšã®IPã¢ãã¬ã¹ãèµ·åããŸãã
åæã¬ããªã«ããã®HTTPGET 200å¿çãåŸ æ©ããããã«2çªç®ã®keepalivedã€ã³ã¹ã¿ã³ã¹ãæ§æãããšãåãã¯ã©ã¹ã¿ãŒããŒãäžã®keepalivedã¯å¥ã®å°çšIPã¢ãã¬ã¹ãèµ·åããŸãããã®ã¢ãã¬ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ããããŒã¿ãèªã¿åãããã«äœ¿çšã§ããŸãããã®ãªãã·ã§ã³ã¯ãããšãã°ãã¬ããŒãã®äœæã«åœ¹ç«ã¡ãŸãã
Patroniã¯ã¹ã¯ãªããã®ã»ããã§ãããããåããŒãäžã®ã€ã³ã¹ã¿ã³ã¹ã¯çžäºã«çŽæ¥ãéä¿¡ãããŸããããããã«ã¯æ§æã¹ãã¢ã䜿çšããŸãããããšããŠetcdã䜿çšããŸããããã¯ãPatronièªäœã®ã¯ã©ãŒã©ã ã§ããçŸåšã®ãã©ã€ããªããŒãã¯ãetcdãªããžããªå ã®ããŒãåžžã«æŽæ°ãããããäž»èŠãªãã®ã§ããããšã瀺ããŸããæ®ãã®ã¯ã©ã¹ã¿ãŒããŒãã¯åžžã«ãã®ããŒãèªã¿åããããããã¬ããªã«ã§ããããšããç解ãããŸãã etcdãµãŒãã¹ã¯ã3ãŸãã¯5ã®éã®å°çšãµãŒããŒã«ãããŸãããããã®ãµãŒããŒéã®etcdãªããžããªå ã®ããŒã¿ã®åæã¯ãetcdãµãŒãã¹èªäœã«ãã£ãŠå®è¡ãããŸãã
å®éšã®éçšã§ãetcdãµãŒãã¹ãå¥ã®ãµãŒããŒã«ç§»åããå¿ èŠãããããšãããããŸããããŸããetcdã¯ãããã¯ãŒã¯ã®åŸ ã¡æéãšãã£ã¹ã¯ãµãã·ã¹ãã ã®å¿çæ§ã«éåžžã«ææã§ãããå°çšãµãŒããŒã¯ããŒããããŸããã次ã«ãPatroniã¯ã©ã¹ã¿ãŒã®ããŒãããããã¯ãŒã¯ã§åé¢ãããŠããå¯èœæ§ããããããããã¬ã€ã³ã¹ããªããããçºçããå¯èœæ§ããããŸããetcdã¯ã©ã¹ã¿ãŒãã厩å£ãããããã2ã€ã®ãã©ã€ããªããŒãã衚瀺ããããäºãã«ã€ããŠäœãç¥ããŸããã
ç·Žç¿ãã§ãã¯
AIS OSAGOã®ITã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ãããããžã§ã¯ãã®èŠæš¡ã§ã¯ãPostgreSQLã®èé害æ§ãå®çŸããããšã¯ããªãŒãã³DBMSãäŒæ¥ã®ITã©ã³ãã¹ã±ãŒãã«ãçµã¿èŸŒããã¿ã¹ã¯ã®1ã€ã§ãããã®é£ã«ã¯ãPostgreSQLã¯ã©ã¹ã¿ãŒãããã¯ã¢ããã·ã¹ãã ãšçµ±åããããšãã€ã³ãã©ã¹ãã©ã¯ãã£ã®ç£èŠãšæ å ±ã»ãã¥ãªãã£ããŒã«ãããã³ããã¯ã¢ãããµã€ãã§ã®ä¿¡é Œã§ããããŒã¿ã®å®å šæ§ã«é¢ããé¢é£ããåé¡ããããŸãããããã®åæ¹åã«ã¯ãç¬èªã®èœãšãç©Žãšããããåé¿ããæ¹æ³ããããŸãããã®ãã¡ã®1ã€ã«ã€ããŠã¯ãã§ã«èª¬æããŸããããšã³ã¿ãŒãã©ã€ãºãœãªã¥ãŒã·ã§ã³ã䜿çšããPostgreSQLããã¯ã¢ããã«ã€ããŠèª¬æããŸããã
ã¹ã¿ã³ãã§ç§ãã¡ãèãããã¹ãããPostgreSQLã®ãã©ãŒã«ããã¬ã©ã³ã¹ã¢ãŒããã¯ãã£ã¯ãå®éã«ãã®æå¹æ§ã蚌æããŠããŸãããã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããŸãªã·ã¹ãã ããã³è«çé害ãã転éãããæºåãã§ããŠããŸããçŸåšã10åã®é«è² è·ã®Patroniã¯ã©ã¹ã¿ãŒã§å®è¡ããã1æéãããæ°çŸã®ã¬ãã€ãã®ããŒã¿ã®PostgreSQLåŠçè² è·ã«èããŸãã
èè ïŒããããªãŒErykinããšã®ã³ã³ãã¥ãŒãã£ã³ã°ã·ã¹ãã ã®ãšã³ãžãã¢ããã¶ã€ããŒãžã§ããã€ã³ãã©ã·ã¹ãã ãº