日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Hazelcast系列一】Hazelcast 概覽

 liang1234_ 2019-04-22
hazelcast IMDG Logo

聲明

本系列文章為學(xué)習(xí)Hazelcast的筆記,內(nèi)容大部分都為官方文檔翻譯,如果對(duì)Hazelcast感興趣,可移步Hazelcast查看官方原版文檔。

學(xué)習(xí)目的

公司項(xiàng)目服務(wù)化改造后,缺少一種在微服務(wù)多個(gè)實(shí)例間廣播、多播的機(jī)制,為了解決這個(gè)問(wèn)題決定引入Vert.x Event Bus(cluster)來(lái)實(shí)現(xiàn),在學(xué)習(xí)使用Event Bus的過(guò)程中了解到Event Bus的默認(rèn)ClusterManager基于Hazelcast項(xiàng)目,簡(jiǎn)單看了一下感覺(jué)還不錯(cuò),決定整體學(xué)習(xí)一遍擴(kuò)展視野。

1.1 Hazelcast是什么

Hazelcast是基于內(nèi)存的數(shù)據(jù)網(wǎng)格開(kāi)源項(xiàng)目,同時(shí)也是該公司的名稱(chēng)。Hazelcast提供彈性可擴(kuò)展的分布式內(nèi)存計(jì)算,Hazelcast被公認(rèn)是提高應(yīng)用程序性能和擴(kuò)展性最好的方案。Hazelcast通過(guò)開(kāi)放源碼的方式提供以上服務(wù)。更重要的是,Hazelcast通過(guò)提供對(duì)開(kāi)發(fā)者友好的Map、Queue、ExecutorService、Lock和JCache接口使分布式計(jì)算變得更加簡(jiǎn)單。例如,Map接口提供了內(nèi)存中的鍵值存儲(chǔ),這在開(kāi)發(fā)人員友好性和開(kāi)發(fā)人員生產(chǎn)力方面提供了NoSQL的許多優(yōu)點(diǎn)。

除了在內(nèi)存中存儲(chǔ)數(shù)據(jù)外,Hazelcast還提供了一組方便的api來(lái)訪(fǎng)問(wèn)集群中的cpu,以獲得最大的處理速度。輕量化和簡(jiǎn)單易用是Hazelcast的設(shè)計(jì)目標(biāo)。Hazelcast以Jar包的方式發(fā)布,因此除Java語(yǔ)言外Hazelcast沒(méi)有任何依賴(lài)。Hazelcast可以輕松地內(nèi)嵌已有的項(xiàng)目或應(yīng)用中,并提供分布式數(shù)據(jù)結(jié)構(gòu)和分布式計(jì)算工具。

Hazelcast 具有高可擴(kuò)展性和高可用性(100%可用,從不失?。7植际綉?yīng)用程序可以使用Hazelcast進(jìn)行分布式緩存、同步、集群、處理、發(fā)布/訂閱消息等。Hazelcast基于Java實(shí)現(xiàn),并提供C/C ,.NET,REST,Python、Go和Node.js客戶(hù)端。Hazelcast遵守內(nèi)存緩存協(xié)議,可以?xún)?nèi)嵌到Hibernate框架,并且可以和任何現(xiàn)有的數(shù)據(jù)庫(kù)系統(tǒng)一起使用。
Hazelcast的整體架構(gòu)如下:


Hazelcast整體架構(gòu)

Hazelcast的架構(gòu)不對(duì)開(kāi)發(fā)者暴露

如果你正在尋找基于內(nèi)存的、高速的、可彈性擴(kuò)展的、對(duì)開(kāi)發(fā)者友好的NoSQL,Hazelcast是一個(gè)很棒的選擇。

1.2 Hazelcast的特點(diǎn)

  • 簡(jiǎn)單
    Hazelcast基于Java語(yǔ)言編寫(xiě),沒(méi)有任何其他依賴(lài)。Hazelcast基于熟悉的Java util包對(duì)外暴露相同的API和接口。只要將Hazelcast的jar包添加到classpath中,便可以快速使用JVM集群,并開(kāi)始構(gòu)建可擴(kuò)展的應(yīng)用程序。
  • 節(jié)點(diǎn)對(duì)等
    和大多數(shù)NoSQL解決方案不同,Hazelcast集群中的節(jié)點(diǎn)是對(duì)等的,集群中沒(méi)有主備角色之分,因此Hazelcast無(wú)單點(diǎn)故障問(wèn)題。集群內(nèi)所有節(jié)點(diǎn)存儲(chǔ)和計(jì)算同量數(shù)據(jù)??梢园袶azelcast內(nèi)嵌到已有的應(yīng)用程序中或使用客戶(hù)端服務(wù)器模式(應(yīng)用程序作為Hazelcast集群中一個(gè)節(jié)點(diǎn)的客戶(hù)端)。
  • 可擴(kuò)展
    Hazelcast被設(shè)計(jì)為可以擴(kuò)展到成百上千個(gè)節(jié)點(diǎn),簡(jiǎn)單的增加節(jié)點(diǎn),新加入的節(jié)點(diǎn)可以自動(dòng)發(fā)現(xiàn)集群,集群的內(nèi)存存儲(chǔ)能力和計(jì)算能力可以維持線(xiàn)性增加。集群內(nèi)每?jī)蓚€(gè)節(jié)點(diǎn)之間都有一條TCP連接,所有的交互都通過(guò)該TCP連接。
  • 快、快、快
    所有數(shù)據(jù)都存儲(chǔ)在內(nèi)存中,Hazelcast支持快速寫(xiě)和更新操作。

1.3 Hazelcast中的分片

Hazelcast中的分片也稱(chēng)為分區(qū),Hazelcast默認(rèn)271個(gè)分區(qū)。Hazlecast通常也會(huì)對(duì)分區(qū)備份,并將副本分布到集群的不同節(jié)點(diǎn)上,通過(guò)數(shù)據(jù)冗余提高可靠性,這種數(shù)據(jù)的存儲(chǔ)方式和kafka、Redis Cluster類(lèi)似。給定一個(gè)key,在Hazelcast集群中查找key對(duì)應(yīng)數(shù)據(jù)的過(guò)程如下圖所示:


Value查找過(guò)程

1.4 Hazelcast的拓?fù)浣Y(jié)構(gòu)

Hazelcast集群有兩種部署模式:內(nèi)嵌模式,客戶(hù)端/服務(wù)器模式。

  • 內(nèi)嵌模式
    如果您有一個(gè)應(yīng)用程序,其主要關(guān)注點(diǎn)是異步或高性能計(jì)算和執(zhí)行大量任務(wù),在這種應(yīng)用場(chǎng)景使用內(nèi)嵌部署模式比較合適,在內(nèi)嵌部署模式下,Hazelcast集群中的一個(gè)節(jié)點(diǎn)包括:應(yīng)用程序,Hazelcast分區(qū)數(shù)據(jù),Hazelcast服務(wù)三部分。內(nèi)嵌部署模式的優(yōu)勢(shì)是讀取數(shù)據(jù)延遲低。內(nèi)嵌部署模式如下圖所示:


    內(nèi)嵌部署模式
  • 客戶(hù)端/服務(wù)器部署模式
    Hazelcast數(shù)據(jù)和服務(wù)集中在一個(gè)或多個(gè)節(jié)點(diǎn)上,應(yīng)用通過(guò)客戶(hù)端讀寫(xiě)數(shù)據(jù)??梢圆渴鹨粋€(gè)提供服務(wù)的獨(dú)立Hazelcast集群,服務(wù)集群可以獨(dú)立創(chuàng)建,獨(dú)立擴(kuò)展??蛻?hù)端通過(guò)和集群中的節(jié)點(diǎn)交互來(lái)獲取Hazelcast數(shù)據(jù)和服務(wù)。Hazelcast提供Java,.NET、C 、Memcache和REST客戶(hù)端??蛻?hù)端/服務(wù)器部署模式如下圖所示:


    客戶(hù)端/服務(wù)器模式

    客戶(hù)端/服務(wù)器部署模式的優(yōu)點(diǎn)包括:可預(yù)測(cè)性高、可靠的Hazelcast服務(wù)、問(wèn)題定位定界簡(jiǎn)單,更重要的是具備高可擴(kuò)展性。在客戶(hù)端/服務(wù)器模式下,當(dāng)集群需要擴(kuò)展時(shí),只需添加或減少Hazelcast服務(wù)器節(jié)點(diǎn)??蛻?hù)端和服務(wù)器的伸縮可以獨(dú)立進(jìn)行。如果既想擁有低延遲數(shù)據(jù)訪(fǎng)問(wèn)(內(nèi)嵌部署模式),又想充分利用客戶(hù)端/服務(wù)器模式的靈活擴(kuò)展性,需要考慮將客戶(hù)端部署在更靠近緩存的地方,并將客戶(hù)端的熱點(diǎn)數(shù)據(jù)緩存到客戶(hù)端本地緩存中。

1.5 為什么選擇Hazelcast

      1.5.1傳統(tǒng)的數(shù)據(jù)一致性方案

數(shù)據(jù)是軟件系統(tǒng)的核心,在傳統(tǒng)的架構(gòu)中,通常使用關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)并提供數(shù)據(jù)訪(fǎng)問(wèn)服務(wù)。應(yīng)用程序直接和數(shù)據(jù)交互,數(shù)據(jù)庫(kù)在另外的機(jī)器上通常存在一個(gè)備份。為了提高性能,需要對(duì)數(shù)據(jù)庫(kù)調(diào)優(yōu)或購(gòu)買(mǎi)更高性能的服務(wù)器,這需要大量的投資和努力。

架構(gòu)通常的做法是在更加靠近數(shù)據(jù)庫(kù)的地方保存一份數(shù)據(jù)的備份,通常采用外部K-V存儲(chǔ)技術(shù)或二級(jí)緩存來(lái)降低數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)壓力。然而,當(dāng)數(shù)據(jù)的性能達(dá)到極限或應(yīng)用程序更多的請(qǐng)求是寫(xiě)請(qǐng)求時(shí),這種方案對(duì)降低數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)壓力無(wú)能為力,因?yàn)椴还苁荎-V存儲(chǔ)還是二級(jí)多級(jí)緩存方案都只能降低數(shù)據(jù)庫(kù)讀壓力。即便應(yīng)用程序大多數(shù)是讀請(qǐng)求,上述方案也有很多問(wèn)題:當(dāng)數(shù)據(jù)變化后,對(duì)緩存的影響是什么,緩存如何處理數(shù)據(jù)變化(目前公司的項(xiàng)目也在考慮方案解決整個(gè)問(wèn)題),在這種條件下緩存存活時(shí)間(TTL)和直寫(xiě)緩存(Write-through )的概念誕生了。

考慮TTL的情況,如果訪(fǎng)問(wèn)的頻率比TTL更低(TTL=30s,每次請(qǐng)求間隔35S),則每次訪(fǎng)問(wèn)的數(shù)據(jù)都不在緩存中,都需要從數(shù)據(jù)庫(kù)讀取數(shù)據(jù),緩存每次都被穿透。另一方面,考慮直寫(xiě)緩存場(chǎng)景,如果集群中緩存的數(shù)據(jù)有多份,同樣會(huì)面臨數(shù)據(jù)一致性問(wèn)題。數(shù)據(jù)一致問(wèn)題可以通過(guò)節(jié)點(diǎn)間的互相通信解決,當(dāng)一個(gè)數(shù)據(jù)不可用時(shí),該消息可以在集群內(nèi)的節(jié)點(diǎn)之間傳播。

基于TTL和直寫(xiě)緩存可以設(shè)計(jì)一個(gè)理想的緩存模型,在該領(lǐng)域已經(jīng)有緩存服務(wù)器和內(nèi)存數(shù)據(jù)庫(kù)等。然而,這些解決方案都是具有由其他技術(shù)提供的分布式機(jī)制的獨(dú)立的單機(jī)實(shí)例(本質(zhì)不是分布式集群,只是通過(guò)其他技術(shù)附加了集群特性)?;氐絾?wèn)題的起點(diǎn),如果產(chǎn)品是單節(jié)點(diǎn),或者發(fā)行版沒(méi)有提供一致性,總有一天會(huì)遇到容量問(wèn)題。

      1.5.2Hazelcast的一致性解決方案

圍繞分布式思想設(shè)計(jì)的Hazelcast提供一種全新訪(fǎng)問(wèn)處理數(shù)據(jù)的方法。為了提高靈活性和性能,Hazelcast在集群周?chē)蚕頂?shù)據(jù)。Hazelcast基于內(nèi)存的數(shù)據(jù)網(wǎng)格為分布式數(shù)據(jù)提供集群和高可擴(kuò)展性。

集群無(wú)主節(jié)點(diǎn)是Hazelcast的一個(gè)主要特性,從功能上來(lái)講,集群內(nèi)每個(gè)節(jié)點(diǎn)都被配置為對(duì)等。第一個(gè)加入集群的節(jié)點(diǎn)負(fù)責(zé)管理集群內(nèi)其他所有節(jié)點(diǎn),例如數(shù)據(jù)自動(dòng)平衡、分區(qū)表更新廣播。如果第一個(gè)節(jié)點(diǎn)下線(xiàn),第二個(gè)加入集群的節(jié)點(diǎn)負(fù)責(zé)管理集群其他節(jié)點(diǎn)。第一個(gè)節(jié)點(diǎn)故障切換方式如下圖所示:


集群自治

數(shù)據(jù)完全基于內(nèi)存存儲(chǔ)、訪(fǎng)問(wèn)速度快是Hazelcast的另外一個(gè)特點(diǎn)。由于Hazelcast將數(shù)據(jù)的副本分布到集群中的其他節(jié)點(diǎn)上,所以在故障條件下(節(jié)點(diǎn)宕機(jī))也不會(huì)有數(shù)據(jù)丟失。Hazelcast提供很多分布式數(shù)據(jù)結(jié)構(gòu)和分布式計(jì)算工具,增強(qiáng)分布式集群內(nèi)存的訪(fǎng)問(wèn)并通過(guò)CPU最大化分布式計(jì)算的速度。

      1.5.3Hazelcast的優(yōu)勢(shì)

  • 開(kāi)源。
  • 基于Jar發(fā)布,無(wú)需安裝軟件。
  • 不對(duì)用戶(hù)暴露Hazelcast的架構(gòu)。
  • 提供開(kāi)箱即用的分布式數(shù)據(jù)結(jié)構(gòu)。
  • 無(wú)單點(diǎn)故障。
  • 支持動(dòng)態(tài)彈性擴(kuò)展。
  • 數(shù)據(jù)備份,節(jié)點(diǎn)故障數(shù)據(jù)無(wú)丟失。
  • 集群內(nèi)節(jié)點(diǎn)彼此感知。
  • 使用SPI可以構(gòu)建自己的分布式數(shù)據(jù)結(jié)構(gòu)。
  • 擁有一個(gè)活躍的開(kāi)源社區(qū)。

1.6 數(shù)據(jù)分區(qū)

Hazelcast中的分片也叫做分區(qū),分區(qū)是一個(gè)內(nèi)存段,分區(qū)中存儲(chǔ)數(shù)百或數(shù)千數(shù)據(jù)實(shí)體,分區(qū)的存儲(chǔ)容量取決于節(jié)點(diǎn)自身的存儲(chǔ)能力。

Hazelcast默認(rèn)提供271個(gè)分區(qū),類(lèi)似Redis擁有16384個(gè)槽位。當(dāng)啟動(dòng)只有一個(gè)節(jié)點(diǎn)的Hazelcast集群時(shí),節(jié)點(diǎn)擁有全部271個(gè)分區(qū)。Hazelcast集群只有一個(gè)節(jié)點(diǎn)的條件下的分區(qū)分布如下圖所示:


單節(jié)點(diǎn)分區(qū)分布

Hazelcast集群新增加一個(gè)節(jié)點(diǎn),或啟動(dòng)一個(gè)包含兩個(gè)節(jié)點(diǎn)的Hazelcast集群,分區(qū)的分布情況如下圖所示:


兩節(jié)點(diǎn)分區(qū)分布

黑色字體表示的分區(qū)為主分區(qū),藍(lán)色字體表示主分區(qū)的副本。

不斷加入新的節(jié)點(diǎn),Hazelcast會(huì)一個(gè)一個(gè)的把主分區(qū)和主分區(qū)副本遷移到新加入的節(jié)點(diǎn)上,保證主備分區(qū)的一致性和冗余性。當(dāng)集群有四個(gè)節(jié)點(diǎn)時(shí), 集群分區(qū)的一種可能方案如下:


四節(jié)點(diǎn)集群分區(qū)分布

Hazelcast將分區(qū)均勻的分布到集群的各個(gè)節(jié)點(diǎn),Hazelcast自動(dòng)創(chuàng)建分區(qū)的副本,并將副本分布到各個(gè)節(jié)點(diǎn)來(lái)提供可靠性。以上圖片展示的Hazelcast分區(qū)僅僅是為了方便和清晰的描述Hazelcast分區(qū)機(jī)制。通常來(lái)說(shuō)分區(qū)的分布不是有序的,Hazelcast使用一種隨機(jī)的方式分布各個(gè)分區(qū)。這里重點(diǎn)說(shuō)明Hazelcast均勻的分布分區(qū)和分區(qū)副本。Hazelcast 3.6版本引入輕量化節(jié)點(diǎn)(存儲(chǔ)輕量化節(jié)點(diǎn)),輕量化節(jié)點(diǎn)是一種新的節(jié)點(diǎn)類(lèi)型,輕量化節(jié)點(diǎn)不持有任何分區(qū)數(shù)據(jù)。輕量化節(jié)點(diǎn)主要用于計(jì)算型任務(wù)和監(jiān)聽(tīng)器注冊(cè),盡管輕量化節(jié)點(diǎn)不保存分區(qū)數(shù)據(jù),但是輕量化節(jié)點(diǎn)可以訪(fǎng)問(wèn)集群中其他節(jié)點(diǎn)所持有的分區(qū)數(shù)據(jù)。

      1.6.1 數(shù)據(jù)如何被分區(qū)

Hazelcast使用一種哈希算法將數(shù)據(jù)分布到特定分區(qū)。給定一個(gè)key,分區(qū)計(jì)算過(guò)程如下:

  • 將key序列化為byte數(shù)組。
  • 計(jì)算byte數(shù)組的哈希值。
  • 哈希值與分區(qū)數(shù)求余,得到分區(qū)ID(注意不是節(jié)點(diǎn)數(shù))。

同一個(gè)key的分區(qū)ID必須保持一致。

      1.6.2 分區(qū)表

啟動(dòng)集群內(nèi)的一個(gè)節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)會(huì)自動(dòng)創(chuàng)建一個(gè)分區(qū)表。分區(qū)表存儲(chǔ)分區(qū)ID和集群內(nèi)其他的節(jié)點(diǎn)信息。分區(qū)表的主要目的是讓集群內(nèi)的所有節(jié)點(diǎn)(包括輕量節(jié)點(diǎn))了解分區(qū)信息,確保每個(gè)節(jié)點(diǎn)都知道數(shù)據(jù)存儲(chǔ)在哪個(gè)分區(qū),哪個(gè)節(jié)點(diǎn)上。最早加入集群的節(jié)點(diǎn)周期性的向集群內(nèi)其他節(jié)點(diǎn)發(fā)送分區(qū)表。通過(guò)這種方式,當(dāng)分區(qū)關(guān)系發(fā)生變化時(shí),集群內(nèi)的所有節(jié)點(diǎn)都可以感知該變化。當(dāng)一個(gè)節(jié)點(diǎn)加入或離開(kāi)集群時(shí),分區(qū)關(guān)系就會(huì)發(fā)生變化。
當(dāng)集群內(nèi)最早加入的節(jié)點(diǎn)故障時(shí),剩余節(jié)點(diǎn)中最早加入集群的節(jié)點(diǎn)負(fù)責(zé)周期性的向其他節(jié)點(diǎn)發(fā)送分區(qū)表
發(fā)送分區(qū)表的周期默認(rèn)是15S,如果想修改周期,可以通過(guò)設(shè)置環(huán)境變量hazelcast.partition.table.send.interval來(lái)進(jìn)行修改。

      1.6.3 重分區(qū)

重分區(qū)是Hazelcast重新分配分區(qū)關(guān)系的過(guò)程,以下兩種情況會(huì)觸發(fā)Hazelcast執(zhí)行重分區(qū)動(dòng)作。

  • 一個(gè)節(jié)點(diǎn)加入集群.
  • 一個(gè)節(jié)點(diǎn)離開(kāi)集群.
    在這種情況下,最早加入集群的節(jié)點(diǎn)會(huì)更新分區(qū)關(guān)系表,并將更新后的分區(qū)表發(fā)送給集群內(nèi)其他節(jié)點(diǎn)。輕量節(jié)點(diǎn)加入集群不會(huì)觸發(fā)重分區(qū)動(dòng)作,因?yàn)檩p量節(jié)點(diǎn)主要執(zhí)行計(jì)算任務(wù),本身不保存任何分區(qū)數(shù)據(jù)。

1.7 使用場(chǎng)景

  • 共享服務(wù)器配置和服務(wù)器信息,
  • 集群數(shù)據(jù)變更通知,
  • 作為簡(jiǎn)單的內(nèi)存緩存,
  • 作為一個(gè)在特定節(jié)點(diǎn)執(zhí)行特定任務(wù)的調(diào)度器,
  • OSGI框架下不同節(jié)點(diǎn)共享信息.
  • 集群內(nèi)共享數(shù)千個(gè)key,
  • 作為Cassadra的前端.
  • 集群內(nèi)分發(fā)用戶(hù)狀態(tài),不同對(duì)象間傳遞信息,共享系統(tǒng)數(shù)據(jù)結(jié)構(gòu),
  • 多租戶(hù)緩存,每個(gè)租戶(hù)都有自己獨(dú)立的緩存,
  • 共享數(shù)據(jù)集合,
  • 從亞馬遜EC2分發(fā)和收集服務(wù)負(fù)載信息,
  • 作為性能檢測(cè)的實(shí)時(shí)流,
  • Session存儲(chǔ)器
? 著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多