Hazelcast與MongoDB整合
一、Hazelcast與MongoDB
Hazelcast的分布式資料結構和計算效能使得它可以作為應用程式後端的“MongoDB”。
MongoDB是一個開源的、面向文檔的資料庫,其擴充性和靈活性都非常好。MongoDB不是把資料存入(關聯式資料庫的)表和行,而類似於JSON文檔的方式和是以動態模式進行儲存。簡而言之,MongoDB是一種NoSQL資料存放區,主要涉及資料的儲存和持久化以及無模式資料的檢索。
Hazelcast是一個開源的、分布式的、高可用的、可擴充的記憶體資料格儲存,它基於Apache v2許可證發布,可用作緩衝、訊息代理器以及分散式運算平台。Hazelcast強調高速訪問分布式資料(通常是分布式的緩衝)、分散式運算和分布式訊息。
可以查看這個文檔: https://hazelcast.com/use-cases/nosql/nosql-data-store/
Hazelcast可以當作NoSQL儲存方案。MongoDB有一些資料格、格線運算的功能,但MongoDB在這方面未做最佳化。因此,Hazelcast和MongoDB在這方面做功能對比,有點類似於比較蘋果和桔子。
Hazelcast和MongoDB可以結合起來協同工作,而不是相互競爭。Hazelcast支援使用MongoDB作為其後端的資料存放區。把Hazelcast的資料對應到MongoDB是很容易的,無論是資料直接寫還是延後寫都支援。
下面我們回顧一下Hazelcast和MongoDB的特性,看看他們怎樣相互配合工作。
二、特徵1、簡單性
Hazelcast和MongoDB這兩種技術運行都很簡單,我們可以讓MongoDB在幾分鐘內實現完全啟動。比如,在Mac OS X系統上,可以使用brew安裝MongoDB。
brew mongo install
Hazelcast的啟動同樣簡單。
2、對Java開發人員的優勢
Hazelcast和MongoDB對於開發Java應用程式來說,是非常適合的。對於Hazelcast來說,可以在叢集中直接使用Java對象,無需擔憂資料轉送層的問題,這樣開發工作就簡化了很多。而使用MongoDB就既需要使用MongoDB的資料結構,又需要寫和配置資料轉送層。
BSON庫完全支援BSON資料格式、資料存放區格式和網路傳輸層格式,MongoDB使用BSON作為儲存的“文檔”。BSON是二進位JSON的簡稱,是JSON資料序列化的二進位編碼。
MongoDB官網上有Java驅動包,而且此驅動包是一個Java對象文檔映射架構,可以把MongoDB的文檔與Java對象進行雙向映射。
就部署和整合Java應用而言,Hazelcast可以給應用帶來低延遲的資料訪問特性(通過各種機制),尤其是Hazelcast用戶端的就近緩衝和Hazelcast成員的嵌入式部署。而對於MongodB,網路延遲是存在的,因為它沒有本地記憶體緩衝。
3、分散式運算
Hazelcast的分散式運算架構極其強大,它允許任意商務邏輯執行位置引用,並支援跨叢集的分布式擴充。MongoDB支援單線程的MapReduce架構,但不支援任意的使用者代碼執行。
Hazelcast在分散式運算方面還有很多MongoDB不具備的功能特性,比如分布式並發工具:鎖、訊號量、隊列等,可以把任務協調分布到多個節點並行工作,而這些在本地是很難實現的。我知道很多人使用MongoDB作為他們自己的訊息代理器的實現,但是很難想象,僅使用MongoDB如何?實際的並行。
4、持久化
Hazelcast主要是解決訪問分布式資料和進行分散式運算時保持低延遲。預設情況下,Hazelcast不涉及磁碟或其它持久化的儲存。Hazelcast不是資料庫。而MongoDB是一個真正的持久化資料庫(當然,MongoDB的持久化也有一點問題,因為它的寫操作是寫記憶體,不是同步寫入磁碟的。)
我們來看看把Hazelcast的資料持久化到MongoDB所帶來的好處吧:
1)IMap和MapStore
Hazelcast的通讀/通寫功能是兩個介面:MapLoader和MapStore。如果只需從資料庫讀取資料,那麼開發人員只需實現MapLoader介面。
MapLoader介面
public interface MapLoader<K, V> { V load(K key); (1) Map<K, V> loadAll(Collection<K> keys); (2) Iterable<K> loadAllKeys(); (3)}
- 1)方法一是擷取給定鍵名的值。如果分布式的Map中未包含給定鍵名的值,那麼Hazelcast將調用load(key)方法的實現來擷取這個值。
- 2)方法二是擷取鍵名集合對應的所有索引值。這是一個批讀取操作,是針對多個讀取給定鍵名的值的最佳化。
- 3)方法三是擷取儲存區的所有鍵名。
MapStore介面繼承了MapLoader介面,並允許儲存IMap條目到資料庫。
MapStore介面
public interface MapStore<K, V> extends MapLoader<K, V> { void store(K key, V value); (1) void storeAll(Map<K, V> map); (2) void delete(K key); (3) void deleteAll(Collection<K> keys); (4)}
- 1)儲存索引值對
- 2)儲存多個條目。此方法的實現可以最佳化多個儲存索引值對的操作
- 3)刪除給定鍵名的條目
- 4)刪除給定鍵名集合的多個條目
要想對MapLoader和MapStore介面瞭解的更多,查看文檔: http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html#map-persistence
要與MongoDB互動,使用mongo-java-driver驅動包。
Maven依賴配置如下:
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>${mongo-java-driver.version}</version></dependency>MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoUrl)); (1)MongoCollection collection = mongoClient.getDatabase(dbName).getCollection(collectionName); (2)final Document document = (Document) collection.find(eq("_id", key)).first(); (3)collection.insertOne(document); (3)
- 1)使用給定URI(比如mongodb://localhost:27017)建立到MongoDB執行個體的串連
- 2)MongoClient類提供了串連MongoDB執行個體、訪問資料庫、訪問集合、訪問文檔的方法
- 3)MongoCollection類允許對集合中的文檔進行增刪改查
總結
MongoDB結合Hazelcast,可以提供低延遲訪問分布式、無模式的資料的解決方案。如果你在尋求NoSQL資料存放區解決方案,MongoDB是很適合的。Hazelcast的fenbushii資料結構和分散式運算能力,是MongoDB所不具備的。
更多MongoDB相關教程見以下內容:
CentOS 編譯安裝 MongoDB與mongoDB的php擴充
CentOS 6 使用 yum 安裝MongoDB及伺服器端配置
Ubuntu 13.04下安裝MongoDB2.4.3
MongoDB入門必讀(概念與實戰並重)
Ubunu 14.04下MongoDB的安裝指南
《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios監控MongoDB分區叢集服務實戰
基於CentOS 6.5作業系統搭建MongoDB服務
MongoDB 的詳細介紹:請點這裡
MongoDB 的:請點這裡
本文永久更新連結地址: