云端高性能技術(shù)架構(gòu)淺析
無論是國外的Google、Facebook、Amazon,還是國內(nèi)的Baidu、Taobao等,這些高性能的服務(wù)器在處理高并發(fā)的請求時,都能快速、準確的給予應(yīng)答。通過查閱資料,了解現(xiàn)有大型網(wǎng)站的技術(shù)架構(gòu),發(fā)現(xiàn)目前常用的技術(shù)有分層、緩存、負載均衡、數(shù)據(jù)庫性能優(yōu)化,分布式系統(tǒng)等等。接下類分別對這些技術(shù)進行簡單介紹。
1 分層與服務(wù)分離
無論OSI的7層網(wǎng)絡(luò)結(jié)構(gòu),還是計算機底層硬件與上層軟件之間的分層,甚至于Web領(lǐng)域大家非常熟悉的MVC開發(fā)模式,分層在計算機領(lǐng)域無處不在。分層可以將不同的功能部件獨立起來,下層為上層提供訪問接口,支撐上層的功能;上層調(diào)用下層接口來完成服務(wù)。
分層也是服務(wù)器端采用的一種方法,通過將數(shù)據(jù)庫、文件資源等與應(yīng)用服務(wù)器分開,可以緩解服務(wù)器壓力。
另外,根據(jù)業(yè)務(wù)需求的不同,將明顯沒有交集的業(yè)務(wù)分開,獨立成不同的模塊單獨進行管理,也可以在很大程度上提升服務(wù)器性能。
2 緩存
緩存在計算機很多地方都有涉及,比如在內(nèi)存與硬盤之間增加Cache、增加IO緩沖區(qū)來緩解速度之間的不匹配。緩存的出現(xiàn)主要是依據(jù)計算機中著名的二八定律。緩存的技術(shù)主要包括本地緩存、分布式緩存、CDN和反向代理。
根據(jù)二八定律,80%的操作集中在20%的數(shù)據(jù)上。網(wǎng)站將常用的數(shù)據(jù)緩存在本地應(yīng)用服務(wù)器中,以后直接通過緩存中的數(shù)據(jù)來響應(yīng)用戶的請求,而不用再去計算。這樣就可以減少響應(yīng)時間。
分布式緩存相比本地緩存速度要慢,因為應(yīng)用服務(wù)器要訪問專門的緩存服務(wù)器來獲取數(shù)據(jù),但是應(yīng)用服務(wù)器主要用于處理請求,其自身內(nèi)存有限,如果緩存大量數(shù)據(jù),應(yīng)用程序的運行速度將受到明顯影響。因此很多大型網(wǎng)站都使用遠程分布式緩存,部署大內(nèi)存的服務(wù)器作為專門的緩存服務(wù)器。
緩存的另外兩種表現(xiàn)形式是CDN和反向代理。不同的地方在于,CDN部署在網(wǎng)絡(luò)提供商(比如電信、移動、聯(lián)通等)的機房,用戶在請求網(wǎng)站服務(wù)時,可以直接從網(wǎng)絡(luò)提供商機房獲取數(shù)據(jù);而反向代理則部署在網(wǎng)站的中心機房,當用戶的請求到中心機房后,首先訪問的服務(wù)器是反向代理服務(wù)器,如果反向代理服務(wù)器中有相應(yīng)資源的緩存,就將其直接返回給用戶,而不用再去請求應(yīng)用服務(wù)器。
3 負載均衡
負載均衡的原理就是去中心化。當用戶并發(fā)請求量巨大時,如果將所有的請求都交給一個服務(wù)器去處理,很可能造成服務(wù)器宕機,即使能夠正確響應(yīng),響應(yīng)時間也可能會比較長,給用戶造成不好的體驗。
大型網(wǎng)站都是將一個域名綁定不同的服務(wù)器IP,這樣表面上好像只有一臺服務(wù)器在提供服務(wù),實際則是一個服務(wù)器集群在提供相同的服務(wù)。負載均衡器接收所有用戶的請求,再根據(jù)每臺應(yīng)用服務(wù)器正在處理的請求數(shù)量來對請求進行分配。這樣就能在很大程度上提高系統(tǒng)的性能,同時擴展性也得到很大提升——當某臺服務(wù)器宕機時,直接替換就可以,其它服務(wù)器繼續(xù)相應(yīng)用戶請求;當用戶請求量超過預定峰值時,也可以通過實時增加服務(wù)器來緩解壓力。
4 數(shù)據(jù)庫性能優(yōu)化
使用緩存后,大部分的數(shù)據(jù)操作不需要通過數(shù)據(jù)庫即可完成。但是仍有一部分讀操作(緩存訪問不命中,緩存過期)和全部的寫操作需要訪問數(shù)據(jù)庫,在網(wǎng)站的用戶達到一定規(guī)模時,數(shù)據(jù)庫因為負載壓力過高而成為網(wǎng)站的瓶頸。因而需要對數(shù)據(jù)庫進行優(yōu)化,常用的技術(shù)主要包括讀寫分離、結(jié)合非關(guān)系型數(shù)據(jù)庫使用、分布式數(shù)據(jù)庫等。
一般情況下,數(shù)據(jù)庫讀操作所需要的時間比寫操作的要少很多,通過將數(shù)據(jù)庫的讀寫操作分離可以明顯改善數(shù)據(jù)庫性能。目前很多大型網(wǎng)站都配置數(shù)據(jù)庫主從關(guān)系,主數(shù)據(jù)庫用于寫操作并將數(shù)據(jù)同步更新到從數(shù)據(jù)庫上,從數(shù)據(jù)庫只負責讀操作。例如,新浪云計算平臺(SAE)給用戶的數(shù)據(jù)庫就進行了主從配置。
同時,可以利用非關(guān)系型數(shù)據(jù)庫和搜索引擎對數(shù)據(jù)檢索的優(yōu)勢,來減輕應(yīng)用服務(wù)器直接訪問關(guān)系型數(shù)據(jù)庫的壓力。
當對業(yè)務(wù)進行分離后,可以根據(jù)業(yè)務(wù)所涉及的數(shù)據(jù),將數(shù)據(jù)庫進行分庫部署在不同的服務(wù)器上。
5 冗余
網(wǎng)站需要7x24小時連續(xù)運行,但是服務(wù)器隨時可能出現(xiàn)故障,特別是服務(wù)器規(guī)模比較大時,出現(xiàn)某臺服務(wù)器宕機是必然事件。要想保證在服務(wù)器宕機的情況下網(wǎng)站依然可以繼續(xù)服務(wù),不丟失數(shù)據(jù),就需要一定程度的服務(wù)器冗余運行,數(shù)據(jù)冗余備份,這樣當某臺服務(wù)器宕機時,可以將其上的服務(wù)和數(shù)據(jù)轉(zhuǎn)移到其它機器上繼續(xù)運行。
#p#
接下來,我們主要針對緩存中的Memcached技術(shù)進行介紹。
1 Memcached
1.1 Memcached簡介
Memcached是一個高性能的分布式對象緩存系統(tǒng),用于動態(tài)Web應(yīng)用,以減輕數(shù)據(jù)庫負載[1]。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少應(yīng)用程序讀取數(shù)據(jù)庫的次數(shù),從而提高網(wǎng)站的性能。如圖1是Memcached在網(wǎng)站中的位置示意圖。
圖1 Memcached位置示意圖
Memcached以鍵值對的形式將數(shù)據(jù)(或?qū)ο?緩存在內(nèi)存中,雖然使用到了多個服務(wù)節(jié)點,但是和一般分布式緩存系統(tǒng)不同的是,每一份數(shù)據(jù)在Memcached中只存在一份,每個Memcached服務(wù)節(jié)點之間相互不可見。因此,Memcached中每份數(shù)據(jù)的鍵值是唯一的。
簡而言之,Memcached類似于一個典型的非關(guān)系型存儲系統(tǒng),可以歸入基于內(nèi)容的鍵值對存儲類型[2]。
1.2 Memcached工作原理
當高并發(fā)的外部請求訪問服務(wù)器時,負載均衡服務(wù)器會根據(jù)各應(yīng)用服務(wù)器的使用情況進行分配轉(zhuǎn)發(fā),如果需要對數(shù)據(jù)進行讀取,應(yīng)用服務(wù)器會按照一定的Hash算法計算鍵值的結(jié)果,并根據(jù)計算結(jié)果訪問Memcached的某一個服務(wù)節(jié)點,服務(wù)節(jié)點再次計算鍵值的第二次Hash值,再根據(jù)計算結(jié)果對數(shù)據(jù)進行讀取,如果緩存中有數(shù)據(jù)則直接返回給應(yīng)用,否則需要從數(shù)據(jù)庫獲取數(shù)據(jù),同時將獲取到的數(shù)據(jù)寫入到Memcached中[3]。
圖2 Memcached工作原理
#p#
2 性能分析
在本機上安裝Memcached,客戶端使用Memcached提供的接口進行數(shù)據(jù)的存儲與訪問,并與直接通過MySQL獲取數(shù)據(jù)的方式進行對比。
2.1 Memcached安裝
由于Memcached主要用于服務(wù)器端,而服務(wù)器端操作系統(tǒng)大多用Linux,因此網(wǎng)上多數(shù)教程是關(guān)于在Linux上安裝使用Memcached的。在Windows上安裝更加簡單,只需找到對應(yīng)操作系統(tǒng)的版本即可[4]。
安裝Memcached后,打開服務(wù)即可使用相應(yīng)功能,Memcached默認監(jiān)聽11211端口,如果是在本機上,直接使用127.0.0.1:11211就可以訪問了,這點和MySQL非常類似。
Memcached提供了很多高級語言的接口,可以根據(jù)這些接口來完成對數(shù)據(jù)的存儲與訪問。
2.2 Memcached和MySQL性能比較
為了比較使用Memcached前后訪問數(shù)據(jù)性能的情況,進行以下模擬實驗。
硬件條件:
CPU:Intel Core 2.60GHz;
內(nèi)存:2GB;
軟件條件:
操作系統(tǒng):Window 64;
Memcached***內(nèi)存:64MB;
Memcached***連接數(shù):1024。
MySQL中共有29120條記錄,使用多線程模擬用戶的并發(fā)訪問,每個用戶請求100次數(shù)據(jù)讀取。表1是在用戶數(shù)量為N的條件下,測試所有請求都處理完所用時間T的結(jié)果。
表1 測試結(jié)果
三種方法說明:MySQL表示所有的數(shù)據(jù)請求直接通過訪問數(shù)據(jù)庫返回;隨機Mem表示在增加了Memcached緩存后,對于每個用戶的100次請求,數(shù)據(jù)之間沒有任何關(guān)系,完全隨機;二八定律Mem表示用戶的請求遵循二八定律,就是說平均100次請求中,有比較多的次數(shù)訪問的是相同數(shù)據(jù),這個可以通過程序模擬,在訪問時控制相應(yīng)次數(shù)訪問相同的數(shù)據(jù)。
圖3、圖4分別對應(yīng)表1的兩種數(shù)據(jù)表示。
圖3 柱狀圖顯示結(jié)果
圖4 折線顯示結(jié)果
由于在完全隨機訪問的條件下,數(shù)據(jù)的命中率非常低(幾乎為0),每次請求都需要從數(shù)據(jù)庫中獲取,同時還要將請求到的數(shù)據(jù)保存在緩存中,因此效率比直接從數(shù)據(jù)庫中獲取還要低。但是當用戶多次請求相同的數(shù)據(jù)是,使用Memcached 明顯比直接從MySQL中獲取效率要高很多。
整個測試過程還存在著一些不足之處:
- 受實際條件限制,Memcached服務(wù)節(jié)點數(shù)只有1個;
- 另外,數(shù)據(jù)庫中數(shù)據(jù)量級也不是非常大;
- 沒有測試數(shù)據(jù)寫入的情況
#p#
3 關(guān)鍵問題
通過上述分析可知,Memcached在一些條件下對提升數(shù)據(jù)訪問效率有很大作用。對于那些不常變動訪問頻率又非常高的數(shù)據(jù),將其放在緩存中,可以很好的緩解數(shù)據(jù)庫的壓力,進而提升系統(tǒng)性能。但同時,Memcached自身也還存在著一些不足之處:
由于Memcached是將數(shù)據(jù)緩存在內(nèi)存中,當出現(xiàn)斷電情況時,數(shù)據(jù)將立即消失;
所有數(shù)據(jù)在Memcached中只保存一份,因此可靠性不是很高,一旦某臺服務(wù)節(jié)點出現(xiàn)故障,相應(yīng)的數(shù)據(jù)將丟失;
Memcached在設(shè)計之初每個key的value***是1MB,隨著目前數(shù)據(jù)量的快速增長,緩存數(shù)據(jù)量大的文件,比如音頻、視頻等有很大不足。
4 參考資料
俞華鋒.Memcached 在大型網(wǎng)站中的應(yīng)用[J]. 科技信息, 2008(1), p70.
王新根. Web后端性能優(yōu)化關(guān)鍵技術(shù)研究[D]. 浙江大學, 2012.
http://en.wikipedia.org/wiki/Memcached
http://blog.csdn.net/zhaotengfei36520/article/details/41315329
徐劍強,鄒偉平. Memcached應(yīng)用研究[J]. 科技廣場, 2012(7), p95-97.