Database Replication是一个在冗余数æ®åº“之间分享数æ®ï¼Œä»¥ç»´æŠ¤å¤šä¸ªæ•°æ®ä¸€è‡´çš„æ•°æ®åº“副本(Replica)的方法,目的是æé«˜å¯é 性ã€å®¹é”™æ€§å’Œå¯è®¿é—®æ€§ã€‚其目的和方å¼ï¼Œç›´ç™½åœ°è¯´ï¼Œæ˜¯ä»¥å†—余数æ®çš„æ–¹å¼æé«˜å®¹é”™èƒ½åŠ›ï¼Œä»¥å®žæ—¶ç»´æŠ¤æ•°æ®åº“副本的方å¼ä¿è¯å®•机时çƒåˆ‡æ¢ï¼ŒåŒæ—¶åˆ†æ•£æ•°æ®æŸ¥è¯¢çš„è½½è·ä»¥æé«˜æ€§èƒ½ï¼Œè€Œæ‰€æœ‰çš„ä¸€åˆ‡å¯¹å¤–éƒ¨ç”¨æˆ·æ˜¯é€æ˜Žçš„。当然,ä¸åŒçš„应用背景对数æ®åº“的期望是ä¸åŒçš„,å¯èƒ½åé‡äºŽä¸Šè¿°çš„æŸäº›ä¸ªèƒ½åŠ›ï¼Œå¹¶ä¸æ˜¯å…¼æœ‰ã€‚
例如分支团队希望在远程得到一部分数æ®åº“æ•°æ®ï¼Œè€Œä¸æ˜¯å®žæ—¶è®¿é—®ä¸»æ•°æ®åº“,那么å¯é€šè¿‡Replication为其建一个主数æ®åº“䏿Ÿäº›è¡¨çš„副本,这个副本ä¸çš„æ•°æ®å¯éš”ä¸€å®šæ—¶é—´åŒæ¥ä¸€æ¬¡ã€‚
Replication䏿˜¯æ•°æ®åº“备份技术,数æ®åº“å¤‡ä»½çš„è¦æ—¨åœ¨äºŽå°†æŸä¸€ä¸ªæ—¶é—´èŠ‚ç‚¹ä¸Šçš„æ•°æ®åº“状æ€å¤‡ä»½èµ·æ¥ï¼Œä¾›æœªæ¥çš„æ•°æ®æ¢å¤æˆ–å‚考用;而Replication的数æ®åº“副本对所åšçš„æ›´æ–°éƒ½æ˜¯æ— æ¡ä»¶æ‰§è¡Œçš„,至于执行之åŽçš„æ•°æ®çŠ¶æ€æ˜¯å¥½æ˜¯å,它们ä¸å…³å¿ƒã€‚ä¸è¿‡Replication有助于数æ®åº“å¤‡ä»½ï¼ŒåŽæ–‡ä»‹ç»master-slaveæ¨¡å¼æ—¶ä¼šæåŠã€‚
从数æ®ä¸€è‡´æ€§çš„维护上讲,应用Replicationè¦é¦–先安排所有数æ®åº“副本的责任角色,è°èƒ½æŽ¥æ”¶æ›´æ”¹è¯·æ±‚并分享出æ¥ï¼Œè°ä»…读å–å…¶ä»–å‰¯æœ¬çš„æ•°æ®æ›´æ–°ã€‚ç§°å‰è€…为master,称åŽè€…为slave,通常有master-slaveå’Œmulti-master两ç§åº”用模型,下é¢é¦–先介ç»è¿™ä¸¤ç§æ¨¡åž‹ã€‚
master-slave
一个server上的DBåšmaster,其他所有server上的DB副本都作为slave。任何时候都由master接收更新请求并首先执行,然åŽå°†æ›´æ–°çš„ä¿¡æ¯ä¼ 递给slave,slave上å†åº”用更新。slaveä»…ç”¨æ¥æŽ¥æ”¶æŸ¥è¯¢è¯·æ±‚ï¼Œå½“master宕机时会按照切æ¢ç–略将一个slaveå‡çº§ä¸ºmaster,而原master在修å¤ä¹‹åŽåˆ™ä½œä¸ºslave釿–°åŠ å…¥ã€‚
借用æ¥è‡ªMySQL Reference Manual的下图说明master-slave模型的Replication的应用场景。
图ä¸çš„åº”ç”¨åœºæ™¯æ˜¯ä¸€ä¸ªå¤§é‡æ•°æ®åº“查询的web应用,使用master-slave的首è¦ç›®çš„æ˜¯åˆ†æ‹…è½½è·ã€‚
- 用户的request先由Load Balancer分派到æŸä¸€è¾ƒè½»è´Ÿè½½çš„web应用实例上;
- æ ¹æ®requestä¸å¯¹æ•°æ®çš„ä¸åŒæ“作类型,web应用实例将数æ®å®žæ—¶æ€§è¦æ±‚较宽æ¾çš„åªè¯»è¯·æ±‚å‘ç»™slave处ç†ï¼Œè€Œå°†æ•°æ®å®žæ—¶æ€§è¦æ±‚高的读æ“作或写æ“作å‘ç»™master处ç†ï¼›
- 写æ“作的信æ¯åœ¨masteræ•°æ®åº“ä¸Šæ‰§è¡Œçš„åŒæ—¶ï¼Œè¢«Replicateç»™å„个slave。
å¦å¤–,上文æåˆ°Replicationå¹¶ä¸å±žäºŽæ•°æ®åº“备份技术,但数æ®åº“备份æ“作确实å¯ä»Žä¸å—益。master-slave模型ä¸ï¼Œå¯åœ¨æŸä¸€slaveæ›´æ–°æ•°æ®åŽå°†å®ƒä»Žslave阵列ä¸åˆ‡å‡ºï¼Œæš‚æ—¶ä¸å†æŽ¥å—任何request或replication,这时å¯å¯¹æ¤slaveæ•°æ®åº“进行备份。备份过程å¯ä¸“心进行,相比直接对æœåŠ¡ä¸çš„æ•°æ®åº“åšå¤‡ä»½ï¼Œéš¾åº¦é™ä½Žè®¸å¤šã€‚备份完毕的这å°serverå¯ä¸»åŠ¨è¯·æ±‚master的数æ®ï¼Œæ›´æ–°å®Œæ¯•åŽå¯é‡æ–°ä½œä¸ºslaveåŠ å…¥é˜µåˆ—ç»§ç»æä¾›æœåŠ¡ã€‚
multi-master
â€œèƒ½å¤ŸæŽ¥æ”¶æ›´æ–°è¯·æ±‚å¹¶é¦–å…ˆæ‰§è¡Œâ€æ˜¯å…·æœ‰masterè§’è‰²çš„æ ‡å‡†ï¼Œè¯¥åº”ç”¨æ¨¡åž‹ä¸æ‰€æœ‰çš„server上的DB副本都是masterï¼Œå¯æŽ¥æ”¶æ›´æ–°è¯·æ±‚æˆ–æ•°æ®æŸ¥è¯¢è¯·æ±‚ï¼Œå› ä¸ºå®•æœºæ—¶çš„åˆ‡æ¢æˆæœ¬æ¯”master-slaveè¦å°ã€‚è¿™ç§åº”ç”¨æ¨¡åž‹çš„åœ¨å‰¯æœ¬æ•°æ®æ›´æ–°çš„ä¿¡æ¯æ¥æºä¸Šä¹Ÿåˆ†ä¸¤ç§æ–¹å¼ã€‚
1. Active Replication
任何更新请求都分别å‘ç»™å„个副本执行,这ç§ä¸»åŠ¨è¡Œä¸ºçš„å¥½å¤„åœ¨äºŽç®€åŒ–äº†å‰¯æœ¬é—´çš„æ•°æ®åŒæ¥ï¼Œå´è®©è´Ÿè½½åŒæ—¶å‘生,失去了副本间并å‘å“应查询请求的性能。
2. Passive Replication
任何更新请求åªå‘ç»™æŸä¸€ä¸ªå‰¯æœ¬ï¼Œå®ƒæŽ¥æ”¶åˆ°ä¹‹åŽä¼šç«‹å³æ‰§è¡Œï¼Œç„¶åŽå°†è‡ªå·±çš„状æ€ä¼ æ’给其他副本,其他副本在æ¤è¿‡ç¨‹ä¸åªè¢«åЍç‰å¾…。这ç§å‰¯æœ¬é—´ä¼ 递信æ¯çš„æ–¹å¼æ¯”master-slaveæ›´è¦å¤æ‚ï¼Œå› ä¸ºè¿™å¼ ç½‘ä¸Šçš„ä»»ä¸€èŠ‚ç‚¹éƒ½èƒ½å½“åšå…¶ä»–èŠ‚ç‚¹çš„ä¿¡æ¯æ¥æºï¼Œè€Œä¸”两æ¡å¯¹ä¸´ç•Œæ•°æ®çš„修改å¯èƒ½éšæ—¶å‡ºçŽ°ï¼Œæ‰€ä»¥éœ€è¦åˆ†å¸ƒå¼å¹¶å‘控制。常è§çš„æ–¹æ³•æœ‰ä¸¤ä¸ªï¼Œä¸€ä¸ªåŸºäºŽé”æœºåˆ¶ï¼Œå°†ä¿®æ”¹æ‰€æ¶‰åŠåˆ°çš„资æºçš„åŠ é”ï¼Œä»¥åŒæ¥ä¸åŒmaster上收到的更改的执行顺åºï¼›å¦ä¸€ä¸ªåŸºäºŽæ—¶é—´æˆ³å’Œäº‹åŠ¡å›žæ»šï¼Œå„副本先应用事物所æè¿°çš„æ›´æ–°ï¼Œåœ¨å…¶ä»–副本的信æ¯åˆ°æ¥åŽå‘çŽ°å†²çªæ—¶ï¼Œå†ä¾æ—¶é—´æˆ³ä¸ºæ®é€‰æ‹©æ˜¯å¦å›žæ»šå‰é¢çš„æ›´æ–°ã€‚
Reference
- Replication的解释,http://en.wikipedia.org/wiki/Database_replication
- 在负载å‡è¡¡ä¸Šçš„应用,http://dev.mysql.com/doc/refman/5.6/en/replication-solutions-scaleout.html
- 在宕机时切æ¢ä¸Šçš„应用,http://dev.mysql.com/doc/refman/5.6/en/replication-solutions-switch.html