<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          5000字闡述云原生消息中間件Apache Pulsar的核心特性和設(shè)計(jì)概覽

          共 5715字,需瀏覽 12分鐘

           ·

          2021-07-27 13:54

          點(diǎn)擊上方藍(lán)色字體,選擇“設(shè)為星標(biāo)”

          回復(fù)”面試“獲取更多驚喜

          Apache Pulsar 是 Apache 軟件基金會(huì)頂級(jí)項(xiàng)目,自稱是下一代云原生分布式消息流平臺(tái),集消息、存儲(chǔ)、輕量化函數(shù)式計(jì)算為一體,采用計(jì)算與存儲(chǔ)分離架構(gòu)設(shè)計(jì),支持多租戶、持久化存儲(chǔ)、多機(jī)房跨區(qū)域數(shù)據(jù)復(fù)制,具有強(qiáng)一致性、高吞吐、低延時(shí)及高可擴(kuò)展性等流數(shù)據(jù)存儲(chǔ)特性。
          Pulsar 是一個(gè)用于服務(wù)器到服務(wù)器的消息系統(tǒng),具有多租戶、高性能等優(yōu)勢。Pulsar 最初由 Yahoo 開發(fā),目前由 Apache 軟件基金會(huì)管理。
          目前的Pulsar社區(qū)發(fā)展十分迅速,Pulasr的版本也在不斷的更新迭代,目前大版本的迭代已經(jīng)到了2.8,本文是結(jié)合我個(gè)人在Github和Pulsar社區(qū)中對Pulsar的探索過程中總結(jié)的,云原生的時(shí)代,Pulsar能否大放異彩,值得我們期待。
          本文是一個(gè)引子,后續(xù)我會(huì)對Pulsar進(jìn)行非常詳細(xì)的介紹。

          Pulsar中的核心概念

          這部分你可能會(huì)看到非常多的概念跟Kafka相關(guān),我們一起來看一下:
          • Topic

          是不是很熟悉,在Kafka中也有Topic的概念。
          Topic 是一個(gè)消息目錄或者說存放消息的命名空間,也就是消息發(fā)布(生產(chǎn))的位置。一個(gè) topic 可以有一個(gè)或多個(gè) producer 和/或 consumer。Producer 向 topic 寫入消息,consumer 從 topic 消費(fèi)消息。圖 1 展示了三者之間如何協(xié)同工作。

          • Bookie

          Apache Pulsar 使用 Apache BookKeeper 作為存儲(chǔ)層。Apache BookKeeper 針對實(shí)時(shí)工作負(fù)載進(jìn)行優(yōu)化,是一項(xiàng)可擴(kuò)展、可容錯(cuò)、低延遲的存儲(chǔ)服務(wù)??蛻舳税l(fā)布的消息存儲(chǔ)在 BookKeeper 的服務(wù)器實(shí)例中,即 bookie。
          Ledger 是 BookKeeper 中的基本存儲(chǔ)單元。一系列的 entry 組成一個(gè) ledger,entry 被順序?qū)懭?ledger。
          Journal 文件包含 BookKeeper 中的消息寫入日志。在更新 ledger 前,bookie 確保已經(jīng)將更新的交易(交易日志 entry)寫入非易失存儲(chǔ)。在 bookie 第一次運(yùn)行或舊的 journal 文件大小達(dá)到指定閾值時(shí),會(huì)創(chuàng)建新的 journal 文件。
          Entry log 文件用于管理 BookKeeper 客戶端寫入的 entry。來自不同 ledger 的 entry 會(huì)被依次寫入一個(gè)或多個(gè) entry log 中,而偏移量則作為指針保存在 ledger 緩存中,以進(jìn)行快速查找。
          • Broker

          和Kafka一樣,在 Pulsar 中,broker 是一個(gè)無狀態(tài)服務(wù)器,用于協(xié)助讀寫數(shù)據(jù)。一個(gè) topic 不能同時(shí)被多個(gè) broker 管理,但是 topic 可以存儲(chǔ)在多個(gè) bookie 服務(wù)中。
          • Entry

          Entry是存儲(chǔ)到bookkeeper中的一條記錄
          • Ledger

          可以認(rèn)為ledger是用來存儲(chǔ)Entry的,多個(gè)Entry序列組成一個(gè)ledger
          • MetaData Storage

          元數(shù)據(jù)存儲(chǔ),是用于存儲(chǔ)bookie相關(guān)的元數(shù)據(jù),比如bookie上有哪些ledger,bookkeeper目前使用的是zk存儲(chǔ),所在在部署bookkeeper前,要先有zk集群
          • Journal

          其實(shí)就是bookkeeper的WAL(write ahead log),用于存bookkeeper的事務(wù)日志,journal文件有一個(gè)最大大小,達(dá)到這個(gè)大小后會(huì)新起一個(gè)journal文件
          • Entry log

          存儲(chǔ)entry的文件,我理解ledger是一個(gè)邏輯上的概念,不同ledger中的entry會(huì)先按ledger聚合,然后寫入entry log文件中。同樣,entry log會(huì)有一個(gè)最大大小,達(dá)到最大大小后會(huì)新起一個(gè)新的entry log文件
          • Index file

          ledger的索引文件,ledger中的entry被寫入到了entry log文件中,索引文件用于鄧穎超entry log文件中每一個(gè)ledger做索引,記錄每個(gè)ledger在entry log中的存儲(chǔ)位置以及數(shù)據(jù)在entry log文件中的長度
          • Ledger cache

          用于緩存索引文件的,加快查找效率
          • 數(shù)據(jù)落盤

          內(nèi)存中會(huì)存儲(chǔ)一個(gè)LastLogMark,其中包含txnLogId(journal文件的id)和txnLogPos(journal文件中的位置),entry log文件和index文件都會(huì)先在內(nèi)存中被緩存,當(dāng)內(nèi)存達(dá)到一定值或者離上一次刷盤過期了一段時(shí)間(定時(shí)線程)后,會(huì)觸發(fā)entry log文件和index文件的刷盤,之后再將LastLogMark持久化,當(dāng)lastLogMark被持久化后,表示在lastLogMark之前的entry和索引都已經(jīng)寫到了磁盤上,這個(gè)時(shí)候可以將lastLogMark之前的journal文件清掉,如果LastLogMark在持久化前出現(xiàn)了宕機(jī),可以通過journal文件做恢復(fù),保證了數(shù)據(jù)不丟
          • Data Compaction

          數(shù)據(jù)的合并,有點(diǎn)類似于hbase的compact過程。在bookie上,雖然entry log在刷盤前會(huì)按ledger做聚合,但是因數(shù)數(shù)據(jù)會(huì)不斷的新增,每個(gè)leadger的數(shù)據(jù)會(huì)交差存儲(chǔ)在entry log文件中,而bookie上有一個(gè)用于做垃圾回收的線程,該線程會(huì)將沒有關(guān)聯(lián)任何ledger的entry文件進(jìn)行刪除,以便回收磁盤空間,而compaction的目的則是為了避免entry log中只有少數(shù)的記錄是有關(guān)聯(lián)的ledger的情況,不能讓這樣的entry log文件一直占用磁盤空間,所以垃圾收集線程會(huì)將這樣的entry log中有關(guān)聯(lián)ledger的entry復(fù)制到一個(gè)新的entry log文件中(同時(shí)修改索引),然后將老的entry log文件刪除。與hbase類似,bookkeeper的compaction也分為兩種:
          • Minor compaction

          當(dāng)entry log中有效的entry只占20#以下時(shí)做compaction
          • Major compaction

          當(dāng)entry log中有效的占到80%以下時(shí)就可開始做compaction
          關(guān)鍵特性
          • 跨地域復(fù)制( geo-replication),單個(gè)實(shí)例原生支持多個(gè)集群(跨集群復(fù)制)

          • 極低的發(fā)布延遲和端到端延遲

          • 可無縫擴(kuò)展到超過一百萬個(gè) topic

          • 簡單的客戶端API,支持Java、Go、Python和C++

          • 支持多種topic訂閱模式:獨(dú)占訂閱、共享訂閱、故障轉(zhuǎn)移訂閱、鍵共享(exclusive, shared, failover, key_shared)

          • 通過 Apache BookKeeper 提供的持久化消息存儲(chǔ)機(jī)制保證消息傳遞

          • 由輕量級(jí)的無服務(wù)器(serverless )計(jì)算框架 Pulsar Functions 實(shí)現(xiàn)流原生的數(shù)據(jù)處理

          • 基于 Pulsar Functions 的無服務(wù)器連接器框架 Pulsar IO 使得數(shù)據(jù)更易移入、移出 Apache Pulsar

          • 分層式存儲(chǔ)可在數(shù)據(jù)陳舊時(shí),將數(shù)據(jù)從熱存儲(chǔ)卸載到冷/長期存儲(chǔ)(如S3、GCS)中

          Pulsar的架構(gòu)設(shè)計(jì)

          一個(gè)Pulsar實(shí)例由一個(gè)或多個(gè)Pulsar集群組成。實(shí)例中的集群可以在它們之間復(fù)制數(shù)據(jù)。一個(gè)Pulsar cluster由三部分組成:
          • 一個(gè)或者多個(gè) broker :負(fù)責(zé)處理和負(fù)載均衡 producer 發(fā)出的消息,并將這些消息分派給 consumer;Broker 與 Pulsar 配置存儲(chǔ)交互來處理相應(yīng)的任務(wù),并將消息存儲(chǔ)在 BookKeeper 實(shí)例中(又稱 bookies);Broker 依賴 ZooKeeper 集群處理特定的任務(wù);

          • 一個(gè)BookKeeper:包含一個(gè)或多個(gè) bookie 的 BookKeeper 集群負(fù)責(zé)消息的持久化存儲(chǔ);

          • 一個(gè)ZooKeeper:特定于某個(gè)Pulsar集群的ZooKeeper集群處理Pulsar集群之間的協(xié)調(diào)任務(wù)。

          特別需要注意的是:集群間可以通過跨地域復(fù)制(Geo-Replication)進(jìn)行消息同步。

          ZooKeeper負(fù)責(zé)存儲(chǔ)元數(shù)據(jù),集群配置,協(xié)調(diào):其中l(wèi)ocal zk負(fù)責(zé)Pulsar Cluster內(nèi)部的配置,global zk則用于Pulsar Cluster之間的數(shù)據(jù)復(fù)制。
          Bookie負(fù)責(zé)存儲(chǔ);Broker負(fù)責(zé)負(fù)載均衡和消息的讀取、寫入等;Global replicators負(fù)責(zé)集群間的數(shù)據(jù)復(fù)制。
          Apache BookKeeper
          在這里我們趙中介紹一下Apache BookKeeper。Pulsar用 Apache BookKeeper作為持久化存儲(chǔ),BookKeeper有以下幾個(gè)特性:
          • 利用多個(gè)ledger保存獨(dú)立的日志

          • 為按條目復(fù)制的順序數(shù)據(jù)提供了非常高效的存儲(chǔ)

          • 保證了多系統(tǒng)掛掉時(shí)ledgers的讀取一致性

          • 提供不同的Bookies之間均勻的IO分布的特性

          • 在容量和吞吐量上都可以水平擴(kuò)展。通過向集群添加更多bookie,可以立即增加容量

          • Bookies可以包含數(shù)千個(gè)具備同時(shí)讀寫功能的ledger。使用多個(gè)磁盤設(shè)備,一個(gè)用于日志,另一個(gè)用于一般存儲(chǔ),這樣Bookies可以將讀操作的影響和對于寫操作的延遲分隔開

          • 除消息數(shù)據(jù)外,游標(biāo)(cursors)還永久存儲(chǔ)在BookKeeper中;Cursors是消費(fèi)端訂閱消費(fèi)的位置;BookKeeper讓Pulsar可以用一種可擴(kuò)展的方式存儲(chǔ)消費(fèi)位置

          Ledgers
          Ledger是一個(gè)只追加(append-only)的數(shù)據(jù)結(jié)構(gòu),并且只有一個(gè)寫入器,這個(gè)寫入器負(fù)責(zé)多個(gè)BookKeeper存儲(chǔ)節(jié)點(diǎn)(就是Bookies)的寫入。Ledger的條目(entries)會(huì)被復(fù)制到多個(gè)bookies。Ledgers具有以下特性:
          • Pulsar Broker可以創(chuàng)建ledeger,添加內(nèi)容到ledger和關(guān)閉ledger。

          • 當(dāng)一個(gè)ledger被關(guān)閉后,除非明確的要寫數(shù)據(jù)或者是因?yàn)閷懭肫鲯斓魧?dǎo)致ledger關(guān)閉,這個(gè)ledger只會(huì)以只讀模式打開。

          • 最后,當(dāng)ledger中的條目不再有用的時(shí)候,整個(gè)legder可以被刪除(ledger分布是跨Bookies的)。

          Pulsar geo-replication
          • 多個(gè)Broker節(jié)點(diǎn)組成一個(gè)Pulsar Cluster;多個(gè)Pulsar Cluster組成一個(gè)Pulsar Instance。

          • Pulsar通過geo-replication支持一個(gè)Instance內(nèi)在不同的集群發(fā)送和消費(fèi)消息。

          下圖說明了 Pulsar 在不同集群之間跨地域復(fù)制的過程:

          在上圖中,每當(dāng)P1,P2和P3生產(chǎn)者將消息分別發(fā)布到Cluster-A,Cluster-B和Cluster-C群集上的T1主題時(shí),這些消息就會(huì)立即在群集之間復(fù)制。復(fù)制消息后,C1和C2使用者可以使用它們各自群集中的消息。沒有g(shù)eo-replication,C1和C2使用者將無法使用P3產(chǎn)生者發(fā)布的消息。
          分層存儲(chǔ)
          通過使用分層存儲(chǔ)(Tiered Storage),在 backlog 中的舊消息可以從 BookKeeper 轉(zhuǎn)移到更廉價(jià)的存儲(chǔ)中,不出其他問題,客戶端將仍然可以訪問 backlog,降低了存儲(chǔ)成本。
          Pulsar 當(dāng)前支持 S3, Google Cloud Storage (GCS) 和文件系統(tǒng)(filesystem)來做長期存儲(chǔ)(long term store)??梢詫?shù)據(jù)卸載(Offloading)到長期存儲(chǔ)中。

          Pulsar的核心設(shè)計(jì)

          • 保證不丟失消息

          我們直接飲用Pulsar官方博客中的總結(jié):Pulsar Broker是無狀態(tài)的,沒有不能丟失的持久化狀態(tài),與存儲(chǔ)層分開。
          Bookeeper集群本身并不執(zhí)行復(fù)制,每個(gè)Bookies只是一個(gè)跟隨者被領(lǐng)導(dǎo)者人知做什么,領(lǐng)導(dǎo)人是Pulsar Broker。每個(gè)Topic都由一個(gè)Pulsar Broker擁有,該Broker提供Topic的所有讀寫操作。Pulsar通過讓領(lǐng)導(dǎo)人(Pulsar Broker)沒有狀態(tài),BookKeeper的fencing特性可以很好的處理腦裂問題。沒有腦裂,沒有分歧,沒有數(shù)據(jù)丟失。
          此外,當(dāng)在Bookie上寫入數(shù)據(jù)時(shí),首先將該消息寫入日志文件,這是一個(gè)預(yù)寫日志(WAL),它可以幫助BookKeeper在發(fā)生故障時(shí)避免數(shù)據(jù)丟失。它與關(guān)系型數(shù)據(jù)庫持久化保證的機(jī)制相同。
          • 強(qiáng)順序性保證

          Pulsar的順序保證只在特定的模式下才能得到保證。BookKeeper容許將磁盤IO做讀寫分離。寫入都按順序?qū)懭肴罩疚募梢源鎯?chǔ)在專用的磁盤上,并且可以批量刷盤以獲得搞得吞吐量。除此之外從寫入操作來看沒有其他的同步磁盤IO操作,數(shù)據(jù)都是寫入到內(nèi)存的緩存區(qū)。
          • 讀寫延遲

          關(guān)于讀寫延遲測試你可以參考官方給出的文檔:
          https://blog.csdn.net/zhaijia03/article/details/111602732 
          這個(gè)文檔包含了 Pulsar 和 Kafka 支持的各持久性級(jí)別,以及在同一持久性級(jí)別下兩者的吞吐量和延遲的對比。


          我們在學(xué)習(xí)Flink的時(shí)候,到底在學(xué)習(xí)什么?

          我們在學(xué)習(xí)Spark的時(shí)候,到底在學(xué)習(xí)什么?

          【面試&個(gè)人成長】2021年過半,社招和校招的經(jīng)驗(yàn)之談

          八千里路云和月 | 從零到大數(shù)據(jù)專家學(xué)習(xí)路徑指南

          大數(shù)據(jù)方向另一個(gè)十年開啟 |《硬剛系列》第一版完結(jié)

          我寫過的關(guān)于成長/面試/職場進(jìn)階的文章


          你好,我是王知無,一個(gè)大數(shù)據(jù)領(lǐng)域的硬核原創(chuàng)作者。

          做過后端架構(gòu)、數(shù)據(jù)中間件、數(shù)據(jù)平臺(tái)&架構(gòu)、算法工程化。

          專注大數(shù)據(jù)領(lǐng)域?qū)崟r(shí)動(dòng)態(tài)&技術(shù)提升&個(gè)人成長&職場進(jìn)階,歡迎關(guān)注。

          瀏覽 48
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99精品一区二 | 欧美黄频| 亚洲无码免费电影 | 插入青春美女视频网站 | 91av成人亚洲 |