Apache Pulsar 綜述

>>? Apache Pulsar Pulsar 是一個(gè)多租戶、高性能的服務(wù)間消息傳輸解決方案,數(shù)據(jù)持久化依賴 Apache BookKeeper 實(shí)現(xiàn),支持多租戶、低延時(shí)、讀寫分離、跨地域復(fù)制、快速擴(kuò)容、靈活容錯(cuò)等特性。

?Apache Pulsar 架構(gòu)

存儲(chǔ)計(jì)算分離

Apache Pulsar是 Pub/Sub 模型的消息系統(tǒng),并且從設(shè)計(jì)上做了存儲(chǔ)和計(jì)算的分離,如圖一所示:


Apache Pulsar主要包括? Broker,? Apache? BookKeeper, Producer, Consumer等組件。

Broker:無(wú)狀態(tài)服務(wù)層,負(fù)責(zé)接收和傳遞消息,集群負(fù)載均衡等工作,Broker 不會(huì)持久化保存元數(shù)據(jù),因此可以快速的上、下線

Apache BookKeeper:有狀態(tài)持久層,由一組名為 Bookie 的存儲(chǔ)節(jié)點(diǎn)組成,持久化地存儲(chǔ)消息

Producer : 數(shù)據(jù)生產(chǎn)者,負(fù)責(zé)發(fā)布數(shù)據(jù)到Topic

Consumer:數(shù)據(jù)消費(fèi)者,負(fù)責(zé)從Topic訂閱數(shù)據(jù)

除了上述的組件之外,Apache Pulsar 還依賴 Zookeeper 作為元數(shù)據(jù)存儲(chǔ)。與傳統(tǒng)的消息系統(tǒng)相比,Apache Pulsar 在架構(gòu)設(shè)計(jì)上采用了計(jì)算與存儲(chǔ)分離的模式,Pub/Sub 相關(guān)的計(jì)算邏輯在 Broker 上完成,數(shù)據(jù)存儲(chǔ)在 Apache BookKeeper 的 Bookie 節(jié)點(diǎn)上。

分片存儲(chǔ)

除了存儲(chǔ)、計(jì)算解耦分離的設(shè)計(jì)之外,Apache Pulsar 在存儲(chǔ)設(shè)計(jì)上也不同于傳統(tǒng) MQ 的分區(qū)數(shù)據(jù)本地存儲(chǔ)的模式,采用的是分片存儲(chǔ)的模式,存儲(chǔ)粒度比分區(qū)更細(xì)化、存儲(chǔ)負(fù)載更均衡。

Apache Pulsar 中的每個(gè) Topic 分區(qū)本質(zhì)上都是存儲(chǔ)在 Apache BookKeeper 中的分布式日志。Topic 可以有多個(gè)分區(qū),分區(qū)數(shù)據(jù)持久化時(shí),分區(qū)是邏輯上的概念,實(shí)際存儲(chǔ)的單位是分片(Segment)的,如圖二,一個(gè)分區(qū) Topic1-Part2 的數(shù)據(jù)由多個(gè) Segment 組成, 每個(gè) Segment 作為 Apache BookKeeper 中的一個(gè) Ledger,均勻分布并存儲(chǔ)在 Apache BookKeeper 群集中的多個(gè)Bookie中, 每個(gè) Segment 具有3個(gè)副本。

可以通過(guò)圖三來(lái)看分區(qū)和分片存儲(chǔ)的區(qū)別。

架構(gòu)設(shè)計(jì)的優(yōu)勢(shì)

Apache Pulsar 計(jì)算與存儲(chǔ)分離的架構(gòu),以及分片存儲(chǔ)的設(shè)計(jì)為 Apache Pulsar 帶來(lái)了相比于傳統(tǒng)基于分區(qū)存儲(chǔ) MQ 的一些優(yōu)勢(shì):

Broke r和 Bookie 相互獨(dú)立,方便實(shí)現(xiàn)獨(dú)立的擴(kuò)展以及獨(dú)立的容錯(cuò)

Broker 無(wú)狀態(tài),便于快速上、下線,更加適合于云原生場(chǎng)景

分區(qū)存儲(chǔ)不受限于單個(gè)節(jié)點(diǎn)存儲(chǔ)容量

分區(qū)數(shù)據(jù)分布均勻

...

可擴(kuò)展性

由于消息服務(wù)層和持久存儲(chǔ)層是分開(kāi)的,因此 Pulsar可以獨(dú)立地?cái)U(kuò)展存儲(chǔ)層和服務(wù)層。

Broker 擴(kuò)展

在 Pulsar 中 Broker 是無(wú)狀態(tài)的,可以通過(guò)增加節(jié)點(diǎn)的方式實(shí)現(xiàn)快速擴(kuò)容。當(dāng)需要支持更多的消費(fèi)者或生產(chǎn)者時(shí),可以簡(jiǎn)單地添加更多的Broker節(jié)點(diǎn)來(lái)滿足業(yè)務(wù)需求。Pulsar 支持自動(dòng)的分區(qū)負(fù)載均衡,在 Broker 節(jié)點(diǎn)的資源使用率達(dá)到閾值時(shí),會(huì)將負(fù)載遷移到負(fù)載較低的Broker節(jié)點(diǎn),這個(gè)過(guò)程中分區(qū)也將在Brokers中做平衡遷移,一些分區(qū)的所有權(quán)會(huì)轉(zhuǎn)移到新的Broker節(jié)點(diǎn)。

Bookie擴(kuò)展

存儲(chǔ)層的擴(kuò)容,通過(guò)增加Bookie節(jié)點(diǎn)來(lái)實(shí)現(xiàn)。通過(guò)資源感知和數(shù)據(jù)放置策略,流量將自動(dòng)切換到新的 Apache Bookie 中,整個(gè)過(guò)程不會(huì)涉及到不必要的數(shù)據(jù)搬遷,即不會(huì)將舊數(shù)據(jù)從現(xiàn)有存儲(chǔ)節(jié)點(diǎn)重新復(fù)制到新存儲(chǔ)節(jié)點(diǎn)。


如圖四所示,起始狀態(tài)有四個(gè)存儲(chǔ)節(jié)點(diǎn),Bookie1, Bookie2, Bookie3, Bookie4,以 Topic1-Part2為例,當(dāng)這個(gè)分區(qū)的最新的存儲(chǔ)分片是 SegmentX 時(shí),對(duì)存儲(chǔ)層擴(kuò)容,添加了新的Bookie節(jié)點(diǎn),BookieX,BookieY,那么當(dāng)存儲(chǔ)分片滾動(dòng)之后,新生成的存儲(chǔ)分片, SegmentX+1,SegmentX+2,會(huì)優(yōu)先選擇新的 Bookie 節(jié)點(diǎn)(BookieX,BookieY)來(lái)保存數(shù)據(jù)。

容錯(cuò)

得益于計(jì)算與存儲(chǔ)分離以及分片存儲(chǔ)的設(shè)計(jì),Pulsar 可以實(shí)現(xiàn)獨(dú)立、靈活的容錯(cuò)。

Broker 容錯(cuò)

當(dāng) Broker 節(jié)點(diǎn)失敗時(shí), 以圖五為例,當(dāng)存儲(chǔ)分片滾動(dòng)到SegmentX時(shí),Broker2 節(jié)點(diǎn)失敗,此時(shí)生產(chǎn)者和消費(fèi)者向其他的Broker發(fā)起請(qǐng)求,這個(gè)過(guò)程會(huì)觸發(fā)分區(qū)的所有權(quán)轉(zhuǎn)移,即將 Broker2 擁有的分區(qū) Topic1-Part2 的所有權(quán)轉(zhuǎn)移到其他的 Broker(Broker3)。在 Apache Pulsar 中數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)服務(wù)分離,所以新 Broker 接管分區(qū)的所有權(quán)時(shí),它不需要復(fù)制 Partiton 的數(shù)據(jù)。新的分區(qū) Owner(Broker3)會(huì)產(chǎn)生一個(gè)新的分片 SegmentX+1,? 如果有新數(shù)據(jù)到來(lái),會(huì)存儲(chǔ)在新的分片Segment x+1上,不會(huì)影響分區(qū)的可用性。


Bookie容錯(cuò)

當(dāng) Bookie 節(jié)點(diǎn)失敗時(shí),如圖六所示, 假設(shè) Bookie 2 上的 Segment 4 損壞。Apache BookKeeper Auditor 會(huì)檢測(cè)到這個(gè)錯(cuò)誤并進(jìn)行復(fù)制修復(fù)。 Apache BookKeeper中的副本修復(fù)是 Segment 級(jí)別的多對(duì)多快速修復(fù),BookKeeper 可以從 Bookie 3 和 Bookie 4 讀取 Segment 4 中的消息,并在 Bookie 1處修復(fù)Segment 4。如果是 Bookie 節(jié)點(diǎn)故障,這個(gè) Bookie 節(jié)點(diǎn)上所有的 Segment 會(huì)按照上述方式復(fù)制到其他的Bookie節(jié)點(diǎn)。所有的副本修復(fù)都在后臺(tái)進(jìn)行,對(duì)Broker和應(yīng)用透明,Broker 會(huì)產(chǎn)生新的Segment來(lái)處理寫入請(qǐng)求,不會(huì)影響分區(qū)的可用性。


無(wú)限制的分區(qū)存儲(chǔ)

分片存儲(chǔ)解決了分區(qū)容量受單節(jié)點(diǎn)存儲(chǔ)空間限制的問(wèn)題,當(dāng)容量不夠時(shí),可以通過(guò)擴(kuò)容 Bookie 節(jié)點(diǎn)的方式支撐更多的分區(qū)數(shù)據(jù),也解決了分區(qū)數(shù)據(jù)傾斜問(wèn)題,數(shù)據(jù)可以均勻的分配在 Bookie 節(jié)點(diǎn)上。

Broker 和 Bookie 靈活的容錯(cuò)以及無(wú)縫的擴(kuò)容能力讓 Apache Pulsar 具備非常高的可用性。

Pulsar 特性

基于上述的設(shè)計(jì)特點(diǎn),Pulsar 提供了很多特性,以下做簡(jiǎn)要的介紹。

讀寫分離

Pulsar另外一個(gè)有吸引力的特性是提供了讀寫分離的能力,讀寫分離保證了在有大量滯后消費(fèi)(磁盤IO會(huì)增加)時(shí),不會(huì)影響服務(wù)的正常運(yùn)行,尤其是不會(huì)影響到數(shù)據(jù)的寫入。

讀寫分離的能力由 Apache BookKeeper 提供,簡(jiǎn)單說(shuō)一下 Bookie 存儲(chǔ)涉及到的概念:

Journals:Journal 文件包含了 BookKeeper事務(wù)日志,在 Ledger 更新之前,Journal 保證描述更新的事務(wù)寫入到 Non-volatile 的存儲(chǔ)介質(zhì)上

Entry logs:Entry 日志文件管理寫入的 Entry,來(lái)自不同 ledger 的 entry 會(huì)被聚合然后順序?qū)懭?/p>

Index files:每個(gè) Ledger都有一個(gè)對(duì)應(yīng)的索引文件,記錄數(shù)據(jù)在 Entry 日志文件中的 Offset 信息

Entry 的讀寫入過(guò)程如圖七所示,數(shù)據(jù)的寫入流程:

數(shù)據(jù)首先會(huì)寫入? Journal,寫入? Journal 的數(shù)據(jù)會(huì)實(shí)時(shí)落到磁盤

然后,數(shù)據(jù)寫入到 Memtable ,Memtable 是讀寫緩存

寫入 Memtable 之后,對(duì)寫入請(qǐng)求進(jìn)行響應(yīng)

Memtable 寫滿之后,會(huì) Flush到 Entry Logger 和 Index cache,Entry Logger 中保存了數(shù)據(jù),Index cache保存了數(shù)據(jù)的索引信息,然后由后臺(tái)線程將 Entry Logger 和 Index cache 數(shù)據(jù)落到磁盤。

數(shù)據(jù)的讀取流程:

如果是 Tailing read 請(qǐng)求,直接從 Memtable 中讀取 Entry

如果是 Catch-up read(滯后消費(fèi))請(qǐng)求,先讀取 Index信息,然后索引從 Entry Logger 文件讀取 Entry


一般在進(jìn)行Bookie的配置時(shí),會(huì)將 Journal和Ledger存儲(chǔ)磁盤進(jìn)行隔離,減少Ledger對(duì)于Journal寫入的影響,并且推薦Journal使用性能較好的SSD磁盤,讀寫分離主要體現(xiàn)在:

寫入 Entry 時(shí),Journal 中的數(shù)據(jù)需要實(shí)時(shí)寫到磁盤,Ledger的數(shù)據(jù)不需要實(shí)時(shí)落盤,通過(guò)后臺(tái)線程批量落盤,因此寫入的性能主要受到 Journal 磁盤的影響

讀取 Entry 時(shí),首先從 Memtable 讀取,命中則返回;如果不命中,再?gòu)?Ledger 磁盤中讀取,所以對(duì)于Catch-up read 的場(chǎng)景,讀取數(shù)據(jù)會(huì)影響 Ledger 磁盤的 IO,對(duì) Journal 磁盤沒(méi)有影響,也就不會(huì)影響到數(shù)據(jù)的寫入

所以,數(shù)據(jù)寫入是主要是受 Journal 磁盤的負(fù)載影響,不會(huì)受Ledger 磁盤的影響。另外,Segment 存儲(chǔ)的多個(gè)副本都可以提供讀取服務(wù),相比于主從副本的設(shè)計(jì),Apache Pulsar 可以提供更好的數(shù)據(jù)讀取能力。

通過(guò)以上分析,Apache Pulsar 使用 Apache BookKeeper 作為數(shù)據(jù)存儲(chǔ),可以帶來(lái)下列的收益:

支持將多個(gè)Ledger的數(shù)據(jù)寫入到同一個(gè) Entry logger 文件,可以避免分區(qū)膨脹帶來(lái)的性能下降問(wèn)題

支持讀寫分離,可以在滯后消費(fèi)場(chǎng)景導(dǎo)致磁盤IO上升時(shí),保證數(shù)據(jù)寫入的不受影響

支持全副本讀取,可以充分利用存儲(chǔ)副本的數(shù)據(jù)讀取能力

多種消費(fèi)模型

Apache Pulsar 提供了多種訂閱方式來(lái)消費(fèi)消息,分為三種類型: 獨(dú)占(Exclusive),故障切換(Failover)或共享(Share)。

Exclusive 獨(dú)占訂閱 :在任何時(shí)間,一個(gè)消費(fèi)者組(訂閱)中有且只有一個(gè)消費(fèi)者來(lái)消費(fèi)Topic中的消息。

Failover 故障切換:多個(gè)消費(fèi)者(Consumer)可以附加到同一訂閱。 但是,一個(gè)訂閱中的所有消費(fèi)者,只會(huì)有一個(gè)消費(fèi)者被選為該訂閱的主消費(fèi)者。 其他消費(fèi)者將被指定為故障轉(zhuǎn)移消費(fèi)者。 當(dāng)主消費(fèi)者斷開(kāi)連接時(shí),分區(qū)將被重新分配給其中一個(gè)故障轉(zhuǎn)移消費(fèi)者,而新分配的消費(fèi)者將成為新的主消費(fèi)者。 發(fā)生這種情況時(shí),所有未確認(rèn)(ack)的消息都將傳遞給新的主消費(fèi)者。

Share 共享訂閱:使用共享訂閱,在同一個(gè)訂閱背后,用戶按照應(yīng)用的需求掛載任意多的消費(fèi)者。 訂閱中的所有消息以循環(huán)分發(fā)形式發(fā)送給訂閱背后的多個(gè)消費(fèi)者,并且一個(gè)消息僅傳遞給一個(gè)消費(fèi)者。 當(dāng)消費(fèi)者斷開(kāi)連接時(shí),所有傳遞給它但是未被確認(rèn)(ack)的消息將被重新分配和組織,以便發(fā)送給該訂閱上剩余的剩余消費(fèi)者。

多種ACK模型

消息確認(rèn)(ACK)的目的就是保證當(dāng)發(fā)生故障后,消費(fèi)者能夠從上一次停止的地方恢復(fù)消費(fèi),保證既不會(huì)丟失消息,也不會(huì)重復(fù)處理已經(jīng)確認(rèn)(ACK)的消息。

在Pulsar中,每個(gè)訂閱中都使用一個(gè)專門的數(shù)據(jù)結(jié)構(gòu)--游標(biāo)(Cursor)來(lái)跟蹤訂閱中的每條消息的確認(rèn)(ACK)狀態(tài)。每當(dāng)消費(fèi)者在分區(qū)上確認(rèn)消息時(shí),游標(biāo)都會(huì)更新。

Pulsar提供兩種消息確認(rèn)方法:

單條確認(rèn)(Individual Ack),單獨(dú)確認(rèn)一條消息。 被確認(rèn)后的消息將不會(huì)被重新傳遞

和累積確認(rèn)(Cumulative Ack),通過(guò)累積確認(rèn),消費(fèi)者只需要確認(rèn)它收到的最后一條消息

圖九說(shuō)明了單條確認(rèn)和累積確認(rèn)的差異(灰色框中的消息被確認(rèn)并且不會(huì)被重新傳遞)。對(duì)于累計(jì)確認(rèn),M12 之前的消息被標(biāo)記為 Acked。對(duì)于單獨(dú)進(jìn)行 ACK,僅確認(rèn)消息 M7 和 M12,? 在消費(fèi)者失敗的情況下,除了 M7 和 M12 之外,其他所有消息將被重新傳送。

圖九 ACK模型?

跨地域復(fù)制

Apache Pulsar 的跨地域復(fù)制機(jī)制(Geo-Replication)提供了一種全連接的異步復(fù)制,可以滿足多個(gè)數(shù)據(jù)中心數(shù)據(jù)同步的使用場(chǎng)景。

圖十 Geo-replication?

如圖十所示,有三個(gè)Apache Pulsar集群,分布于北京、上海和廣州,用戶創(chuàng)建的一個(gè) Topic? T1 設(shè)置了跨越三個(gè)數(shù)據(jù)中心做互備。在三個(gè)數(shù)據(jù)中心中,分別有三個(gè)生產(chǎn)者:P1、P2、P3,它們往主題 T1 中發(fā)布消息;有兩個(gè)消費(fèi)者:C1、C2,訂閱了這個(gè)主題,接收主題中的消息。

當(dāng)消息由本數(shù)據(jù)中心的生產(chǎn)者發(fā)布成功后,會(huì)立即復(fù)制到其他兩個(gè)數(shù)據(jù)中心。消息復(fù)制完成后,消費(fèi)者不僅可以收到本數(shù)據(jù)中心產(chǎn)生的消息,也可以收到從其他數(shù)據(jù)中心復(fù)制過(guò)來(lái)的消息。

除了以上的特性之外,Pulsar還可以支持事務(wù)、SQL查詢、Function等功能,另外Pulsar 支持 protocol handler,比如 KoP(Kafka on Pulsar), 可以原生支持Kafka協(xié)議的數(shù)據(jù),對(duì)于這些特性,我們后在后續(xù)的文章中做介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    極客學(xué)院Wiki閱讀 7,832評(píng)論 0 3
  • 不知不覺(jué)易趣客已經(jīng)在路上走了快一年了,感覺(jué)也該讓更多朋友認(rèn)識(shí)知道易趣客,所以就謝了這篇簡(jiǎn)介,已做創(chuàng)業(yè)記事。 易趣客...
    Physher閱讀 3,821評(píng)論 1 2
  • 雙胎妊娠有家族遺傳傾向,隨母系遺傳。有研究表明,如果孕婦本人是雙胎之一,她生雙胎的機(jī)率為1/58;若孕婦的父親或母...
    鄴水芙蓉hibiscus閱讀 3,914評(píng)論 0 2
  • 晴天,擁抱陽(yáng)光,擁抱你。雨天,想念雨滴,想念你。 我可以喜歡你嗎可以啊 我還可以喜歡你嗎可以,可是你要知道我們不可...
    露薇霜凝閱讀 1,360評(píng)論 1 2

友情鏈接更多精彩內(nèi)容