Xmemcached 1.3預(yù)覽:failure模式和standby節(jié)點(diǎn)
Posted on 2010-12-28 10:47 dennis 閱讀(4633) 評(píng)論(5) 編輯 收藏 所屬分類(lèi): java 、my open-sourceXmemcached在元旦左右準(zhǔn)備發(fā)1.3這個(gè)版本,這個(gè)版本新增加的一個(gè)關(guān)鍵特性就是所謂的failure模式。關(guān)于這個(gè),可以看下memcached官方文檔的解釋
《Failure,or Failover》。
展開(kāi)來(lái)說(shuō),在某個(gè)memcached節(jié)點(diǎn)掛掉或者由于其他故障連接斷開(kāi)的時(shí)候,大部分客戶(hù)端的默認(rèn)策略都是failover的,也就是會(huì)查找下一個(gè)可用的memcached節(jié)點(diǎn)繼續(xù)使用,掛掉或者連接不上的節(jié)點(diǎn)的數(shù)據(jù)會(huì)轉(zhuǎn)移到其他節(jié)點(diǎn)上,路由的策略可以是Round Robin,也可以是一致性哈希。這樣的模式在節(jié)點(diǎn)意外故障掛掉的情況下運(yùn)行的很好,但是memached節(jié)點(diǎn)也完全可能因?yàn)橐粋€(gè)意外的事故而短暫掛掉,比如你不小心弄掉了網(wǎng)線(xiàn)又馬上接上去,比如機(jī)房交換機(jī)突然停電又立即恢復(fù)了,假設(shè)在故障前,用戶(hù)A正要更新數(shù)據(jù)到節(jié)點(diǎn)A,節(jié)點(diǎn)A意外斷開(kāi),那么這些數(shù)據(jù)就更新到下一個(gè)有效節(jié)點(diǎn)B,但是節(jié)點(diǎn)A又馬上恢復(fù),這時(shí)候用戶(hù)又從節(jié)點(diǎn)A去讀數(shù)據(jù),讀到卻是更新前的老數(shù)據(jù)了(新數(shù)據(jù)更新到B節(jié)點(diǎn)去了),這種情況對(duì)用戶(hù)來(lái)說(shuō)就非常困惑,你告訴我更新成功,但是看到卻還是更新前的數(shù)據(jù)。
怎么解決呢?一個(gè)簡(jiǎn)單的方案就是所謂failure模式,當(dāng)某個(gè)節(jié)點(diǎn)掛掉的時(shí)候,不會(huì)從節(jié)點(diǎn)列表移除,請(qǐng)求也不會(huì)轉(zhuǎn)移到下一個(gè)有效節(jié)點(diǎn),而是直接將請(qǐng)求置為失敗,就剛才的場(chǎng)景來(lái)說(shuō),在用戶(hù)更新數(shù)據(jù)到節(jié)點(diǎn)A的時(shí)候,節(jié)點(diǎn)A意外斷開(kāi),那么用戶(hù)的這次更新請(qǐng)求不會(huì)轉(zhuǎn)移到節(jié)點(diǎn)B,而是直接告訴用戶(hù)更新失敗,用戶(hù)再次查詢(xún)數(shù)據(jù)則繞過(guò)節(jié)點(diǎn)A直接查詢(xún)后端存儲(chǔ)。這種模式很適合這種節(jié)點(diǎn)短暫不可用的狀況,請(qǐng)求會(huì)穿透緩存到后端,但是避免了新舊數(shù)據(jù)的問(wèn)題。
Xmemcached 1.3將支持failure模式,只要你設(shè)置下failureMode為true即可,簡(jiǎn)單示例:
XMemcachedClientBuilder builder =……
//設(shè)置使用failure模式
builder.setFailureMode(true);
在此模式下,某個(gè)節(jié)點(diǎn)掛掉的情況下,往這個(gè)節(jié)點(diǎn)的請(qǐng)求都將直接拋出MemcachedException的異常。//設(shè)置使用failure模式
builder.setFailureMode(true);
不僅如此,xmemcached 1.3還將引入standby node的概念,你可以設(shè)置某個(gè)memached節(jié)點(diǎn)的備份節(jié)點(diǎn),當(dāng)這個(gè)節(jié)點(diǎn)掛掉的時(shí)候會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給這個(gè)備份節(jié)點(diǎn),不會(huì)簡(jiǎn)單地拋出異常,也不會(huì)轉(zhuǎn)發(fā)給其他節(jié)點(diǎn)。要使用standby node,必須首先設(shè)置使用failure mode,一個(gè)例子:
XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil
.getAddressMap("192.168.1.99:11211,192.168.1.100:11211 192.168.1.101:11211,192.168.1.102:11211"));
builder.setFailureMode(true);
.getAddressMap("192.168.1.99:11211,192.168.1.100:11211 192.168.1.101:11211,192.168.1.102:11211"));
builder.setFailureMode(true);
可以看到,新的服務(wù)器字符串格式變化為host:port,host:port host:port,host:port的格式,以空格隔開(kāi)的是兩個(gè)節(jié)點(diǎn)組成的一個(gè)分組,以逗號(hào)隔開(kāi)的是主節(jié)點(diǎn)和備份節(jié)點(diǎn),以上面的例子來(lái)說(shuō),我們?cè)O(shè)置客戶(hù)端使用的節(jié)點(diǎn)是192.168.1.99和192.168.1.101,其中99對(duì)應(yīng)的備份節(jié)點(diǎn)是100,而101的備份節(jié)點(diǎn)是102。并且我們需要設(shè)置使用failure mode為true。
Failure mode加上standby節(jié)點(diǎn)可以比較好的解決新舊數(shù)據(jù)的問(wèn)題,并且也可以防止請(qǐng)求穿透緩存到DB,但是主備兩個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)同步,xmemcached不準(zhǔn)備幫你做,我的建議是可以使用repcached這個(gè)patch做復(fù)制。
有的朋友可能希望,在使用備份節(jié)點(diǎn)之前先f(wàn)lush掉備份節(jié)點(diǎn)的數(shù)據(jù),防止使用到老的數(shù)據(jù),請(qǐng)求還是可以穿透緩存去DB查找,并存儲(chǔ)到備份節(jié)點(diǎn),我仔細(xì)考慮了這個(gè)方案,衡量之下還是不準(zhǔn)備做自動(dòng)flush,主要是并發(fā)上很難處理,并且flush數(shù)據(jù)這個(gè)事情可以手工來(lái)搞,根據(jù)我的經(jīng)驗(yàn),做的太透明太自動(dòng)不一定是好事。你可以在主節(jié)點(diǎn)恢復(fù)之后,手工flush下備份節(jié)點(diǎn)的數(shù)據(jù)。
目前,xmemcached 1.3已經(jīng)整裝待發(fā),對(duì)這些特性有興趣的朋友可以先從svn下載源碼嘗鮮,有任何改進(jìn)的建議請(qǐng)發(fā)郵件給我。我的郵件地址在博客的右上角。