为ä¿è¯æ•°æ®åœ¨å„æ•°æ®åº“副本上的一致性,Replication需è¦é¢‘ç¹åŒæ¥æ•°æ®ï¼Œä¸‹æ–‡è°ˆè°ˆä¸‰ç§åŒæ¥æ–¹å¼ï¼Œä»¥MySQL上的master-slave模型为例。
åŒæ¥æ–¹å¼ï¼ˆSynchronous)
如果master接收更新请求åŽï¼Œåœ¨è‡ªèº«æ‰§è¡Œçš„åŒæ—¶å°†ä¿¡æ¯ä¼ æ’给所有slave,并è¦ç‰æ”¶åˆ°æ‰€æœ‰slave获得更新信æ¯çš„åé¦ˆä¹‹åŽæ‰è¿”回,那æ¤åŒæ¥è¿‡ç¨‹ä¼šå¤§å¤§æ‹–累性能。这个é“ç†å¾ˆå®¹æ˜“ç†è§£ï¼Œè€ŒMySQL Clusterå·ç§°æ‹¥æœ‰Synchronous Replicationçš„ç‰¹æ€§ï¼Œæˆ‘ç¡®å®žè¿˜æ²¡æžæ¸…å®ƒæ€Žæ ·èƒ½åšåˆ°ã€‚
å¼‚æ¥æ–¹å¼ï¼ˆAsynchronous)
典型MySQL上的Replication是异æ¥çš„,master处ç†å®Œæ›´æ–°è¯·æ±‚åŽè¿”回,ä¸ç‰å¾…slave获å–到更新信æ¯ã€‚借用51CTO.comçš„è¿™å¼ å›¾æ¥ä»‹ç»ä¸‹å¼‚æ¥Replication的过程å§ã€‚
- master上有更新到æ¥ï¼Œå…ˆå°†æ›´æ–°å˜å…¥binary-logä¸ï¼›
- master上的sql进程执行Databaseæ›´æ–°ï¼ŒåŒæ—¶masterå°†æœ‰æ–°æ›´æ–°çš„æ¶ˆæ¯æ•£æ’出去,让å„slaveéšæ—¶æ¥è¯·æ±‚,这个散æ’互动的过程通常是基于publish-subscription的;
- æŸslaveå‘master呿¥IO请求,指定è¦binary-log上æŸåç§»é‡ä¹‹åŽçš„è·Ÿæ›´æ–°ä¿¡æ¯ï¼›
- master接å—IO请求,并返回所请求的更新信æ¯ï¼Œä»¥åŠbinray-log上当å‰çš„åç§»é‡ï¼›
- slave收到IOå馈,将收到的更新信æ¯è¿½åŠ åˆ°relay-log末尾,并将binray-logåç§»é‡è®°å½•到master-info文件ä¸ï¼Œç„¶åŽå‘master返回Acknowledge消æ¯ï¼›
- slaveçš„sql进程监测到relay-log䏿œ‰æ–°å†…容åŽï¼Œä¼šç«‹å³åœ¨database上执行更新。
æ ¹æ®binary-log的信æ¯å˜å‚¨å½¢å¼ï¼ŒReplicationåˆå¯åŒºåˆ†ä¸ºå¦‚下三ç§çº§åˆ«ï¼Œç›¸åº”都在MySQL上有é…置。
- Row level – Binary Log ä¸ä¼šè®°å½•æˆæ¯ä¸€è¡Œæ•°æ®è¢«ä¿®æ”¹çš„å½¢å¼ï¼Œç„¶åŽåœ¨ Slave 端å†å¯¹ç›¸åŒçš„æ•°æ®è¿›è¡Œä¿®æ”¹ï¼Œä¸ç”¨åœ¨ä¹Žæ‰§è¡Œçš„sqlè¯å¥çš„上下文相关的信æ¯ã€‚æ˜¾ç„¶æ¤æ–¹æ³•log䏿•°æ®é‡å·¨å¤§ã€‚
- Statement level – æ¯ä¸€æ¡ä¼šä¿®æ”¹æ•°æ®çš„ Query 都会记录到 Masterçš„ Binary Log ä¸ã€‚logä¸ä¸å˜åœ¨å¤§é‡æ•°æ®äº†ï¼Œä½†å®ƒä¸å¾—ä¸è®°å½•æ¯æ¡è¯å¥åœ¨æ‰§è¡Œçš„æ—¶å€™çš„一些相关信æ¯ï¼Œä¹Ÿå°±æ˜¯ä¸Šä¸‹æ–‡ä¿¡æ¯ï¼Œä»¥ä¿è¯æ‰€æœ‰è¯å¥åœ¨slaveç«¯æ¯æ‰§è¡Œçš„æ—¶å€™èƒ½å¤Ÿå¾—到和在master端执行时候相åŒçš„结果。这ç§ç»“æžœå¸¸å› ä¸ºqueryè¯å¥æ— 法完美Replicate而出现数æ®ä¸ä¸€è‡´ã€‚
- Mixed level –ã€€å®ƒæ˜¯ä¸Šä¸¤ç§æ–¹æ³•的折ä¸ï¼Œä¼šæ ¹æ®æ‰§è¡Œçš„æ¯ä¸€æ¡å…·ä½“çš„ Query è¯å¥æ¥åŒºåˆ†å¯¹å¾…记录的日志形å¼ï¼Œä¹Ÿå°±æ˜¯åœ¨Statementå’ŒRow之间选择一ç§ã€‚
åŠåŒæ¥æ–¹å¼ï¼ˆSemi-synchronous)
åˆæ˜¯ä¸€ä¸ªå…¸åž‹çš„æŠ˜ä¸ã€‚å› ä¸ºä¸Šé¢æåˆ°çš„å¼‚æ¥æ–¹å¼ä¸‹ï¼Œmasterä¸ç®¡slaveæ•°æ®æ›´æ–°çš„进度,若slave出现明显的è½åŽï¼ˆLag),数æ®ä¸ä¸€è‡´çš„问题和å•ç‚¹æ•…éšœçš„é£Žé™©éƒ½ä¼šè¢«æ”¾å¤§ï¼›è€Œå®Œå…¨åŒæ¥çš„æ–¹å¼å¯¹æ€§èƒ½çš„æŸå®³åˆè¿‡å¤§ã€‚
借用orczhou.com的图片如下æ¥è§£é‡ŠåŠåŒæ¥æ–¹å¼ã€‚
在åŠåŒæ¥çš„æ–¹å¼ä¸‹ï¼Œmasterç‰å¾…至少一个slave收到更新,å³ç‰å¾…å…¶Acknowledge消æ¯ï¼Œä»¥æ¤ä¿è¯è‡³å°‘有一个slave在masterçªç„¶å®•机的情况下能够ä¸ä¸¢å¤±æ•°æ®ï¼Œå¹¶è¿…速代替master机器。ä¸è¿‡å¦‚æžœç‰å¾…时间超过é™åˆ¶ï¼ŒåŠåŒæ¥æ¨¡å¼ä¼šè‡ªåŠ¨è½¬ä¸ºå¼‚æ¥æ¨¡å¼ï¼Œä¸å†ç‰å¾…slave。
Reference
- åŠåŒæ¥æ–¹å¼çš„æ›´å¤šè§£é‡Šï¼Œhttp://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
- master-slave在MySQL上的é…置,http://members.cox.net/midian/howto/mysqlReplication.htm