Hazelcast與MongoDB整合

來源:互聯網
上載者:User

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 的:請點這裡

本文永久更新連結地址:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.