乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【Hazelcast系列一】Hazelcast 概覽

       liang1234_ 2019-04-22
      hazelcast IMDG Logo

      聲明

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

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

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

      1.1 Hazelcast是什么

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

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

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


      Hazelcast整體架構(gòu)

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

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

      1.2 Hazelcast的特點(diǎn)

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

      1.3 Hazelcast中的分片

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


      Value查找過程

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

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

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


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


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

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

      1.5 為什么選擇Hazelcast

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

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

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

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

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

            1.5.2Hazelcast的一致性解決方案

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

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


      集群自治

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

            1.5.3Hazelcast的優(yōu)勢

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

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

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

      Hazelcast默認(rèn)提供271個(gè)分區(qū),類似Redis擁有16384個(gè)槽位。當(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),或啟動一個(gè)包含兩個(gè)節(jié)點(diǎn)的Hazelcast集群,分區(qū)的分布情況如下圖所示:


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

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

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

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

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

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

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

            1.6.2 分區(qū)表

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

            1.6.3 重分區(qū)

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

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

      1.7 使用場景

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多