±¾ÎÄÏêϸÃèÊöÁËPhxSQLµÄÉè¼ÆÓëʵÏÖ¡£´ÓMySQLµÄÈÝÔÖȱÏÝ¿ªÊ¼½²Æð£¬½Ó×ŲûÊöʵÏָ߿ÉÓÃǿһÖµÄ˼·£¬È»ºó¾ßÌå·ÖÎöÿ¸öʵÏÖ»·½ÚҪעÒâµÄÒªµãºÍ½â¾ö·½°¸£¬×îºóչʾÁËPhxSQLÔÚÈÝÔÖºÍÐÔÄÜÉϵijɹû¡£
Éè¼Æ±³¾°
»¥ÁªÍøÓ¦ÓÃÖÐÕ˺źͽðÈÚÀà¹Ø¼üϵͳҪÇóºÍÇ¿µ÷ǿһÖÂÐÔ¼°¸ß¿ÉÓÃÐÔ¡£µ±ÃæÁÙ»úÆ÷Ë𻵡¢ÍøÂç·ÖÇø¡¢Ö÷±¸ÊÖ¹¤»òÕß×Ô¶¯Çл»Ê±£¬´«Í³µÄMySQLÖ÷±¸ÄÑÒÔ±£Ö¤Ç¿Ò»ÖÂÐԺ͸߿ÉÓÃÐÔ¡£PhxSQL½«MySQL¼¯Èº¹¹½¨ÔÚÒ»ÖÂÐÔÍêÉÆµÄPaxosÐÒé»ù´¡ÉÏ£¬±£Ö¤Á˼¯ÈºÄÚMySQL»úÆ÷Ö®¼äÊý¾ÝµÄǿһÖÂÐÔºÍÕû¸ö¼¯ÈºµÄ¸ß¿ÉÓÃÐÔ¡£
ÔÉúMySQLµÄÈÝÔÖȱÏÝ
¡¾MySQLÈÝÔÖ·½°¸¡¿
MySQLÓÐÁ½ÖÖ³£¼ûµÄ¸´ÖÆ·½°¸£¬Òì²½¸´ÖƺͰëͬ²½¸´ÖÆ¡£
Òì²½¸´ÖÆ·½°¸
Master¶ÔÊý¾Ý½øÐÐcommit²Ù×÷ºóÔÙ½«Êý¾ÝÒì²½¸´ÖƵ½Slave¡£
µ«Êý¾ÝÎÞ·¨±£Ö¤³É¹¦¸´ÖÆ£¬Ò²¾ÍÎÞ·¨±£Ö¤MySQLÖ÷±¸¼äµÄÊý¾ÝÒ»ÖÂÐÔ£¬Èçͼ1Ëùʾ¡£

ͼ1 MySQLÒì²½¸´ÖÆÁ÷³Ì
°ëͬ²½¸´ÖÆ·½°¸
Master¶ÔÊý¾Ý½øÐÐcommit²Ù×÷ǰ½«Êý¾Ý¸´ÖƵ½Slave£¬È·Èϸ´ÖƳɹ¦ºóÔÙ¶ÔÊý¾Ý½øÐÐcommit²Ù×÷¡£
¾ø´ó¶àÊýÇé¿öÏ£¬°ëͬ²½¸´ÖÆÄܱ£Ö¤MySQLÖ÷±¸¼äµÄÊý¾ÝÒ»ÖÂÐÔ£¬Èçͼ2Ëùʾ¡£

ͼ2 MySQL°ëͬ²½¸´ÖÆÁ÷³Ì
¡¾MySQLÖØÆôÁ÷³Ì¡¿
°ëͬ²½·½°¸Öеġ°°ë¡±ÊÇÖ¸MasterÔڵȴýSlaveµÄACKʧ°Üʱ½«ÍË»¯³ÉÒì²½¸´ÖÆ¡£Í¬Ê±£¬MySQLÔÚÖØÆôʱҲ²»»áÖ´Ðаëͬ²½¸´ÖÆ¡£
Èçͼ3ÖеÄid(Gtid)=101Êý¾ÝÊÇMaster»úÆ÷ÖÐÐÂдÈëµ½Binlog FileµÄBinlogÊý¾Ý¡£µ«MasterÔÚ¸´ÖÆÊý¾Ýµ½SlaveµÄ¹ý³ÌÖÐMySQLå´»úµ¼Ö¸´ÖÆÊ§°Ü¡£MySQLÖØÆôʱ£¬Êý¾Ý£¨id=101£©»á±»Ö±½Ó½øÐÐcommit²Ù×÷£¬ËæºóÔÙ½«Êý¾ÝÒì²½¸´ÖƵ½Slave¡££¨ÏÂÎĽ«ÒѾдÈëµ½Binlog
Fileµ«Î´½øÐÐcommit²Ù×÷µÄÊý¾Ý£¨id=101£©³ÆÎªPending Binlog¡££©

ͼ3 MySQLÖØÆôʱֱ½ÓÌá½»Pending Binlog
¸ÃÇé¿öÏÂMySQLÈÝÒ׳öÏÖMaster-SlaveÖ®¼äÊý¾Ý²»Ò»ÖµÄÇé¿ö£¬¹Ù·½Ò²ÃèÊöÁ˸ÃÎÊÌâ¡£
http://bugs.mysql.com/bug.php?id=80395
https://mariadb.atlassian.net/browse/MDEV-162
¡¾MySQLÖØÆôȱÏÝ¡¿
ÏÂÃæ½«½âÊÍMySQLÔÚÖØÆôʱ²»Ö´Ðаëͬ²½»á²úÉúÊý¾Ý²»Ò»ÖµÄÔÒò¡£
µ±¶ÔÉÏÊöÀý×ÓÖеÄPending Binlog£¨id=101£©½øÐи´ÖÆÊ±Masterå´»úµ¼Ö¸´ÖÆÊ§°Ü£¬ËæºóSlave1Çл»³ÉÐÂMaster²¢¿ªÊ¼Ìṩ·þÎñ£¨Ð´Èëid=201µÄÊý¾Ý£©¡£´Ëºó£¬µ±¾ÉMasterÖØÆôʱ£¬Pending
Binlog£¨id=101£©²»»á±»ÖØÐ½øÐи´ÖƶøÖ±½Ó½øÐÐcommit²Ù×÷£¬´Ó¶øµ¼Ö¾ÉMaster±ÈÐÂMaster¶àÁËÒ»ÌõÊý¾Ý£¬¾ÉMasterÎÞ·¨³ÉΪÐÂMasterµÄSlave£¬ÐèÒªÈ˹¤´¦ÀíµôÕâÌõÊý¾ÝÖ®ºó£¬²ÅÄÜÈþÉMaster×÷ΪSlaveÌṩ·þÎñ£¬Èçͼ4Ëùʾ¡£

ͼ4 MySQLÖØÆôȱÏݵ¼ÖÂÖ÷±¸Êý¾Ý²»Ò»ÖÂ
ÉÏÊöcaseÖ»¶Ô¾ÉMasterµÄÊý¾ÝÔì³ÉÓ°Ï죬²»»áʹµÃMySQL Client¶ÁÈ¡µ½´íÎóÊý¾Ý¡£µ«µ±MasterÁ¬Ðø³öÏÖÁ½´Îå´»úºó²úÉúMasterÇл»£¬Á½´Îå´»ú¼ä¸ô½Ï¶ÌʹµÃPending
BinlogδÄܼ°Ê±¸´ÖƵ½Slave£¬ÇÒÆÚ¼äÓвéѯÇëÇóʱ£¨Masterå´»ú¡úMasterÖØÆô¡ú²éѯÊý¾Ý¡úMasterå´»ú¡úMasterÇл»£©£¬MySQL
Client»á²úÉúÈçͼ5ËùʾµÄ»Ã¶Á£¨Á½´Î¶Áµ½µÄ½á¹û²»Ò»Ö£©¡£

ͼ5 MySQLÖØÆôȱÏݵ¼ÖÂClient²úÉú»Ã¶Á
¡¾MySQL Client·ÖÁÑ¡¿
µ±Master³öÏÖ¹ÊÕÏÇÒ²úÉúMasterÇл»Ê±£¬ÓÉÓÚÔÉúMySQLȱ·¦µ÷Óö˵Ä֪ͨ/ÖØ¶¨Ïò»úÖÆ£¬Ê¹µÃ²»Í¬µÄClient¿ÉÄÜ·ÃÎʲ»Í¬µÄMaster£¬µ¼ÖÂÊý¾ÝµÄ´íÎóдÈëºÍ¶ÁÈ¡£¬Èçͼ6Ëùʾ¡£

ͼ6 MySQL½øÐÐMasterµ¼ÖÂClient¶Ë·ÖÁÑ
¡¾MySQLȱ·¦×Ô¶¯Ñ¡Ö÷»úÖÆ¡¿
ÓÉÓÚ°ëͬ²½¸´ÖƲ»ÐèÒªµÈ´ýËùÓÐSlaveµÄACK£¬Òò´Ëµ±Master³öÏÖ¹ÊÕÏʱ£¬ÐèҪѡÓÐ×îÐÂBinlogµÄSlaveΪеÄMaster£»¶øMySQL²¢Ã»ÓÐÄÚÖÃÕâ¸öÑ¡Ö÷»úÖÆ£¬Èçͼ7Ëùʾ¡£

ͼ7 MySQLȱÉÙ×Ô¶¯Ñ¡Ö÷»úÖÆ
¡¾MySQLµÄÈÝÔÖȱÏÝ×ܽ᡿
MySQLÔÚÈÝÔÖ·½Ãæ´æÔÚµÄÎÊÌ⣺
MasterÇл»Ê±Ö÷±¸Êý¾Ý²»Äܱ£Ö¤Ò»Ö£ºMasterÖØÆô²¢Çл»¿ÉÄܵ¼ÖÂMySQLÖ÷±¸¼äÊý¾Ý²»Ò»Ö¡£MasterÖØÆô²¢Çл»¿ÉÄܵ¼ÖÂMySQL
Client²úÉú»Ã¶Á¡£
ÔÉúMySQLȱ·¦¸ß¿ÉÓûúÖÆ£ºMasterÇл»µ¼Öµ÷Óö˷ÖÁÑ¡£È±·¦×Ô¶¯Ñ¡Ö÷»úÖÆ¡£
¶ÔÓÚÔÉúMySQL£¬Ôڸ߿ÉÓúÍǿһÖÂÁ½¸öÌØÐÔÖУ¬Ö»Äܶþѡһ£º
ÒªÇóMySQLÖ÷±¸¼äµÄÊý¾ÝǿһÖ£¬²»×öÖ÷±¸×Ô¶¯Çл»¡£
½èÖúMHAʵÏָ߿ÉÓã¬ÈÝÈÌMySQLÖ÷±¸¼äµÄÊý¾Ý²»Ò»Ö¡£
Òò´ËMySQLÔÚÈÝÔÖÉÏÎÞ·¨Í¬Ê±Âú×ãÊý¾ÝǿһÖºͷþÎñ¸ß¿ÉÓÃÁ½¸öÌØÐÔ¡£
PhxSQLÉè¼ÆË¼Â·
¡¾¿É¿¿ÈÕÖ¾´æ´¢¡¿
ʵÏÖÒ»¸öÒÔ¿É¿¿ÈÕÖ¾´æ´¢ÎªÖÐÐĵļܹ¹À´½â¾öMySQLÊý¾Ý¸´ÖÆÊ±²úÉúµÄÊý¾Ý²»Ò»ÖÂÎÊÌâ¡£
Master½«Binlog·¢Ë͵½BinlogSvr¼¯Èº£¨¿É¿¿ÈÕÖ¾´æ´¢£©£¬Slave´ÓBinlogSvr¼¯Èº»ñÈ¡BinlogÊý¾ÝÍê³ÉÊý¾Ý¸´ÖÆ¡£
MasterÔÚÖØÆôʱ£¬¸ù¾ÝBinlogSvr¼¯ÈºµÄÊý¾ÝÅжÏPending BinlogÊÇ·ñÒѾ±»¸´ÖÆ¡£Èç¹ûδ±»¸´ÖÆÔò´ÓBinlog
FileÖÐɾ³ý¡£
ÀûÓÃBinlogSvr¼¯Èº£¨¿É¿¿ÈÕÖ¾´æ´¢£©£¬Ê¹µÃMaster£¨ÖØÆôʱ¼ì²é±¾µØBinlogÊÇ·ñºÍBinlogSvr¼¯ÈºµÄÊý¾ÝÒ»Ö£©ºÍSlave£¨´ÓBinlogSvr¼¯ÈºÖлñÈ¡Binlog£©µÄÊý¾Ý±£³ÖÒ»Ö£¬´Ó¶ø±£Ö¤ÁËÕû¸ö¼¯ÈºÖеÄMySQLÖ÷±¸¼äÊý¾ÝµÄÒ»ÖÂÐÔ£¬Èçͼ8Ëùʾ¡£

ͼ8 ʵÏÖÒ»¸ö¿É¿¿ÈÕÖ¾´æ´¢±£Ö¤¸÷MySQLµÄÊý¾ÝÒ»ÖÂ
¡¾ÇëÇó͸´«¡¿
ÔÚMaster½øÐÐÇл»Ê±£¬Çл»²Ù×÷¿ÉÄܻᵼÖ²¿·ÖMySQL ClientÈÔÈ»·ÃÎʾÉMaster²¢¶Áµ½¾ÉÊý¾Ý¡£
×îÖ±¹ÛµÄ·½·¨ÊÇÐÞ¸ÄMySQL Client API£¬ÔÚÿһ´Î½øÐвéѯʱ£¬ÏÈÈ·Èϵ±Ç°MasterµÄλÖᣵ«´Ë·½·¨ÓÐÒÔÏÂȱµã£º
ÐèҪά»¤Ò»¸öMySQL Client APIµÄ˽Óа汾£¬Î¬»¤³É±¾¸ß¡£
ËùÓеĵ÷ÓöËÐèÒª¼¯³ÉÕâ¸ö˽ÓеÄMySQL Client API£¬²Ù×÷³É±¾ºÜ¸ß¡£
ΪÁ˱ÜÃâÐÞ¸ÄMySQL Client API£¬¿Éͨ¹ýÔö¼ÓProxy½øÐÐÇëÇó͸´«À´½â¾öÉÏÊöÎÊÌâ¡£ÔÚÿһ¸öMySQL½áµãÉÏÔö¼ÓÒ»¸öProxy£¬MySQL
ClientµÄÇëÇó²»ÔÙÖ±½Ó·ÃÎÊMySQL¶øÖ±½Ó·ÃÎÊProxy¡£Proxy¸ù¾ÝMasterµÄλÖ㬽«·ÃÎÊSlave»úÆ÷µÄÇëÇó͸´«µ½Master»úÆ÷£¬ÔÙ½øÐÐMySQL²Ù×÷¡£
ͨ¹ýÔö¼ÓProxy½øÐÐÇëÇó͸´«£¬½â¾öÁËMySQL Client·ÖÁѵ¼ÖÂÓпÉÄܶÁÈ¡µ½¾ÉÊý¾ÝµÄÎÊÌ⣬Èçͼ9Ëùʾ¡£

ͼ9 ʵÏÖÒ»¸ö¿É¿¿ÈÕÖ¾´æ´¢±£Ö¤¸÷MySQLµÄÊý¾ÝÒ»ÖÂ
¡¾×Ô¶¯Ñ¡Ö÷¡¿
¶à»ú×Ô¶¯Ñ¡Ö÷×î³£¼ûµÄʵÏÖ·½Ê½ÊÇÓɸ÷¸ö²ÎÓëÕß·¢ÆðͶƱ£¬»ñµÃ¶àÊýÅÉÖ§³ÖµÄ»úÆ÷ΪMaster£¬Í¬Ê±°ÑMasterÐÅÏ¢¼Ç¼µ½¿É¿¿´æ´¢¡£Master»úÆ÷¶¨ÆÚµ½¿É¿¿´æ´¢ÑÓ³¤×âÔ¼£»·ÇMaster»úÆ÷¶¨ÆÚ¼ì²éMaster×âÔ¼ÊÇ·ñ¹ýÆÚ£¬´Ó¶ø¾ö¶¨ÊÇ·ñÒª·¢ÆðÑ¡¾Ù×Ô¼ºÎªMasterµÄͶƱ¡£
ΪÁ˱ÜÃâÐÞ¸ÄMySQL´úÂ룬ÔÚMySQL»úÆ÷ÉÏÔö¼ÓÒ»¸öAgent£¬ÓÉAgentÀ´Ìæ´úMySQL·¢ÆðÑ¡Ö÷ͶƱºÍÐøÆÚ×âÔ¼£»¿É¿¿´æ´¢¼ÌÐøÓÉBinlogSvr³Ðµ£¡£
AgentÍê³ÉÒÔϹ¦ÄÜ£º
Master»úÆ÷µÄAgent¼à¿Ø±¾»úMySQLÊÇ·ñÕý³£·þÎñ£»Èç¹ûÕý³£·þÎñ£¬Ôò¶¨ÆÚµ½¿É¿¿´æ´¢ÑÓ³¤×âÔ¼£¬·ñÔòÍ£Ö¹ÐøÔ¼¡£
·ÇMaster»úÆ÷µÄAgent¶¨ÆÚ´Ó¿É¿¿´æ´¢¼ì²éMaster×âÔ¼ÊÇ·ñ¹ýÆÚ£»Èç¹û¹ýÆÚ£¬ÔÙ¼ì²é±¾»úMySQLÊÇ·ñÒѾִÐÐÁËËùÓÐBinlog¡£Èç¹ûÒѾִÐÐÁËËùÓÐBinlog£¬Ôò·¢ÆðÑ¡¾Ù×Ô¼ºÎªMasterµÄͶƱ£¬Èçͼ10Ëùʾ¡£

ͼ10 ¿É¿¿ÈÕÖ¾´æ´¢ºÍAgent¹²Í¬ÊµÏÖ×Ô¶¯Ñ¡Ö÷»úÖÆ
PhxSQL¼Ü¹¹ºÍʵÏÖ
´ÓÉÏÊö˼·¿ÉÒԵóöPhxSQLµÄ¼òµ¥Èý²ã¼Ü¹¹¡£¶ÔÓÚÿһ¸ö½Úµã£¬²¿Êð3¸öÄ£¿é£¨PhxSQLProxy£¬MySQL£¬PhxBinlogSvr£©¡£¶à¸ö½ÚµãÉϵÄPhxBinlogSvr×é³ÉÒ»¸ö¿É¿¿µÄÈÕÖ¾´æ´¢¼¯ÈººÍ¿É¿¿µÄMasterÐÅÏ¢´æ´¢¼¯Èº£»PhxBinlogSvrͬʱ³Ðµ£AgentµÄÔðÈΡ£PhxSQLProxy¸ºÔðÇëÇóµÄ͸´«¡£Master½áµãÉϵÄPhxSync¸ºÔð½«MySQLµÄBinlog·¢Ë͵½PhxBinlogSvr£¬Èçͼ11Ëùʾ¡£

ͼ11 PhxSQL»ù±¾¼Ü¹¹
¡¾Proxy(PhxSQLProxy)¡¿
ÇëÇó͸´«
ÇëÇó͸´«ÊÇProxyÖ÷ÒªµÄ¹¦ÄÜ¡£Ö÷Òª½â¾öÔÚ½øÐÐMasterÇл»µÄʱºò£¬MySQL Client»á±»·ÖÁÑ£¬²»Í¬µÄClient¿ÉÄÜÁ¬½Óµ½²»Í¬µÄMySQL¡£µ¼Ö³öÏÖMySQL
ClientдÈëÊý¾Ýµ½´íÎóµÄMaster»òÕß´Ó´íÎóµÄMaster¶ÁÈ¡µ½´íÎóµÄÊý¾Ý¡£
ProxyµÄÇëÇó͸´«·ÖÁ½ÖÖ£º
¶Áд¶Ë¿ÚÇëÇó͸´«£ºSlave½ÚµãÊÕµ½µÄÇëÇó͸´«¸øMaster½ÚµãÖ´ÐС£Master½ÚµãÊÕµ½µÄÇëÇóÖ±½Ó͸´«¸ø±¾»úMySQLÖ´ÐС£
Ö»¶Á¶Ë¿ÚÇëÇó͸´«£ºMaster½ÚµãÊÕµ½µÄÇëÇó͸´«¸øSlave½ÚµãÖ´ÐС£Slave½ÚµãÊÕµ½µÄÇëÇóÖ±½Ó͸´«¸ø±¾»úMySQLÖ´ÐУ¬Èçͼ12Ëùʾ¡£

ͼ12 ProxyÇëÇó͸´«Á÷³Ì
¸ßÐÔÄÜ£ºÓÉÓÚProxy½Ó¹ÜÁËMySQL ClientµÄÇëÇó£¬ÎªÁËʹÕû¸ö¼¯ÈºµÄ¶ÁдÐÔÄܽӽüµ¥»úMySQL£¬ProxyʹÓÃгÌÄ£ÐÍÌá¸ß×ÔÉíµÄ´¦ÀíÄÜÁ¦¡£
ProxyµÄгÌÄ£ÐÍʹÓÿªÔ´µÄLibco¿â¡£Libco¿âÊÇ΢ÐÅÍŶӿªÔ´µÄÒ»¸ö¸ßÐÔÄÜг̿⣬¾ßÓÐÒÔÏÂÌØµã£º
ÓÃͬ²½·½Ê½Ð´´úÂ룬ʵÏÖÒì²½´úÂëµÄÐÔÄÜ¡£
Ö§³ÖǧÍò¼¶µÄ²¢·¢Á¬½Ó¡£
ÏîÄ¿µØÖ·https://github.com/tencent-wechat/libco
ÍêÈ«¼æÈÝMySQL£ºÎªÁËÒÑÓеÄÓ¦ÓóÌÐòÄܹ»²»×öÈκÎÐ޸ľÍÄÜÇ¨ÒÆµ½PhxSQL£¬ProxyÐè¼æÈÝMySQLµÄËùÓй¦ÄÜ¡£
¼æÈÝMySQLÊÂÎñ
MySQLÊÂÎñ¹ÜÀí»ùÓÚÁ¬½Ó£¬Í¬Ò»¸öÊÂÎñµÄËùÓÐÇëÇóͨ¹ýͬһ¸öÁ¬½ÓͨÐÅ¡£ÔÚÊÂÎñ´¦ÀíÖÐÁ¬½Ó¶ªÊ§£¬ÊÂÎñ½«±»rollback£¨http://dev.mysql.com/doc/refman/5.6/en/innodb-autocommit-commit-rollback.html£©¡£
ProxyʹÓÃ1:1Á¬½ÓÄ£ÐÍÍêÈ«¼æÈÝMySQLÊÂÎñ¡£Ã¿µ±MySQL Client·¢ÆðÒ»¸öÁ¬½Óµ½Proxy£¬Proxy¶¼»áÏàÓ¦µØ·¢ÆðÒ»¸öÁ¬½Óµ½MySQL¡£Á½ÌõÁ¬½ÓÖУ¬ÈÎÒâÒ»¸öÖжϣ¬ÁíÍâÒ»¸öÒ²ÏàÓ¦¶Ï¿ª£¬¶ÔÓ¦µÄÊÂÎñ»á±»rollback£¬Èçͼ13Ëùʾ¡£

ͼ13 ProxyµÄ1¶Ô1ÊÂÎñÁ¬½ÓÄ£ÐÍ
¼æÈÝMySQLȨÏÞ
MySQLµÄȨÏÞ¹ÜÀí»ùÓÚ£¨Óû§£¬Ô´IP£©¶Ô£¬Ô´IPÊÇͨ¹ýsocket¾ä±ú·´²é»ñÈ¡¡£µ±ÇëÇóͨ¹ýProxyÁ¬½Óµ½MySQLʱ£¬Ô´IPΪProxy±¾µØIP£¬È¨ÏÞ¹ÜÀí»á³öÏÖÒì³£¡£
ProxyÀûÓÃMySQLÐÒéHEAD±£Áô×Ö¶Î͸´«ÕæÊµÔ´IPµ½MySQ£¬MySQLÔÙ´ÓHEAD±£Áô×ֶλñÈ¡ÕýÈ·µÄÔ´IP½øÐÐȨÏÞ¹ÜÀí£¬Èçͼ14Ëùʾ¡£

ͼ14 Proxyͨ¹ýÐÞ¸ÄMySQLÐÒ鼿ÈÝMySQLȨÏÞ
PhxSync
PhxSyncµÄ¹¦ÄܺÍMySQLµÄsemisync²å¼þÀàËÆ¡£¾¹ýµ÷ÑУ¬¶Ôsemisync²å¼þµÄ½Ó¿Ú×öÉÙÁ¿µÄµ÷Õû£¬¾Í¿ÉÒÔʹÓÃÕâЩ²å¼þ½Ó¿ÚÀ´ÊµÏÖPhxSync¡£
PhxSync¹¦ÄÜÖ÷ÒªÊÇ£º
Õý³£ÔËÐÐʱÌá½»Binlog£ºMySQLÔÚÕý³£Ð´Èë»òÕ߸üÐÂÊý¾Ýʱ£¬»áµ÷ÓÃafter_flush½Ó¿Ú¡£PhxSync²å¼þͨ¹ýʵÏÖafter_flush½Ó¿Ú½«MySQLÐÂдÈëµÄBinlogÌá½»µ½±¾»úµÄBinlogSvr£¬Óɱ¾»úBinlogSvrͨ¹ýPaxosÐÒéͬ²½µ½BinlogSvr¼¯Èº¡£
ÖØÆôʱУ׼±¾µØBinlog£ºMySQLÔÚÖØÆôʱͨ¹ý²éѯBinlogSvr¼¯ÈºÅжϱ¾µØPending BinlogµÄ״̬¡£Èç¹ûPending
Binlogδ¸´ÖƵ½BinlogSvr¼¯ÈºÔò´Ó±¾µØÉ¾³ý£¬±£³Ö±¾µØµÄBinlogÊý¾ÝºÍBinlogSvr¼¯ÈºµÄBinlogÊý¾ÝÒ»Ö¡£
ÓÉÓÚMySQLûÓÐÌṩÔÚÖØÆôʱµÄ²å¼þ½Ó¿Ú£¬ÎªÁ˺óÐøÎ¬»¤·½±ã£¬ÔÚMySQL´úÂë²ã³éÏó³öÁËÒ»¸öвå¼þ½Ó¿Úbefore_binlog_initÓÃÓÚУ׼Binlog¡£
ÉÏÊö¶Ôafter_flush½Ó¿ÚµÄµ÷Õû£¬ºÍÐÂÔöµÄbefore_binlog_init½Ó¿ÚÒѾÌá½»²¹¶¡¸øMySQL¹Ù·½£¨http://bugs.mysql.com/bug.php?id=83158£©¡£
¡¾PhxBinlogSvr¡¿
PhxBinlogSvrÖ÷Òª¸ºÔð´æ´¢BinlogºÍMasterÐÅÏ¢µÄά»¤¡£ÔÚÊý¾Ý¸´Öƽ׶Σ¬Í¨¹ýPaxosÐÒé±£Ö¤PhxBinlogSvr¸÷½ÚµãµÄÊý¾ÝÒ»ÖÂÐÔ£¨ÏÂÎijÆPhxBinlogSvrΪBinlogSvr£©¡£
PhxPaxos¿â£ºBinlogSvrʹÓÃPhxPaxos¿â½øÐÐÊý¾ÝµÄ¸´ÖÆ¡£PhxPaxos¿âÊÇ΢ÐÅÍŶӿªÔ´µÄPaxosÀà¿â£¬¾ßÓÐÒÔÏÂÌØÐÔ£º1.
±£Ö¤¸÷½ÚµãµÄÊý¾ÝÒ»Ö¡£
±£Ö¤¼¯Èº»úÆ÷³¬¹ýÒ»°ë´æ»î»¹ÄÜ·þÎñ¡£
¸ßÐÔÄÜ¡£
¹¦ÄÜÍêÉÆ¡£
Îȶ¨ÐÔ¾¹ý´ó¹æÄ£ÑéÖ¤¡£
½Ó¿Ú·½±ãÒ×Óá£
ÏîÄ¿µØÖ·https://github.com/tencent-wechat/phxpaxos
BinlogSvrÒì³£Çé¿ö´¦Àí
·ÀÖ¹SlaveµÄ½ÚµãÌá½»Êý¾Ý
µ±¾ÉMasterÔÚÌá½»Êý¾ÝʱÓÉÓÚÍøÂçÎÊÌâÊý¾Ý°ü±»¿¨ÔÚÍøÂ磬ÇÒÐÂMaterÒѾ³É¹¦Çл»Ê±£¬»òÕßÈËΪ´íÎóÖ±½ÓÍùSlave½ÚµãµÄMySQLдÈëÊý¾Ýʱ£¬Ôò»á³öÏÖSlave½ÚµãÌá½»Êý¾ÝµÄÇé¿ö¡£¶à½ÚµãͬʱÌá½»Êý¾Ý»á³öÏÖBinlogSvrµÄBinlogÊý¾ÝºÍMySQL´æ´¢µÄBinlogÊý¾Ý²»Ò»ÖµÄÇé¿ö¡£
BinlogSvr´æ´¢Á˼¯ÈºÄÚµÄMasterÐÅÏ¢¡£µ±ÆäÊÕµ½MySQLÌá½»µÄÊý¾Ýʱ£¬¿É¸ù¾ÝMasterÐÅÏ¢¾Ü¾ø·ÇMaster½ÚµãµÄÌá½»£¬Èçͼ15Ëùʾ¡£

ͼ15 BinlogSvrͨ¹ýMasterÐÅÏ¢¾Ü¾ø·ÇMaster½ÚµãµÄÌá½»
·ÀÖ¹MasterÌá½»´íÎóÊý¾Ý
ÔÚijЩÇé¿öÏ£¬Master¿ÉÄÜ»áÖØÐ·¢ËÍÊý¾Ý»òÕß·¢ËÍ´íÎóÊý¾Ý¡£Æ©ÈçÔÚÍøÂç²»ºÃµÄÇé¿öÏÂMasterÓÉÓÚÌá½»Êý¾Ý³¬Ê±¶øÖØ·¢Êý¾Ý¡£´ÅÅÌ·¢Éú¹ÊÕÏ»òÕßÊý¾Ý±»´íÎ󻨹ö»òÕßÐ޸ĵÄʱºò£¬Master»áÌá½»´íÎóµÄÊý¾Ý¡£
BinlogSvrʹÓÃÀÖ¹ÛËø»úÖÆÀ´·ÀÖ¹MasterµÄÒì³£Ìá½»¡£ÔÚMySQLÌá½»Êý¾Ý¸øBinlogSvrʱ£¬ÒÔ±¾»úMySQLÒѾִÐеÄGTIDΪÀÖ¹ÛËø£¬Ìá½»µÄÄÚÈÝΪ£¨±¾»úMySQLÒѾִÐеÄ×îÐÂGTID£¬±¾´ÎÒªÌá½»µÄBinlog£©¡£BinlogSvrͨ¹ý¼ì²éÇëÇóÖУ¨±¾»úMySQLÒѾִÐеÄ×îÐÂGTID£©ºÍ×ÔÉí±£´æµÄ×îÐÂGTIDÊÇ·ñÆ¥ÅäÀ´¾Ü¾øÖØÐ·¢ËÍ»òÕßÒì³£·¢Ë͵ÄÊý¾Ý£¬Èçͼ16Ëùʾ¡£

ͼ16 BinlogSvrʹÓÃÀÖ¹ÛËø¾Ü¾øMasterÔÚÊý¾ÝÒì³£µÄÇé¿öÏÂÌá½»Êý¾Ý
Ö§³ÖMySQLÔÉú¸´ÖÆÐÒ飺ΪÁËÈÃSlaveÄÜ´ÓBinlogSvr»ñÈ¡Binlog£¬×îºÃµÄ·½Ê½¾ÍÊÇBinlogSvrÖ§³ÖMySQLÔÉúµÄ¸´ÖÆÐÒ飬ÕâÑù²»ÓöÔSlave×öÈκÎÐ޸ģ¬Èçͼ17Ëùʾ¡£

ͼ17 BinlogSvrÖ§³ÖMySQLʹÓÃÔÉú¸´ÖÆÐÒé»ñÈ¡BinlogÊý¾Ý
Master¹ÜÀí£ºBinlogSvr³ýÁË´æ´¢MySQLµÄBinlogÊý¾Ý£¬»¹´æ´¢ÁËMasterÐÅÏ¢¡£Í¬Ê±»¹³Ðµ£ÁËAgentµÄ½ÇÉ«£¬¸ºÔð¼à¿ØMySQLµÄ״̬£¬±ØÒªÊ±·¢ÆðÑ¡¾Ù×Ô¼ºÎªMasterµÄͶƱ¡£
BinlogSvrͨ¹ýPaxosÐÒé½øÐÐMasterÑ¡¾Ù£¬Ñ¡¾Ù³É¹¦ºó³ÉΪMaster²¢ÓµÓÐ×âÔ¼¡£Í¨¹ýPaxosÐÒéÑ¡¾Ù±£Ö¤ÁË×îÖÕÖ»²úÉúÒ»¸öMasterÇÒÿ¸ö½Úµã¼Ç¼ÁËÒ»ÖµÄMasterÐÅÏ¢¡£
PhxSQLЧ¹û
¡¾PhxSQLÊý¾ÝÒ»ÖÂÐÔ¡¿
ͨ¹ý±È½ÏPhxSQL¼¯ÈºÖи÷½ÚµãµÄÊý¾Ý£¨MySQL Binlog£¬PhxPaxos£¬BinlogSvr)
Åжϸ÷½ÚµãÊý¾ÝÊÇ·ñÒ»Ö£¬Èçͼ18Ëùʾ¡£

ͼ18 PhxSQL 3»úÊý¾Ý¶Ô±È
¡¾Master×Ô¶¯Çл»¡¿
ͨ¹ý¹Û²ìMasterå´»úʱ¸÷½ÚµãµÄÁ÷Á¿±ä»¯ÅжÏMasterÊÇ·ñ˳ÀûÇл»¡£ÏÂͼÖеĺìÏß´ú±íÁ÷Á¿¡£µ±Masterå´»úʱ£¬Á÷Á¿»áËæÖ®×ªÒÆ£¬´ú±íMaster˳ÀûÇл»£¬Èçͼ19Ëùʾ¡£

ͼ19 PhxSQL½øÐÐMasterÇл»Ê±¸÷½ÚµãµÄдÈëÁ÷Á¿±ä»¯
¡¾PhxSQLÐÔÄÜ¡¿
MySQL°æ±¾£ºPercona 5.6.31-77.0
»úÆ÷ÐÅÏ¢£º
CPU £ºIntel Xeon CPU E5-2420 0 @ 1.90GHz * 24¡£
Memory : 32G¡£
Disk:SSD Raid10¡£
Ping Costs£ºMaster¡úSlave:3 ~ 4ms; client¡úMaster :4ms¡£
¹¤¾ßºÍ²ÎÊý£º
sysbench¡£
¨Coltp-tables-count=10 ¨Coltp-table-size=1000000 ¨Cnum-threads=500¡£
¨Cmax-requests=100000 ¨Creport-interval=1 ¨Cmax-time=200¡£
PhxSQLµÄдÐÔÄܱÈMySQLµÄ°ëͬ²½ºÃ£¬¶ÁÐÔÄÜÓÉÓÚ¶àÁËÒ»²ãProxyµ¼Ö±ÈMySQLµÄ°ëͬ²½ÉԲ

ͼ20 PhxSQLºÍMySQLµÄÐÔÄÜ¶Ô±È |