被最广泛使用的异æ¥Database Replication有å¯èƒ½å› 更新延迟(lag)而出现问题:当查询请求被slaveå¤„ç†æ—¶ï¼Œå¦‚æžœslaveå› æ›´æ–°å»¶è¿Ÿè€ŒåŒ…å«å°šæœªæ›´æ–°çš„é™ˆè…æ•°æ®ï¼Œä¼šå¯¼è‡´æŸ¥è¯¢ç»“æžœä¸å‡†ç¡®ã€‚
例如OLTP(On-Line Transaction Processingï¼Œè”æœºäº‹ç‰©å¤„ç†ï¼‰åž‹çš„æŸ¥è¯¢è¯·æ±‚è¦æ±‚æžé«˜çš„实时性,如在åšå®¢ä¸å‘è¡¨å®Œä¸€ç¯‡æ–‡ç« å°±åº”ç«‹å³çœ‹åˆ°å®ƒå‡ºçŽ°åœ¨æ–‡ç« åˆ—è¡¨ä¸ï¼Œslave上的replicationé€šå¸¸æ— æ³•åŠæ—¶åšå®Œï¼Œè¿™æ—¶å¦‚果查询请求由slaveæ¥å¤„ç†ï¼Œè¿”å›žçš„å°±æ˜¯é”™è¯¯çš„é™ˆè…æ•°æ®ï¼ˆstale data)。Replication的延迟虽然通常很å°ï¼Œä½†æ¯•ç«Ÿä¸æ˜¯å®žæ—¶åŒæ¥ï¼Œåœ¨slave上查ä¸åˆ°æœ€æ–°æ•°æ®çš„æƒ…况会å˜åœ¨çš„,何况在master高负载时å‘slave更新的延迟会更大。
当æŸslaveçš„Replication延迟过大时,应将æ¤slave移出æœåŠ¡åŽå¼ºåˆ¶åŒæ¥æ•°æ®ã€‚ä¸è¿‡åœ¨å»¶è¿Ÿå˜åœ¨ä½†è¿˜ä¸ç®—过大时,如何在ä¿è¯æŸ¥è¯¢å‡†ç¡®æ€§çš„剿䏋åˆé€‚地使用slaveæ¥åˆ†æ‹…负载呢?下é¢è®¨è®ºä¸‹Peter Zaitsevåœ¨ä»–çš„æ–‡ç« ä¸æåˆ°äº†ä¸‰ä¸ªæ–¹æ³•ï¼Œè‡³äºŽå®ƒä»¬ä¹‹é—´çš„æ··åˆä½¿ç”¨å°±ä¸åœ¨è®¨è®ºä¹‹å†…了。
æ ¹æ®æŸ¥è¯¢ç±»åž‹å†³å®šå¦‚何分派查询请求
æ ¹æ®æŸ¥è¯¢å¯¹æ•°æ®çš„å®žæ—¶æ€§è¦æ±‚,将查询分为time criticalå’Œnon time critical两ç§ï¼Œå‰è€…å—Replication延迟的影å“å¾ˆå¤§ï¼Œå¦‚å‰æ–‡æåˆ°çš„OLTP型的查询;åŽè€…对Replicationçš„å»¶è¿Ÿä¸æ•æ„Ÿï¼Œå¯¹æœ€æ–°æ•°æ®æ²¡æœ‰è¿«åˆ‡çš„è¦æ±‚,如多为报表使用的OLAP(On-Line Analytical Processingï¼Œè”æœºåˆ†æžå¤„ç†ï¼‰åž‹æŸ¥è¯¢ã€‚
åœ¨åˆ†æ´¾æŸ¥è¯¢è¯·æ±‚æ—¶ï¼Œè¯†åˆ«è¯¥æŸ¥è¯¢è¯·æ±‚çš„å®žæ—¶æ€§è¦æ±‚,将non time critical的查询交给slave处ç†ï¼Œè€Œå°†time critical的查询交master处ç†ã€‚å¯è§ï¼Œåªè¯»æ€§è´¨çš„æ•°æ®åˆ†æžå¼æŸ¥è¯¢è¶Šå¤šï¼Œslave所分担的载è·å°±è¶Šå¤šï¼Œè¿™ç§æ–¹æ¡ˆå°±è¶Šæœ‰æ•ˆã€‚
æ ¹æ®session为访问者指派数æ®åº“副本
è¿™ç§è€ƒè™‘是从两个事实出å‘的。
(1)刚刚åšè¿‡æ›´æ–°æ“作的访问者需è¦å®žæ—¶èŽ·å¾—æ›´æ–°åŽçš„æ•°æ®
åšå®Œæ›´æ–°æ“作的访问者应在一定时间段内åªä»Žmasterè¯»å–æ•°æ®ï¼Œä»¥ä¿è¯ä»–能读到å¯èƒ½ç”±ä»–自己写入的最新数æ®ã€‚这个时间段应长于所有slave上Replication的最长时间,以ä¿è¯ä»–写的数æ®å·²ç»replicate给了slave。
(2)刚刚查询过数æ®çš„è®¿é—®è€…åº”å½“åœ¨å†æ¬¡åšç›¸åŒæŸ¥è¯¢æ—¶çœ‹åˆ°åŸºæœ¬ç›¸åŒçš„æ•°æ®
如果一个访问者的两次åªè¯»æŸ¥è¯¢è¯·æ±‚是由两个slave分别处ç†çš„ï¼Œé‚£ä¹ˆç¬¬ä¸€æ¬¡è¯»åˆ°çš„æ•°æ®æœ‰å¯èƒ½åœ¨ç¬¬äºŒæ¬¡è¯»æ—¶æ‰¾ä¸åˆ°ï¼Œå› 为ä¸åŒslaveçš„Replication延迟是ä¸åŒçš„,å˜åœ¨è¢«æŸ¥è¯¢çš„æ•°æ®åœ¨ä¸€ä¸ªslaveä¸è¢«æ›´æ–°äº†ä½†å°šæœªæ›´æ–°åˆ°å¦ä¸€ä¸ªslaveä¸çš„æƒ…况。所以,给访问者session,让他在这一段时间内æŒç»è®¿é—®åŒä¸€ä¸ªslave。
è¿™ç§æ–¹æ³•说起æ¥å®¹æ˜“åšèµ·æ¥éš¾ã€‚而且,在sessionçš„æ—¶é—´æ®µå†…è®¿é—®è€…æ— æ³•æ‘†è„±æ‰€æŒ‡æ´¾çš„slave,失去了在请求之间切æ¢åˆ°å…¶å®ƒslave上获å–较新数æ®çš„æœºä¼šã€‚
æ ¹æ®è®¿é—®å¯¹è±¡æŒ‡æ´¾æ•°æ®åº“副本
æ ¹æ®æ‰€æŸ¥è¯¢æ•°æ®çš„æœ€åŽæ›´æ”¹æ—¶é—´ï¼ˆlast updated time)决定将查询请求å‘ç»™master或slave。数æ®çš„æœ€åŽæ›´æ”¹æ—¶é—´ç¦»å½“剿—¶é—´è¶Šè¿‘,它出现在slaveä¸Šçš„å‡ çŽ‡å°±è¶Šå°ï¼Œè¿™ç§è¯·æ±‚åªèƒ½ç”±master出马;å之,则å¯ä½¿ç”¨slave处ç†è¯·æ±‚。
一个例å:åšå®¢ä¸Šçš„æ–‡ç« æœ‰æœ€åŽæ›´æ–°æ—¶é—´ï¼ŒæŸ¥è¯¢æŸç¯‡æ–‡ç« æ—¶ï¼Œå…ˆæŸ¥è¯¥æ–‡ç« çš„æ–°æ—§ï¼Œå¦‚æžœæ–‡ç« å¾ˆæ–°é‚£å‘master请求数æ®ï¼Œå¦‚æžœæ–‡ç« å·²ç»ä¸é‚£ä¹ˆæ–°äº†ï¼Œé‚£å°±ç”±slaveå¤„ç†æŸ¥è¯¢è¯·æ±‚。
è¿™æ„å‘³ç€æ•°æ®æŸ¥è¯¢è¯·æ±‚被执行之å‰éœ€è¦é¢å¤–æŸ¥è¯¢ä¸€æ¬¡å…¶æœ€åŽæ›´æ–°æ—¶é—´ï¼Ÿæ²¡é”™ã€‚幸è¿çš„æ˜¯ï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨memcached之类的对象缓å˜ç³»ç»Ÿæ¥ä»£æ›¿ç›´æŽ¥å‘masteråšè¿™ä¸ªæŸ¥è¯¢ã€‚
è¿™ä¸æ–¹æ³•çš„æ€æƒ³å¾ˆç¾Žï¼Œä¸è¿‡é€‚用范围较窄。对于å¯è¿½è¸ªæœ€åŽæ›´æ–°æ—¶é—´çš„对象,如åšå®¢æ–‡ç« ã€è¯„论ç‰ï¼Œå•ä¸ªæŸ¥è¯¢å…¶æ•°æ®æ—¶å¯é‡‡ç”¨æ¤æ–¹æ³•ï¼›å¦‚æžœæŸ¥è¯¢è¿™æ ·çš„å¯¹è±¡é›†åˆï¼Œé‚£å°±è¦å‚è€ƒå®žæ—¶æ€§è¦æ±‚åŽ»è€ƒè™‘äº†ã€‚åœ¨å¤æ‚性方é¢ï¼Œç¼“å˜çš„维护以åŠä¸ŽReplication时间之间的æƒè¡¡ä¸ºè¯¥æ–¹æ³•å¢žåŠ äº†éš¾åº¦ï¼Œä»»ä½•æ²¡æœ‰æ›´æ–°åˆ°æ‰€æœ‰slave上的数æ®å¯¹è±¡éƒ½éœ€è¦ç»´æŠ¤åœ¨cacheä¸ï¼Œè€Œå·²ç»æ›´æ–°è‡³æ‰€æœ‰slave上的数æ®å¯¹è±¡ç†è®ºä¸Šéƒ½éœ€è¦ä»Žcacheä¸ç§»é™¤ï¼Œä»¥æ¸…ç†cache空间。
References
- Peter Zaitsevçš„æ–‡ç« ï¼Œhttp://www.mysqlperformanceblog.com/2007/02/14/getting-use-of-slave-in-mysql-replication/