初探HazelCast IMDG內存數據網格-簡介

初探HazelCast IMDG內存數據網格-簡介



一、內存數據網格(In Memory Data Grid)

所謂內存數據網格,是有別於內存關係型數據庫,NoSQL數據庫或關係型數據庫的新型數據庫軟件。
內存數據網格將數據存儲到內存中,並使其分佈到多個服務器上,該方法的目的是更容易獲取數據、改進其可擴展性和更好地進行數據分析。

1.1 IMDG特點

  • 數據是分佈式存儲在多臺服務器上的。數據被集羣裏所有的服務器共享,外界不需要知道數據存放在哪個節點。
  • 所有數據存儲於服務器的內存(RAM)中。數據存儲和讀取, 響應時間更快。
  • 每個節點的數據服務都是活躍的。
  • 用於存儲數據的內存容量可以隨着服務器的動態添加刪除而不斷改變, 隨着集羣服務器數量的增加,自動負載均衡,分擔讀寫壓力。
  • 數據模型是基於對象模型而並非關係模型。
  • 數據結構具有伸縮性,可以自動檢測服務器節點的加入和移除。
  • 遇到網絡或者硬件問題,不需要人工的干預,自動的切換到備份機器上,同時保證數據完整性。

1.2 IMDG架構

IMDG需要克服的兩個核心爲提示:容量限制(RAM精貴)和數據可靠性。通常IMDG通過水平擴展來克服內存容量的瓶頸(沒有什麼性能問題是加一臺服務器解決不了的,一臺不夠那就兩臺!),而可靠性通常依賴複製來保證。
IMDG架構
除了提供各種分佈式數據結構外,IMDG一般會使用堆外內存(off-heap,或稱彈性內存)來降低GC的壓力。

1.3 成熟的產品

  • [Java]Hazelcast
  • [商用]Terracotta Enterprise Suite
  • [Java]VMware Gemfire
  • [Java]Oracle Coherence
  • [Java]Gigaspaces XAP Elastic Caching Edition
  • [商用]IBM eXtreme Scale
  • [商用]JBoss Infinispan
  • [商用]GridGain

二、Hazelcast 簡介

2.1 Hazelcast介紹

  • Hazelcast 是一款開源的分佈式內存數據網格產品;
  • Hazelcast 是由Hazelcast公司開發和維護的開源產品,可以爲基於jvm環境運行的各種應用提供分佈式集羣和分佈式緩存服務。Hazelcast可以嵌入到任何使用Java、C++、.NET開發的產品中(C++、.NET只提供客戶端接入);
  • Hazelcast 提供了 Map、Queue、MultiMap、Set、List、Semaphore、Atomic 等接口的分佈式實現;
  • 提供了基於Topic 實現的消息隊列或訂閱\發佈模式;
  • 提供了分佈式id生成器(IdGenerator);
  • 提供了分佈式事件驅動(Distributed Events);
  • 提供了分佈式計算(Distributed Computing);
  • 提供了分佈式查詢(Distributed Query)。
  • 提供用於一對多關係的分佈式MultiMap。
  • 通過JCA與J2EE容器集成和事務支持。
  • 提供用於安全集羣的Socket層加密。
  • 支持同步和異步持久化。
  • 通過JMX監控和管理集羣。
  • 支持動態HTTP Session集羣。
  • 利用備份實現動態分割。
  • 支持動態故障恢復。
  • 簡單通過jar包集成
  • 運行速度快.
  • 體積小
  • Hazelcast 有開源版本和商用版本。開源版本遵循 Apache License 2.0 開源協議免費使用。

附:
Hazelcast源碼
關於Hazelcast的issues:
githubstackoverflow

2.2體系結構圖

體系結構圖

2.3HazelCast的特點

  • 使用Hazelcast開發比較簡單
    Hazelcast是基於Java寫的,沒有任何其它的依賴。它提供的API跟Java util包很像。對於開發者來說,只需要加入hazelcast.jar,然後就可以快速使用在多個JVM之間的數據共享(分佈式)。

  • 自治集羣(無中心化)
    Hazelcast的節點(文中的節點可以理解爲運行在任意服務器的獨立jvm,下同)之間是對等的(沒有主次之分)。所有的節點存儲的數據都是相等的,在應用中可以很容易的增加一個Hazelcast節點。Hazelcast 沒有任何中心節點,或者說Hazelcast 不需要特別指定一箇中心節點。在運行的過程中,它自己選定集羣中的某個節點作爲中心點來管理所有的節點。

  • 數據按應用分佈式存儲
    Hazelcast 將數據分散的存儲在每個節點中,節點越多越分散。每個節點都有各自的應用服務,而Hazelcast集羣會根據每個應用的數據使用情況分散存儲這些數據,在應用過程中數據會盡量“靠近”應用存放。這些在集羣中的數據共享整個集羣的存儲空間和計算資源。

    在傳統的數據存儲模型中(MySql、MongDB、Redis 等等)數據都是獨立於應用單獨存放,當需要提升數據庫的性能時,需要不斷加固單個數據庫應用的性能。即使是現在大量的數據庫支持集羣模式或讀寫分離,但是基本思路都是某幾個庫支持寫入數據,其他的庫不斷的拷貝更新數據副本。這樣做的壞處一是會產生大量髒讀的問題,二是消耗大量的資源來傳遞數據——從數據源頻繁讀寫數據會耗費額外資源,當數據量增長或創建的主從服務越來越多時,這個消耗呈指數級增長。

  • 抗單點故障
    集羣中的節點是無中心化的,每個節點都有可能隨時退出或隨時進入。因此,在集羣中存儲的數據都會有一個備份(可以配置備份的個數,也可以關閉數據備份)。這樣的方式有點類似於 hadoop,某項數據存放在一個節點時,在其他節點必定有至少一個備份存在。當某個節點退出時,節點上存放的數據會由備份數據替代,而集羣會重新創建新的備份數據。Hazelcast的擴展性非常強,可以很簡單的增加或減少節點。可以自動的監聽節點的增加,並以線性的方式增加存儲空間和能力。節點之間的通信是以TCP的方式建立的。

  • Hazelcast是可備份的
    Hazelcast的數據會在多個節點上進行備份。一旦一個節點失敗了,數據將會從別的節點上進行恢復。

  • Hazelcast頁面元素齊全
    頁面可以看到map,list等數據內容,以及一些容量的儀表圖.可以看到很多有用的數據,包括每個Map的請求次數等.

2.4 使用場景

  • 分佈式緩存
  • 緩存服務器
  • NoSQL數據存儲
  • SpringCache
  • 微服務的結構存儲
  • 存儲臨時數據

2.5 Hazelcast的數據分區

Hazelcast的數據分區叫做間隔(Partitions),Hazelcast 缺省情況下把數據分爲 271 個區。這個值可配置於系統屬性hazelcast.partition.count。對於一個給定的鍵,在經過序列號、哈希並對分區總數取模之後得到此鍵映射的分區號。所有的分區等量的分佈與集羣中所有的節點中,每個分區對應的備份也同樣分佈在集羣中,保證高可用。

數據分區示例

  • 單節點
    僅僅啓動一個節點時,由於沒有其他節點,因此推選該節點爲master節點,默認有271個分區。
    單節點

  • 第二個節點
    啓動第二個節點,第二個節點會加入第一個節點創建的集羣中。第一個節點中的分區會重新分配,均勻分佈在集羣中。且集羣中每個成員的數據分片都有一個副本。
    兩個節點

  • 多個節點
    當加入更多節點的時候,原來節點中的數據分片會重新分佈到新加入的節點上面,保證集羣中數據分片的均勻分佈。且同樣會備份數據。下面是4個節點集羣的數據分片分佈。
    四個節點

  • 分區算法
    Hazelcast數據分片採用哈希算法。當給一個map的key或是一個分佈式對象的名稱,會首先將key或對象名稱進行序列化,轉成byte array的形式,然後將byte array進行哈希,將哈希結果對分區數求模得到分片ID。

  • 分區表
    分區表在第一個節點創建的時候就會生成。分區表是存儲分區和節點的對應關係。每個節點維護一個分區表,存儲着分區號與節點之間的對應關係。第一個啓動的節點會將這個分區表週期性地發送給集羣中的其他節點。這樣,當集羣中新增節點或是刪除節點的時候,集羣中的每個節點都可以拿到最新的分區信息。如果第一個節點(master)失敗了,集羣會選出新的master(第二個啓動的節點),再由新的master將分區表發送給集羣中的節點。發送的時間週期可以設置hazelcast.partition.table.send.interval系統屬性,默認是15s.

2.6 hazelcast拓撲方式

  • 嵌入式拓撲模型
    含有Hazelcast 服務器的jar 包的JVM直接加入Hazelcast羣集。優點是可以更低延遲的數據訪問。
    嵌入式
  • C/S服務器外加客戶端拓撲模型
    Hazelcast 客戶端的 jar 包被導入宿主應用程序,服務器 jar 包獨立運行於 JVM 中。優點是更容易調試以及更可靠的性能,最重要的是更好的擴展性。
    客戶端加入
    在多數情況下,可以採用客戶端外加成員拓撲方法,因爲就羣集機制而言,它提供更大彈性 - 成員 JVM 可被拆卸和重新啓動,不會對整體應用程序產生任何影響,因爲 Hazelcast 客戶端將只需重新連接到羣集的另一個成員。

引文:
1.https://www.theserverside.com/discussions/thread/63425.html
2.https://www.cnblogs.com/xiaomaohai/p/6157664.html
3.https://blog.csdn.net/sprayabc/article/details/8488253
4.https://www.cnblogs.com/seasonsluo/p/hazelcast-intro.html
5.https://blog.csdn.net/wangyangzhizhou/article/details/52511101

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章