分散式快取GemFire架構介紹

五柳-先生發表於2015-09-13

1什麼是GemFire

GemFire是一個位於應用叢集和後端資料來源之間的高效能、分散式的運算元據(operational data)管理基礎架構。它提供了低延遲、高吞吐量的資料共享和事件分發。GemFire充分利用網路中的記憶體和磁碟資源,形成一個實時的資料網格(data fabric or grid)


 

GemFire的主要特性有:

Ø  多種網路拓撲

Ø  高併發的記憶體資料結構,避免鎖爭奪

Ø  可選的ACID

Ø  序列化(native serialization)和智慧緩衝(smart buffering)保證訊息快速分發

Ø  同步或非同步寫磁碟

Ø  冗餘記憶體拷貝

2網路拓撲和快取架構

考慮到問題多樣性和架構靈活性,GemFire提供了多種選項來配置在哪(where)以及怎樣(how)管理快取資料,這就使架構師能夠從P2P(peer-to-peer)CS(client-server)WAN三種元件構建出合適的快取架構。

2.1 P2P拓撲

P2P分散式系統中,應用程式使用GemFire的映象(mirroring)功能來將大量資料跨結點分割槽(sharding)以及在這些結點間進行資料複製同步。下面主要講一下GemFireP2P拓撲中的兩個主要角色:mirrored映象結點和partitioned分割槽結點(具體見3.2mirror-type的配置方式)

因為在P2P拓撲中快取資料與應用在一起,所以首先說一下嵌入式快取。所謂嵌入式快取(embedded cache)其實就是說快取和應用程式在一起,直接利用應用伺服器的記憶體空間。也就是我們常說的類似Ehcache的那種本地快取(local cache)


 

mirrored結點就像一塊磁鐵一樣,將其他資料區域的資料都吸附過來,形成一塊完整的資料集合。當一塊資料區域被配置為mirrored的結點第一次新建或重建時,GemFire將自動執行初始映象抓取(initial image fetch)操作,從其他結點的資料子集中還原出完整的狀態。如果此時網路中存在另一個mirrored結點,那麼將會執行最優直接抓取(optimal directed fetch)


 

所以我們很容易看出,mirrored結點主要出於兩種目的:

Ø  對於大量讀的應用,應用程式通過儲存全量資料,使客戶端請求可以即時訪問到想要資料,而無需經過網路傳輸

Ø  當發生故障時,mirrored結點可以用來恢復其他結點

 

不同於mirrored結點,每個partitioned結點都持有唯一的一塊資料。應用程式就像操作本地資料一樣,GemFire在幕後管理各個分割槽的資料,並且保證在至多一跳內(at most one network hop)完成資料訪問。根據GemFire的雜湊演算法,分割槽資料會被自動放入到各個結點的bucket中。同時GemFire也會自動分配出冗餘資料的位置並進行復制。當某個結點出錯時,客戶端請求會自動被重定向到備份結點。並且GemFire會重新複製出一份資料,從而保證資料的冗餘拷貝數。最後,我們可以隨時向網路中加入新的結點來對GemFire叢集進行動態擴容。


 

P2P系統提供了低延遲、單跳(one-hop)資料訪問、動態發現以及透明化的資料儲存位置。但是,網路中的每個結點都要維持一個socket連線到其他每個結點。當結點增多時,連線數將成指數級增長。為了提高擴充套件性,GemFire提供了一種可靠的UDP多播的通訊方式。在下一節中我們將看到,P2P資料同步在伺服器間複製資料時的作用。

2.2 Client-Server拓撲

Client-Server快取允許大量結點相連形成客戶端-伺服器結構。伺服器即為客戶端提供快取,也可以為其他伺服器提供資料複製或快取。


2.3 WAN拓撲

P2P叢集由於點和點之間的緊耦合而產生了擴充套件性問題,這種問題在資料中心有多個叢集或資料中心跨城市時被放大。GemFire提供另一種模型來解決。


3 GemFire工作原理

3.1發現機制

預設GemFire使用IP多播來發現新成員,然而所有成員間的通訊都採用TCP。對於部署環境禁止使用IP多播或者網路跨越多個子網時,GemFire提供備用方法:使用輕量級的定位伺服器(locator server)來追蹤所有成員的連線。新成員加入叢集時,將詢問定位服務並建立類似於IP多播的socketsocketTCP連線。

3.2資料分發

每個成員都會建立一個或多個快取資料區域(data region),通過區域的劃分,我們能給每個區域配置不同的分發屬性、記憶體管理以及資料一致性模型。預設GemFire使用P2P分發模型,每個成員都能和其他任何成員通訊。同時根據不同的內網特點,傳輸層可選TCP/IP或可靠多播(UDP)。在這些配置中,有兩個屬性很重要,範圍(scope)和映象型別(mirror-type)

首先,範圍(scope)有四種選項:

Ø  Local:不分發。那為什麼不直接儲存到HashMap中。因為GemFire額外提供了資料自動持久化到磁碟、OQL(Object Query Language)查詢資料、資料操作的事務等特性。

Ø  Distribute-no-ack:傳送資料給成員1,在傳送資料給成員2時不等待成員1的響應。適用於對資料一致性要求不高,並要求低網路延遲的情況。這是GemFire的預設配置,能夠提供低延遲、高吞吐,並通過儘快分發來降低資料衝突的概率。

Ø  Distribute-ack:在傳送給成員2前,傳送資料並等待成員1的響應。這樣每條資料都是同步分發的。

Ø  Global:分發前在其他成員上獲得鎖,再分發資料。適用於悲觀的應用場景,通過全域性鎖服務來管理鎖的獲得、釋放和超時。


 

現在來看一下第二個重要的配置屬性映象型別(mirror-type)

Ø  none:僅當快取中有此資料時才更新,任何其他成員發來的新資料都會被忽略掉。適用於某一資料區域僅用來儲存另一區域資料的子集。

Ø  keys:資料區域僅儲存key來節約記憶體,當真正有請求時再從其他區域抓取資料並儲存到本地,之後接受對此資料項的更新。適用於無法預測哪些資料會被某一結點訪問的情況。

Ø  keys-values:真正的映象,將儲存全量資料。適用於需要立即訪問所有資料的結點,以及資料冗餘備份。

 

這兩個屬性的配置對資料區域中儲存的是什麼資料有很大影響:


4持久化和溢位

持久化(persistence)將整個資料集拷貝到磁碟,當成員出錯時可以用來還原資料。而溢位(overflow)儲存key在記憶體中而value儲存到磁碟,達到節省記憶體的目的。兩者既可以單獨使用,也可以混合使用。

4.1持久化

GemFire支援兩種寫磁碟選項:操作記憶體資料時同步寫,或者固定間隔非同步寫。後一種只當應用在出錯時能夠容忍不完整的資料還原時使用。


4.2溢位

當記憶體不足時,GemFire使用LRU策略來決定是否對某個資料項溢位。


4.3混合使用

持久化與溢位可以混合使用。所有key-value都備份到磁碟,並且當記憶體不足時,只保留最近使用過的資料。由於LRU而被移除到磁碟的value不會對磁碟有影響,因為所有資料已被持久化到磁碟上了。


 

5事務

GemFire支援快取事務與JTA事務兩種。

5.1快取事務

每個事務都有其私有的工作區域。事務開始時,資料將被拷貝到私有區域,直到事務提交。若提交時沒有衝突,則資料從私有區域拷貝回原區域。這樣事務就可以併發地修改快取了。


 

對於範圍(scope)配置為local的快取資料區域,事務提交後就算是完成了。但對於分散式(scope=distributed-no-ack or distributed-ack),則在事務提交時要進行快取同步。

6查詢

(待補充:OOL)

7資料可用性和Failover

轉載: http://blog.csdn.net/dc_726/article/details/41378633

相關文章