Memcached 群集高可用性(HA)架构
??????? Memcache本身并不實(shí)現(xiàn)集群功能。假設(shè)你想使用Memcahce集群需要使用第三方軟件或編程來(lái)實(shí)現(xiàn)自己的設(shè)計(jì),這里將被用來(lái)memagent實(shí)現(xiàn)代理,memagent也被稱為magent。我們注意到,,這二者當(dāng)成兩種工具。至于memcache、magent的安裝請(qǐng)參考文章 ? 在Linux上安裝Memcached服務(wù)和?magent編譯安裝及常見(jiàn)錯(cuò)誤??????
總體架構(gòu)
??????? 直接上圖:
從圖中能夠看到有兩個(gè)magent節(jié)點(diǎn),兩個(gè)memcached節(jié)點(diǎn),每一個(gè)magent節(jié)點(diǎn)又分別代理兩個(gè)memcached節(jié)點(diǎn),應(yīng)用系統(tǒng)端使用magent pool來(lái)調(diào)用memcache進(jìn)行存儲(chǔ)。
硬件結(jié)構(gòu)為兩臺(tái)linuxserver。每臺(tái)server上分別安裝magent和memcached服務(wù),并設(shè)為開(kāi)機(jī)啟動(dòng)。
這樣做的優(yōu)點(diǎn)是不論什么一臺(tái)server宕機(jī)后都不影響magent pool獲取memcache信息,即實(shí)現(xiàn)了memcached的高可用(HA),假設(shè)兩臺(tái)機(jī)器都宕機(jī)了。僅僅能說(shuō)明你RP太差了。
當(dāng)然。也能夠用三臺(tái)、四臺(tái)或者很多其它server來(lái)提高HA。
測(cè)試HA
??????? 測(cè)試背景,本地局域網(wǎng)內(nèi)兩臺(tái)server172.18.117.71(memcacheport11211,magentport11210),172.18.117.113(memcacheport11211,magentport11210),和兩臺(tái)server在同一局域網(wǎng)內(nèi)的測(cè)試機(jī)器,下邊是測(cè)試代碼:
import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool;public class MainTest {public static void main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent連接池pool.setServers(new String[] { "172.18.117.71:11210","172.18.117.113:11210" });pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();memCachedClient.set("becd0000", "測(cè)試樣例");//System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}步驟1:將key為“becd0000”,value為“測(cè)試樣例”通過(guò)magent的pool放到memcache中
步驟2:改動(dòng)magent連接池為單個(gè)memcache連接,代碼例如以下
import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool;public class MainTest {public static void main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent連接池pool.setServers(new String[] { "172.18.117.71:11211"});pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();//memCachedClient.set("becd0000", "測(cè)試樣例");System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}能夠看到單獨(dú)訪問(wèn)memcache是能夠取到剛才所存儲(chǔ)的值的。
步驟3:改動(dòng)
pool.setServers(new String[] { "172.18.117.71:11211"});為 pool.setServers(new String[] { "172.18.117.113:11211"});再次運(yùn)行能夠看到和步驟2一樣的結(jié)果,都能夠取到值,說(shuō)明通過(guò)magent代理存的值會(huì)分別放到兩個(gè)memcache中步驟4:停止172.18.117.113上的memcached服務(wù)
停止memcached服務(wù)命令:kill "cat /tmp/memcached.pid"
步驟5:再次通過(guò)magent代理取值,代碼例如以下:
import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool;public class MainTest {public static void main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent連接池pool.setServers(new String[] { "172.18.117.71:11210","172.18.117.113:11210" });pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();//memCachedClient.set("becd0000", "測(cè)試樣例");System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}可以看到依舊可以取到值。
步驟6:啟動(dòng)剛才停掉的memcached服務(wù),重新啟動(dòng)后memcache中全部信息將清空
步驟7:再次通過(guò)magent代理池去取key為“becd0000”的值。代碼例如以下: import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool;public class MainTest {public static void main(String[] arg){SockIOPool pool = SockIOPool.getInstance();//magent連接池pool.setServers(new String[] { "172.18.117.71:11210","172.18.117.113:11210" });pool.setSocketTO(3000);pool.setNagle(false);pool.setSocketConnectTO(0);pool.initialize();MemCachedClient memCachedClient = new MemCachedClient();//memCachedClient.set("becd0000", "測(cè)試樣例");System.out.println(memCachedClient.get("becd0000"));//System.out.println(memCachedClient.flushAll());}}能夠看到這里取到的值為null。
結(jié)果分析
??????? 通過(guò)以上測(cè)試能夠得出結(jié)論
1、通過(guò)magent的連接池放的值會(huì)分別存在magent代理的全部memcached上去
2、假設(shè)有一個(gè)memcached宕機(jī)通過(guò)magent代理方式還能取到值
3、假設(shè)memcached修復(fù)重新啟動(dòng)后通過(guò)magent代理方式取到的值就會(huì)為Null,這是由于memcache重新啟動(dòng)后里邊的值隨著memcache服務(wù)的停止就消失了(由于在內(nèi)存中)。可是magent是通過(guò)key進(jìn)行哈希計(jì)算分配到某臺(tái)機(jī)器上的。memcache重新啟動(dòng)后會(huì)還從這臺(tái)機(jī)器上取值,全部取到的值就沒(méi)空。
??????? 解決的方法
1、在每次memcache宕機(jī)修復(fù)后能夠?qū)懸粋€(gè)程序把集群中的其它memcache的全部信息全給復(fù)制到當(dāng)前宕機(jī)修復(fù)后的memcache中。
2、自己寫(xiě)代理。當(dāng)從一個(gè)memcached服務(wù)上取到的值為null時(shí)再去其它memcached上取值
注意事項(xiàng)
??????? magent的調(diào)用方式同memcached一樣。client能夠不用改代碼就可以實(shí)現(xiàn)切換到magent模式下
版權(quán)全部分,轉(zhuǎn)載請(qǐng)注明、資源。
版權(quán)聲明:本文博客原創(chuàng)文章,博客,未經(jīng)同意,不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/hrhguanli/p/4680866.html
總結(jié)
以上是生活随笔為你收集整理的Memcached 群集高可用性(HA)架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android开源项目整理:个性化空间V
- 下一篇: IO-BufferedInputStre