3.分布式緩存架構
深圳網(wǎng)站建設分布式緩存指緩存部署在多個服務器組成的集群中,以集群方式提供緩存服務,其架構方式有兩種,一種是以JBoss Cache為代表的需要更新同步的分布式緩存,一種是以Memcached為代表的不i相通信的分布式緩存。
JBoss Cache的分布式緩存在集群中所有服務器中保存相同的緩存數(shù)據(jù),當某臺服務器有緩存數(shù)據(jù)更新的時候,會通知集群中其他機器更新緩存數(shù)據(jù)或清除緩存數(shù)據(jù),如圖4.9所示。JBoss Cache通常將應用程序和緩存部署在同一臺服務器上,應用程序可從本地快速獲取緩存數(shù)據(jù),但是這種方式帶來的問題是緩存數(shù)據(jù)的數(shù)量受限于單一服務器的內(nèi)存空間,而且當集群規(guī)模較大的時候,緩存更新信息需要同步到集群所有機器,其代價驚人。因而這種方案更多見于企業(yè)應用系統(tǒng)中,而很少在大型網(wǎng)站使用。
大型網(wǎng)站需要緩存的數(shù)據(jù)量一般都很龐大,可能會需要數(shù)TB的內(nèi)存做緩存,這時候就需要另一種分布式緩存,如圖4.10所示。Memcached采用一種集中式的緩存集群管理,也被稱作互不通信的分布式架構方式。緩存與應用分離部署,緩存系統(tǒng)部署在一組專門的服務器上,應用程序通過一致性Hash等路由算法選擇緩存服務器遠程訪問緩存數(shù)據(jù),緩存服務器之間不通信,緩存集群的規(guī)??梢院苋菀椎貙崿F(xiàn)擴容,具有良好的可伸縮性。
Memcached的伸縮性設計參考本書第6章內(nèi)容。
4. Memcached
Memcached曾一度是網(wǎng)站分布式緩存的代名詞,被大量網(wǎng)站使用。其簡單的設計、優(yōu)異的性能、互不通信的服務器集群、海量數(shù)據(jù)可伸縮的架構令網(wǎng)站架構師們趨之若鶩。
簡單的通信協(xié)議
遠程通信設計需要考慮兩方面的要素,一是通信協(xié)議,即選擇TCP協(xié)議還是UDP協(xié)議,抑或HTTP協(xié)議;一是通信序列化協(xié)議,數(shù)據(jù)傳輸?shù)膬啥?,必須使用彼此可識別的數(shù)據(jù)序列化方式才能使通信得以完成,如XML、JSON等文本序列化協(xié)議,或者GoogleProtobuffer等二進制序列化協(xié)議。Memcached使用TCP協(xié)議(UDP也支持)通信,其序列化協(xié)議則是一套基于文本的自定義協(xié)議,非常簡單,以一個命令關鍵字開頭,后面是
一組命令操作數(shù)。例如讀取一個數(shù)據(jù)的命令協(xié)議是get 。Memcached以后,許多NoSQL產(chǎn)品都借鑒了或直接支持這套協(xié)議。
豐富的客戶端程序
Memcached通信協(xié)議非常簡單,只要支持該協(xié)議的客戶端都可以和Memcached服務器通信,因此Memcached發(fā)展出非常豐富的客戶端程序,幾乎支持所有主流的網(wǎng)站編程語言,Java、C/C++/C#、Perl、Python、PHP、Ruby等,因此在混合使用多種編程語言的網(wǎng)站,Memcached更是如魚得水。
高性能的網(wǎng)絡通信
Memcached服務端通信模塊基于Libevem,一個支持事件觸發(fā)的網(wǎng)絡通信程序庫。
互不通信的服務器集群架構
如上所述,正是這個特性使得Memcached從JBoss Cache、OSCache等眾多分布式緩存產(chǎn)品中脫穎而出,滿足網(wǎng)站對海量緩存數(shù)據(jù)的需求。而其客戶端路由算法一致性Hash更成為數(shù)據(jù)存儲伸縮性架構設計的經(jīng)典范式(參考本書第6章)。事實上,正是集群內(nèi)服務器互不通信使得集群可以做到幾乎無限制的線性伸縮,這也正是目前流行的許多大數(shù)據(jù)技術的基本架構特點。
雖然近些年許多NoSQL產(chǎn)品層出不窮,在數(shù)據(jù)持久化、支持復雜數(shù)據(jù)結構、甚至性能方面有許多產(chǎn)品優(yōu)于Memcached,但Memcached由于其簡單、穩(wěn)定、專注的特點,仍然在分布式緩存領域占據(jù)著重要地位。