分布式緩存Hazelcast詳解及原理探究

2020-09-23 千鋒IT小助手

一. Hazelcast

1. Hazelcast簡介

Hazelcast 是由Hazelcast公司開發的一款開源的分布式內存級別的緩存資料庫,可以為基於JVM環境運行的各種應用提供分布式集群和分布式緩存服務

利用Hazelcast可以滿足「分布式」、「集群服務」、「網格式內存數據」、「分布式緩存「、「彈性可伸縮服務」等的要求。

2. Hazelcast的應用

Hazelcast提供了對很多 java 接口的分布式實現,如Map, Queue, ExecutorService, Lock以及 JCache。它以一個 JAR 包的形式提供服務,並且提供了 Java, C/C++, .NET 以及 REST 客戶端。

在應用時,可以將Hazelcast的jar包直接嵌入到任何使用Java、C++、.NET開發的產品中,我們只需要在應用中引入一個jar包,進行簡單的配置和編碼就可以實現。

目前Hazelcast已經更新到3.X版本。

3. Hazelcast版本區別

Hazelcast 分為開源版和商用版,開源版本遵循 Apache License 2.0 開源協議可以免費使用,商用版本需要獲取特定的License。兩者之間最大的區別在於:商用版本提供了數據的高密度存儲

我們知道在JVM中,有自己特定的GC機制,無論數據是在堆中還是棧中,只要發現無效引用的數據塊,就有可能被回收。而Hazelcast的分布式數據都存放在JVM的內存中,頻繁的讀寫數據會導致大量的GC開銷。使用商業版的Hazelcast會擁有高密度存儲的特性,大大降低JVM的內存開銷,從而降低GC開銷

3. Hazelcast的特性

3.1 自治集群(無中心化)

Hazelcast 沒有任何中心節點(每個節點都是可以運行在任意伺服器的獨立JVM),在運行的過程中,它自己選定集群中的某個節點作為中心點來管理所有的節點。

3.2 數據按應用分布式存儲

Hazelcast 的數據是分布式存儲的。它會儘量將數據存儲在需要使用該項數據的節點上,以實現數據去中心化的目的。

在傳統的數據存儲模型中(MySql、MongDB、Redis等),數據都是獨立於應用單獨存放的,當需要提升資料庫的性能時,需要不斷加固單個資料庫應用的性能。

即使現在大量的資料庫已經可以支持集群模式或讀寫分離,但是基本思路都是某幾個庫支持寫入數據,其他的庫不斷的拷貝更新數據副本。這樣做的壞處一是會產生大量髒讀的問題,二是會消耗大量的資源來傳遞數據——從數據源頻繁讀寫數據會耗費額外資源,當數據量增長或創建的主從服務越來越多時,這個消耗呈指數級增長。

使用 Hazelcast 可以有效的解決數據中心化問題,它將數據分散的存儲在每個節點中,節點越多越分散。每個節點都有各自的應用服務,而Hazelcast集群會根據每個應用的數據使用情況分散存儲這些數據,在應用過程中數據會儘量「靠近」應用存放。這些在集群中的數據共享整個集群的存儲空間和計算資源。

3.3 抗單點故障

集群中的節點是無中心化的,每個節點都有可能隨時退出或隨時進入。因此,在集群中存儲的數據都會有一個備份(可以配置備份的個數,也可以關閉數據備份)。這樣的方式有點類似於 hadoop,某項數據存放在一個節點時,在其他節點必定有至少一個備份存在。當某個節點退出時,節點上存放的數據會由備份數據替代,而集群會重新創建新的備份數據。

3.4 簡單易用

Hazelcast 的所有功能只需引用一個jar包,除此之外,它不需要依賴任何第三方包。因此可以非常便捷高效的將其嵌入到各種應用伺服器中,而不必擔心帶來額外的問題(jar包衝突、類型衝突等)。它僅僅提供一系列分布式功能,而不需要綁定任何框架來使用,因此適用於任何場景。

3.5 其他特性

Hazelcast 還支持伺服器/客戶端模型,支持腳本管理、能夠和 Docker 快速整合等。

4. Hazelcast功能

  • 提供了分布式id生成器(IdGenerator);
  • 提供了分布式事件驅動(Distributed Events);
  • 提供了分布式計算(Distributed Computing);
  • 提供了分布式查詢(Distributed Query)。
  • 提供java.util.{Queue, Set, List, Map}分布式實現。
  • 提供java.util.concurrency.locks.Lock分布式實現。
  • 提供java.util.concurrent.ExecutorService分布式實現。
  • 提供用於一對多關係的分布式MultiMap。
  • 提供用於發布/訂閱的分布式Topic(主題)。
  • 通過JCA與J2EE容器集成和事務支持。
  • 提供用於安全集群的Socket層加密。
  • 支持同步和異步持久化。
  • 為Hibernate提供二級緩存Provider 。
  • 通過JMX監控和管理集群。
  • 支持動態HTTP Session集群。
  • 利用備份實現動態分割。
  • 支持動態故障恢復。

總的來說在獨立JVM中經常使用的數據結果或模型,Hazelcast 都提供了分布式集群的實現。

5. Hazelcast原理

Hazelcast 提供了 Map、Queue、MultiMap、Set、List、Semaphore、Atomic 等常用接口的分布式實現。
以Map接口為例,當我們通過Hazelcast創建一個Map實例後,我們在節點A調用 Map::put(&34;,&34;) 方法添加數據,然後可以在節點B使用 Map::get(&34;) 獲取到值為&34; 的數據。

6. Hazelcast存儲數據的實現過程

6.1 Hazelcast分區

由於Hazelcast 服務之間是端對端的,沒有主從之分,集群中所有的節點都存儲等量的數據以及進行等量的計算。

Hazelcast 默認情況下把數據存儲在 271 個區上,這個值可以通過系統屬性 hazelcast.partition.count來配置。

6.2 Hazelcast分區存儲原理

對於一個給定的鍵,在經過序列化、哈希並對分區總數取模之後能得到此鍵對應的分區號,所有的分區等量的分布與集群中所有的節點中,每個分區對應的備份也同樣分布在集群中。

也就是說 Hazelcast 會使用哈希算法對數據進行分區,比如對於一個給定的map中的鍵,或者topic和list中的對象名稱,分區存儲的過程如下:

  • 先序列化此鍵或對象名稱,得到一個byte數組;
  • 然後對上面得到的byte數組進行哈希運算;
  • 再進行取模後的值即為分區號;
  • 最後每個節點維護一個分區表,存儲著分區號與節點之間的對應關係,這樣每個節點都知道如何獲取數據。

6.3 Hazelcast集群實現原理

Hazelcast通過分片來存儲和管理所有進入集群的數據,採用分片的方案目標是保證數據可以快速被讀寫、通過冗餘保證數據不會因節點退出而丟失、節點可線性擴展存儲能力。下面將從理論上說明Hazelcast是如何進行分片管理的。

6.3.1 分片

Hazelcast的每個數據分片(shards)被稱為一個分區(Partitions)。分區是一些內存段,根據系統內存容量的不同,每個這樣的內存段都包含了幾百到幾千項數據條目,默認情況下,Hazelcast會把數據劃分為271個分區,並且每個分區都有一個備份副本。當啟動一個集群成員時,這271個分區將會一起被啟動。

下圖展示了集群只有一個節點時的分區情況。

從一個節點的分區情況可以看出,當只啟動一個節點時,所有的271個分區都存放在一個節點中。

然後我們啟動第二個節點,會出現下面這樣的集群分區方式。

其中黑色的字體表示分區,藍色的字體表示備份。節點1存儲了標號為1到135的分區,這些分區會同時備份到節點2中。而節點2則存儲了136到271的分區,並備份到了節點1中。

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

注意:

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

6.4 重分區

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

這個定時任務時間間隔可以通過系統屬性 hazelcast.partition.table.send.interval來配置,預設值為15秒。

重分區會發生在:
  • 節點加入集群;
  • 節點離開集群。

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

注意:

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

7. Hazelcast的使用方式

有兩種方式,嵌入式和客戶端伺服器。

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

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



轉自:知乎一一哥


相關焦點

  • Openfire Hazelcast集群詳解
    【IT168 技術】Hazelcast是一個高度可擴展的數據分發和集群平臺,可用於實現分布式數據存儲、數據緩存。  一、概述  Openfire Hazelcast插件提供了在一個集群上運行多個冗餘Openfire伺服器的支持。
  • 阿里P7聯與京東T6出版:深度解構分布式緩存技術原理,實踐及電商
    在這裡推薦一份數位一線用阿里P7聯手京東T6自己的項目經驗編寫的:深入分布式緩存從原理到實踐,深度解構分布式緩存技術原理及其在電商、社交、廣告等典型場最中的應用在文章開始前先放一份知識點圖譜,整個圖譜以 10 年分布式緩存經驗分享為主,相信有不少乾貨,值得一看
  • 頂級「Redis學習筆記」,緩存雪崩+擊穿+穿透+集群+分布式鎖,NB了
    但我發現,在工作或面試時,大家還是會有這樣那樣的疑問,比如:如何用 Redis 實現分布式鎖?Redis 怎樣處理過期鍵?緩存雪崩、穿透、熱點問題怎麼解決?持久化、集群方案怎麼選擇?如何優雅地給 Redis 做鍵值分析?等等。這裡,分享給你一張 Redis 問題畫像圖,幫你快速查找問題對應的 Redis 主線模塊,進而定位相應的技術點。
  • 頂級「Redis學習筆記」,緩存雪崩+擊穿+穿透+集群+分布式鎖,NB了
    如果你是一位後端工程師,面試時八成會被問到 Redis,特別是那些大型網際網路公司,不僅要求面試者能簡單使用 Redis,還要深入理解其底層實現原理,具備解決常見問題的能力。可以說,熟練使用 Redis 就是後端工程師的必備技能。但我發現,在工作或面試時,大家還是會有這樣那樣的疑問,比如:如何用 Redis 實現分布式鎖?
  • 緩存 | 從本地緩存到分布式緩存
    從本地緩存到分布式緩存本文檔中部分代碼不保證可以運行雖然標題為緩存,但在這裡不僅僅會涉及緩存,還會涉及一些其他提高應用性能的方案。在程序設計中,經常能聽到的就是以時間換空間和以空間換時間。本地緩存:指的是在應用中的緩存組件,其最大的優點是應用和cache是在同一個進程內部,請求緩存非常快速,沒有過多的網絡開銷等,在單應用不需要集群支持或者集群情況下各節點無需互相通知的場景下使用本地緩存較合適;同時,它的缺點也是因為緩存跟應用程式耦合,多個應用程式無法直接的共享緩存,各應用或集群的各節點都需要維護自己的單獨緩存,對內存是一種浪費。
  • 大型網際網路分布式詳解
    緩存分為本地緩存和遠程分布式緩存,本地緩存訪問速度更快但緩存數據量有限,同時存在與應用程式爭用內存的情況。CDN與反向代理的基本原理都是緩存。Java分布式應用技術基礎分布式服務下的關鍵技術:消息隊列架構消息對列通過消息對象分解系統耦合性,不同子系統處理同一個消息分布式服務下的關鍵技術:消息隊列原理分布式服務下的關鍵技術:服務框架架構
  • 美團T9都說太「強」了,以微服務分布式的實戰詳解SpringCloud
    SpringCloud組件方面主要講解服務註冊和服務發現(Eureka) 、服務調用(Ribbon 和OpenFeign)、斷路器(Hystrix 和Resilience4j)、網關(Zuul和Gateway)、配置(Config)、全鏈路追蹤(Sleuth) 、微服務的監控(Admin)等;分布式系統方面主要講解分布式資料庫、分布式緩存、會話和權限以及發號機制等。
  • 分布式數據緩存中的一致性哈希算法
    一致性哈希算法在分布式緩存領域的 MemCached,負載均衡領域的 Nginx 以及各類 RPC 框架中都有廣泛的應用,它主要是為了解決傳統哈希函數添加哈希表槽位數後要將關鍵字重新映射的問題。本文會介紹一致性哈希算法的原理及其實現,並給出其不同哈希函數實現的性能數據對比,探討Redis 集群的數據分片實現等,文末會給出實現的具體 github 地址。
  • 大數據和分布式入門:主流分布式緩存組件
    在大數據處理當中,核心指導思想始終是分布式,基於分布式思想,我們有了Hadoop等開源技術框架,能夠以更低的成本完成企業大數據系統平臺搭建,支持業務進展。今天大數據和分布式入門,我們主要來聊聊主流的大數據分布式緩存組件。
  • 阿里資深架構師整理分享的分布式系統架構:技術棧詳解與進階文檔
    前言資深分布式系統研發工程師、架構師多年工作經驗總結,從原理、應用和實踐3個維度展開從前端到後端,從網絡傳輸到負載均衡,從事務到資料庫,從高並發到高可用,8個維度全面講解分布式系統的技術棧。HTTP加速器,主要通過緩存來實現Web訪問加速。
  • Gitlab Runner的分布式緩存實戰
    zq2599/blog_demos內容:所有原創文章分類和匯總,及配套源碼,涉及Java、docker、Kubernetes、DevOPS等;關於本文本文目標是為K8S環境的Gitlab Runner準備好分布式緩存
  • 華為自爆宇宙級:基於SpringBoot+Cloud微服務分布式架構實戰手冊
    通過學習前半部分的內容,你可以基本搭建Consul集群、多個微服務、微服務間通信、負載均衡、斷路器的分布式基本結構,後半部分的內容主要介紹如何編寫微服務業務代碼,包括Spring Boot、 MySQL、 Redis、 緩存一致性、事務、異步線程池、分布式消息通信、分布式任務調度管理及FastDFS分布式文件管理。
  • Flink Distributed Cache 分布式緩存
    Flink提供了一個分布式緩存,類似於hadoop,可以使用戶在並行函數中很方便的讀取本地文件。此緩存的工作機制如下:程序註冊一個文件或者目錄(本地或者遠程文件系統,例如hdfs或者s3),通過ExecutionEnvironment註冊緩存文件並為它起一個名稱。
  • Java面試清單最全:基礎-分布式-Spring-資料庫-並發-緩存-高級
    小編最近花了一個星期的時間去整理了咱Java崗招聘必備的面試知識點(並給出本人認為比較合理的解析),從基礎-分布式-Spring-資料庫-線程-網絡-JVM-Tomcat-並發-緩存-算法與數據結構-並發-中級-高級等等,每一個都有篩選出很多知識點,大家其實也可根據各知識點在沒有答案的情況下測試自己會是不會,有沒有理解。
  • 手機淘寶緩存怎麼清除 手機淘寶清除緩存流程詳解
    手機淘寶緩存怎麼清除 手機淘寶清除緩存流程詳解時間:2018-04-02 11:00   來源:綠茶軟體園   責任編輯:沫朵 川北在線核心提示:原標題:手機淘寶緩存怎麼清除 手機淘寶清除緩存流程詳解 1. 打開手機淘寶主頁面,在最下邊右下角點擊一下我的淘寶; 2.
  • 阿里P8技術官總結698頁:分布式服務架構 原理+設計+實戰
    、消息隊列、大數據查詢系統、分布式定時任務調度系統、微服務等層面詳細講解如何設計可伸縮、可擴展的框架,並給出在各個領域解決特定問題的方法論和實踐總結。第一章 如何設計一款永不重複的高性能分布式發號器1.1 可選方案及技術選型1.2 分布式系統對發號器的基本需求1.3 架構設計與核心要點
  • 大廠二面:Redis的分布式布隆過濾器是什麼原理?
    布隆過濾器的應用解決緩存穿透的問題一般情況下,先查詢緩存是否有該條數據,緩存中沒有時,再查詢資料庫。當資料庫也不存在該條數據時,每次查詢都要訪問資料庫,這就是緩存穿透。而不能同時滿足13、阿里P7二面:聊聊零拷貝的原理14、秒殺系統的核心點都在這裡,快來取15、你了解如何利用token方式實現分布式Session嗎?16、Mysql索引結構演變,為什麼最終會是那個結構呢?
  • 基於Spring Cloud如何構建分布式系統?
    這篇文章要為大家介紹的文檔,結合實際案例對Spring Cloud微服務系統基礎組件的原理和應用進行了闡述,還結合了微服務講解分布式系統的相關知識第5章 斷路器——Hystrix概述入門實例Hystrix工作原理
  • 騰訊內容首發:分布式核心原理解析+分布式消息中間件實踐筆記
    下面會為大家分享分布式消息中間件實踐筆記+分布式核心原理解析筆記,為了不影響大家的閱讀體驗,免費的獲取方式放在了文末!事務消息分布式核心原理解析筆記分布式協調與同步分布式互斥分布式選舉分布式共識分布式事務分布式鎖
  • redis 介紹以及分布式緩存常見的技術選型方案
    分布式緩存常見的技術選型方案有哪些?分布式緩存的話,使用的比較多的主要是 Memcached 和 Redis。不過,現在基本沒有看過還有項目使用 Memcached 來做緩存,都是直接用 Redis。Memcached 是分布式緩存最開始興起的那會,比較常用的。後來,隨著 Redis 的發展,大家慢慢都轉而使用更加強大的 Redis 了。