Hazelcast介紹與使用


Hazelcast 是一個開源的可嵌入式數據網格(社區版免費,企業版收費)。你可以把它看做是內存數據庫,不過它與 Redis 等內存數據庫又有些不同。項目地址:http://hazelcast.org/

Hazelcast 使得 Java 程序員更容易開發分布式計算系統,提供了很多 Java 接口的分布式實現,如:Map, Queue, ExecutorService, Lock, 以及 JCache。它以一個 JAR 包的形式提供服務,只依賴於 Java,並且提供 Java, C/C++, .NET 以及 REST 客戶端,因此十分容易使用。

  1 import com.hazelcast.config.Config;
  2 import com.hazelcast.core.Hazelcast;
  3 import com.hazelcast.core.HazelcastInstance;
  4 
  5 import java.util.concurrent.ConcurrentMap;
  6 
  7 public class DistributedMap {
  8     public static void main(String[] args) {
  9         Config config = new Config();
 10         HazelcastInstance h = Hazelcast.newHazelcastInstance(config);
 11         ConcurrentMap<String, String> map = h.getMap("my-distributed-map");
 12         map.put("key", "value");
 13         map.get("key");
 14 
 15         //Concurrent Map methods
 16         map.putIfAbsent("somekey", "somevalue");
 17         map.replace("key", "value", "newvalue");
 18     }
 19 }
 20 

如何存儲數據

Hazelcast 服務之間是端對端的,沒有主從之分,因此也不存在單點故障。集群中所有的節點都存儲等量的數據以及進行等量的計算。

Hazelcast 缺省情況下把數據分為 271 個區。這個值可配置於系統屬性 hazelcast.partition.count。 對於一個給定的鍵,在經過序列號、哈希並對分區總數取模之后能得到此鍵對應的分區號。所有的分區等量的分布與集群中所有的節點中,每個分區對應的備份也同樣分布在集群中。

下例是擁有2個節點的 Hazelcast 集群:

2個節點

黑色字體表示分區,藍色字體表示備份。節點1存儲了1到135分區,這些分區同時備份在節點2中。節點2存儲了136到271分區,並備份在節點1中。

此時如果添加2個節點到集群中,Hazelcast 一個一個的移動分區和備份到新的節點,使得集群數據分布平衡。

4個節點

注意實際中分區並不是有順序的分布,而是隨機分布,上面的示例只是為了方便理解。重要的是理解 Hazelcast 平均分布分區以及備份。

Hazelcast 使用哈希算法進行數據分區。對於一個給定的鍵(如Map)或者對象名稱(如topic和list):

  • 序列化此鍵或對象名稱,得到一個byte數組。
  • 對byte數組進行哈希。 
  • 取模后的值即為分區號。

每個節點維護一個分區表,存儲着分區號與節點之間的對應關系。這樣每個節點都知道如何獲取數據。

重分區

集群中最老的節點(或者說最先啟動)負責定時發送分區表到其他節點。這樣如果有節點加入或者離開集群,所有的節點也能更新分區表。

注意 注意: 如果最老的節點掛了,次老節點會接手這個任務。

這個定時任務時間間隔可配置系統屬性 hazelcast.partition.table.send.interval。 缺省值為15秒。

重分區發生在:

  • 節點加入集群。
  • 節點離開集群。

此時最老節點會更新分區表,分發,接着集群開始移動分區,或者從備份恢復分區。

使用方式

有兩種方式:嵌入式和客戶端服務器。

  • 嵌入式,Hazelcast 服務器的 jar 包被導入宿主應用程序,服務器啟動並存在於各個宿主應用中。優點是可以更低延遲的數據訪問。

嵌入式

  • 客戶端服務器,Hazelcast 客戶端的 jar 包被導入宿主應用程序,服務器 jar 包獨立運行於 JVM 中。優點是更容易調試以及更可靠的性能,最重要的是更好的擴展性。

客戶端服務器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM