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