孟海虹(國(guó)家新聞出版廣電總局九五一臺(tái), 石家莊 050000)
Mem cached在高并發(fā)訪問(wèn)場(chǎng)景下的應(yīng)用
孟海虹
(國(guó)家新聞出版廣電總局九五一臺(tái),石家莊050000)
摘要:隨著互聯(lián)網(wǎng)和物聯(lián)網(wǎng)的高速發(fā)展,使用網(wǎng)絡(luò)的人數(shù)和電子設(shè)備的數(shù)量急劇增長(zhǎng),對(duì)互聯(lián)網(wǎng)后臺(tái)服務(wù)程序提出了更高的性能和并發(fā)要求。同時(shí)用戶對(duì)網(wǎng)絡(luò)服務(wù)內(nèi)容也有了更高的的要求,以web頁(yè)面舉例,區(qū)別于傳統(tǒng)新聞資訊類網(wǎng)頁(yè),現(xiàn)在網(wǎng)民使用更多的是具有個(gè)性化功能的動(dòng)態(tài)頁(yè)面和移動(dòng)客戶端app,這些都對(duì)服務(wù)器、網(wǎng)絡(luò)和軟件提出了性能方面更高的要求。傳統(tǒng)的服務(wù)器端腳本調(diào)用數(shù)據(jù)庫(kù)的方式在如此大的訪問(wèn)壓力下變得越來(lái)越力不從心,而新興的NOSQL文檔型數(shù)據(jù)庫(kù)又對(duì)事務(wù)的處理力度不夠,這樣的情況下就需要對(duì)現(xiàn)有模式進(jìn)行改造,使軟件整體架構(gòu)既能保留對(duì)事務(wù)的完整支持,又能承受高并發(fā)帶來(lái)的壓力。本文對(duì)此種新架構(gòu)進(jìn)行了探索。
關(guān)鍵詞:互聯(lián)網(wǎng);Memcached;網(wǎng)絡(luò)服務(wù)
Memcached是一個(gè)開源的、高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),一般用于動(dòng)態(tài)應(yīng)用以減輕數(shù)據(jù)庫(kù)壓力。它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù),從而提高動(dòng)態(tài)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度。Mem cached基于一個(gè)存儲(chǔ)鍵/值對(duì)的hashmap。其守護(hù)進(jìn)程是用C語(yǔ)言實(shí)現(xiàn)的,但是客戶端可以用任何語(yǔ)言來(lái)編寫,并通過(guò)memcached協(xié)議與守護(hù)進(jìn)程通信。
現(xiàn)在常用的Memcached客戶多有多種,如傳統(tǒng)Memcached、Xmemcached和SpyMemcached。本文主要討論Xmemcached。Xmemcached是一個(gè)Java實(shí)現(xiàn)的Memcached客戶端,比起官方客戶端,它有以下優(yōu)勢(shì):
(1)支持所有的文本協(xié)議和二進(jìn)制協(xié)議,支持連接Kestrel和TokyoTyrant等Memcached協(xié)議兼容的系統(tǒng)并作特殊處理。
(2)支持動(dòng)態(tài)添加和刪除Mem cached節(jié)點(diǎn)。
(3)支持客戶端統(tǒng)計(jì)
(4)支持JMX監(jiān)控和統(tǒng)計(jì),可以通過(guò)JMX增刪節(jié)點(diǎn)。
(5)高性能
(6)支持節(jié)點(diǎn)的權(quán)重設(shè)置
(7)支持nio的連接池,在高負(fù)載環(huán)境下提高吞吐量
2.1Mem cached的安裝
(1) 環(huán) 境:X86_64架 構(gòu) 服 務(wù) 器、Linux系 統(tǒng)、jdk5.0+、Memcached服務(wù)器端、Xmemcached客戶端。
(2)服務(wù)器端安裝
下載wget http://memcached.org/latest解壓縮 tar -zxvfmemcached-1.x.x.tar.gz
安裝./configure&& make && make test && sudo make install
(3)客戶端安裝
客戶端可使用maven的方式進(jìn)行安裝使用:
<dependency>
<group Id>com.googlecode.xmem cached</group Id>
<artifactId>xmemcached</artifactId>
<version>{version}</version>
</dependency>
具體maven的使用不再贅述。
2.2Mem cached的使用
安裝完畢之后就可以使用java調(diào)用xmencached的功能,具體如下:
(1)首先創(chuàng)建xmemcached實(shí)例,此實(shí)例使用二進(jìn)制協(xié)議。并且可動(dòng)態(tài)添加服務(wù)器端實(shí)例。
XMemcachedClientBuilderbuilder=new
XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:11211"));
builder.setCommandFactory(newBinaryCommandFactory());
XMem cachedClient client=builder.build();
(2)將數(shù)據(jù)加入緩存以及取出
加入:client.add("key", 0, "value");
取出:String value =client.get("key");
設(shè)置服務(wù)器權(quán)重為2:client.addServer("localhost",12000,2),服務(wù)器權(quán)重越大,則從此服務(wù)器取出數(shù)據(jù)的幾率越大。
本測(cè)試將java-mem cached,spymemcached與xmem cached進(jìn)行性能對(duì)比,對(duì)比包含三項(xiàng)參數(shù),并發(fā)量(TPS)、傳輸數(shù)據(jù)大小和線程數(shù)。
3.1測(cè)試環(huán)境
(1)軟件環(huán)境
Memcached服務(wù)器版本:1.4.5,默認(rèn)設(shè)置,運(yùn)行參數(shù) "-p12000-m 1572864"。
Memcached客戶端:JVM版本:Sun JDK1.6.0_06, 使用 memcached文本協(xié)議,Xmemcached版本1.2.6.1,默認(rèn)設(shè)置,Spymemcached 2.5版本,默認(rèn)設(shè)置,Memcached-Java客戶端版本2.5.1,由于Xmemcached和Spymem cached是基于異步模式所以他們需要設(shè)置超時(shí)時(shí)間,設(shè)置為5秒過(guò)期。
(2)硬件環(huán)境
1號(hào)服務(wù)器端:
CPU::8 x Intel(R) Xeon(R) CPU E5410 @ 2.33GHz,操作系統(tǒng):Linux 2.6.9-67.ELsmp #1 SMP GNU/Linux,內(nèi)存:16 GiB,網(wǎng)絡(luò)適配器:Broadcom NetXtreme Gigabit Ethernet PCI express
2號(hào)服務(wù)器端
CPU:4 x I Intel(R) Xeon(R) CPU 5120 @ 1.86GHz,操作系統(tǒng):Linux 2.6.9-67.ELsmp #1 SMPGNU/Linux,內(nèi)存:4 GiB,網(wǎng)絡(luò)適配器:Broadcom NetX treme Gigabit Ethernet PCI express
3號(hào)服務(wù)器端
CPU:4 x I Intel(R) Xeon(R) CPU 5120 @ 1.86GHz,操作系統(tǒng):Linux 2.6.9-67.ELsmp #1 SMP GNU/Linux,內(nèi)存:4 GiB,網(wǎng)絡(luò)適配器:Broadcom NetXtreme Gigabit Ethernet PCI express
客戶端
CPU:8 x Intel(R) Xeon(R) CPU E5410 @ 2.33GHz,操作系統(tǒng):2.6.9-67.ELsmp #1 SMP GNU/Linux,內(nèi)存:16 GiB,網(wǎng)絡(luò)適配器:Broadcom NetXtreme Gigabit Ethernet PCI express
3.2測(cè)試結(jié)果
通過(guò)測(cè)試結(jié)果我們可以得出結(jié)論:隨著網(wǎng)絡(luò)數(shù)據(jù)傳輸量的增大,同線程數(shù)下吞吐量越來(lái)越小,增加線程數(shù)可有效提高吞吐量。在低線程數(shù)下,Java-mem cached客戶端性能優(yōu)勢(shì)比較明顯,高線程數(shù)下javamemcached客戶端與Xmemcached客戶端性能接近。在低網(wǎng)絡(luò)傳輸量條件下,Spymemcached客戶端劣勢(shì)比較明顯,在傳輸較大數(shù)據(jù)時(shí),各客戶端表現(xiàn)趨于相同。
(1)若需要提高動(dòng)態(tài)應(yīng)用讀取能力,可部署多臺(tái)高性能大內(nèi)存服務(wù)器運(yùn)行Memcached服務(wù)器端,利用空間換時(shí)間得到最優(yōu)的效果。
(2)為了提高M(jìn)emcached效率,盡量使用業(yè)務(wù)邏輯來(lái)區(qū)分Memcached服務(wù)器,使得取值命中率提升,避免遍歷服務(wù)器造成無(wú)謂的性能損失。
(3)為更強(qiáng)cpu和更大內(nèi)存的服務(wù)器設(shè)置高權(quán)重值,達(dá)到物盡其用的效果。
(4)故障轉(zhuǎn)移和擴(kuò)容的問(wèn)題:memcached它不是一個(gè)分布式的系統(tǒng),嚴(yán)格來(lái)說(shuō)是個(gè)單點(diǎn)系統(tǒng),所謂的分布式只是借助客戶端來(lái)實(shí)現(xiàn)的。所以它沒(méi)有那些開源分布式系統(tǒng)那樣的高可用性,所以需要從客戶端這里解決單點(diǎn)問(wèn)題和擴(kuò)容問(wèn)題??墒褂靡韵聝煞N方法:
1)一致性哈希:依賴于一致性哈希的特點(diǎn),節(jié)點(diǎn)故障或擴(kuò)容加節(jié)點(diǎn)時(shí)對(duì)集群影響較小,節(jié)點(diǎn)調(diào)整的最初一段時(shí)間內(nèi),會(huì)有一部分緩存丟失,穿透到后端的數(shù)據(jù)庫(kù)上,在高并發(fā)的應(yīng)用里,要做好并發(fā)控制,以免對(duì)數(shù)據(jù)庫(kù)造成壓力。
2)雙寫機(jī)制:客戶端維護(hù)兩個(gè)集群,每次更新數(shù)據(jù)的時(shí)候同時(shí)更新兩份,讀取的時(shí)候隨機(jī)(或固定)讀取一份,這種情況下集群的可用性和穩(wěn)定性很高,可以無(wú)痛變更,節(jié)點(diǎn)故障或擴(kuò)容對(duì)緩存和后端數(shù)據(jù)庫(kù)都沒(méi)有影響。當(dāng)然,這樣做也是有代價(jià)的:一是兩份數(shù)據(jù)的一致性問(wèn)題,不過(guò)對(duì)緩存來(lái)說(shuō),這種極少數(shù)的不一致情況是可以容忍的;另一個(gè)是內(nèi)存浪費(fèi)的問(wèn)題,通過(guò)冗余一份數(shù)據(jù)來(lái)減少故障率,但是代價(jià)比較大,并不適合大型的互聯(lián)網(wǎng)應(yīng)用。
(5)隨著網(wǎng)絡(luò)傳輸量的增大,性能下降比較大,應(yīng)避免傳輸過(guò)大的數(shù)據(jù)。
(6)數(shù)據(jù)預(yù)熱問(wèn)題。由于Memcached是一套內(nèi)存緩存系統(tǒng),當(dāng)系統(tǒng)剛剛啟動(dòng)時(shí),會(huì)有一個(gè)寫緩存的過(guò)程,數(shù)據(jù)量不同寫入時(shí)間也不同。所以系統(tǒng)啟動(dòng)初期會(huì)有一個(gè)訪問(wèn)較慢的過(guò)程,隨著緩存機(jī)制逐漸起作用,系統(tǒng)性能會(huì)逐漸過(guò)渡到加緩存后的正常狀態(tài)。
(7)通過(guò)設(shè)置合適的算法如LRU和合理的過(guò)期時(shí)間,能夠使得Memcached系統(tǒng)的命中率有效的提高。
(8)Memcached將數(shù)據(jù)保存在內(nèi)存里,并沒(méi)有持久化,遇到停電或者故障等情況數(shù)據(jù)會(huì)丟失,所以并不能將其當(dāng)作傳統(tǒng)的數(shù)據(jù)庫(kù)來(lái)使用。