![]() 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)
如果你正在尋找基于內(nèi)存的、高速的、可彈性擴(kuò)展的、對(duì)開(kāi)發(fā)者友好的NoSQL,Hazelcast是一個(gè)很棒的選擇。 1.2 Hazelcast的特點(diǎn)
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ù)器模式。
1.5 為什么選擇Hazelcast1.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ì)
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ū)分布
不斷加入新的節(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ò)程如下:
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ā)生變化。 1.6.3 重分區(qū)重分區(qū)是Hazelcast重新分配分區(qū)關(guān)系的過(guò)程,以下兩種情況會(huì)觸發(fā)Hazelcast執(zhí)行重分區(qū)動(dòng)作。
1.7 使用場(chǎng)景
? 著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
|
|
來(lái)自: liang1234_ > 《Hazelcast》