如何進(jìn)行LogDevice與ApachePulsar之間的對(duì)比

如何進(jìn)行LogDevice與Apache Pulsar之間的對(duì)比,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

成都創(chuàng)新互聯(lián)于2013年成立,先為鹽邊等服務(wù)建站,鹽邊等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為鹽邊企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

Facebook 已經(jīng)發(fā)布開(kāi)源 LogDevice。考慮到 LogDevice 目標(biāo)用例之間的相似性,自然會(huì)有人問(wèn)到 LogDevice 與 Apache Pulsar 之間是否也有相似之處。本文將對(duì)這一問(wèn)題進(jìn)行解答。對(duì)比 LogDevice 和 Pulsar 并不簡(jiǎn)單,LogDevice 的操作級(jí)別要比 Pulsar 低。LogDevice 與 Twitter 的 DistributedLog 更相似。二者都只關(guān)注日志原語(yǔ),而不關(guān)注 schema 管理、多租戶、光標(biāo)管理等高級(jí)功能。這些高級(jí)功能將留給用戶基于 LogDevice 去實(shí)現(xiàn)。下面將討論 LogDevice 和 Pulsar 中都有的基本元素:分布式日志。

架構(gòu)

LogDevice 向用戶顯示一個(gè)日志原語(yǔ)。寫(xiě)入客戶端將 entry 寫(xiě)入 sequencer 節(jié)點(diǎn)。該節(jié)點(diǎn)將日志序列號(hào)(LSN)分配給所有 entry,然后將 entry 寫(xiě)入已經(jīng)分配給日志的較大節(jié)點(diǎn)集的一個(gè)子集(副本集)。LogDevice 的 sequencer 類(lèi)似于 Pulsar 中的 broker,在 Pulsar 中,由 broker 分配消息 ID 并發(fā)送消息到 Apache BookKeeper 進(jìn)行存儲(chǔ)。

LogDevice 和 Pulsar 在架構(gòu)方面有許多相同之處,比如它們都將計(jì)算與存儲(chǔ)分離。與單片架構(gòu)相比,這種架構(gòu)具有以下優(yōu)勢(shì):

?單個(gè)日志可以無(wú)限增長(zhǎng)?出現(xiàn)節(jié)點(diǎn)故障時(shí),可以進(jìn)行無(wú)縫恢復(fù)?集群擴(kuò)展簡(jiǎn)單?讀寫(xiě)具有獨(dú)立可擴(kuò)展性

比較 Pulsar 和 Kafka:基于分片的架構(gòu)如何提升整體性能、延展性與彈性[2]一文中詳細(xì)說(shuō)明了這種架構(gòu)的優(yōu)勢(shì)。Pulsar 和 LogDevice 都具備這些優(yōu)勢(shì)。

LogDevice 和 Pulsar 讀取數(shù)據(jù)的方式有所不同。在 Pulsar 中,讀客戶端在 broker 上訂閱 topic,并從 broker 上接收消息;而在 LogDevice 中,讀客戶端直接與存儲(chǔ)節(jié)點(diǎn)相連。

像 LogDevice 這樣直接從存儲(chǔ)節(jié)點(diǎn)讀取數(shù)據(jù),允許讀操作有更大程度的扇出。也就是說(shuō),由于讀取器不需要訪問(wèn)同一節(jié)點(diǎn),系統(tǒng)可以在單個(gè) topic 上支持更多讀取器。

但是,在需要保證日志的一致性時(shí),直接從存儲(chǔ)節(jié)點(diǎn)讀取數(shù)據(jù)會(huì)加長(zhǎng)延遲。如果寫(xiě)入器沒(méi)有確認(rèn)寫(xiě)入的 entry,讀取器無(wú)法讀取該 entry。從存儲(chǔ)節(jié)點(diǎn)讀取數(shù)據(jù)時(shí),需要以某種方式通知存儲(chǔ)節(jié)點(diǎn) entry 已經(jīng)被復(fù)制到足夠多的節(jié)點(diǎn)上,并將 ack 發(fā)送到寫(xiě)入器,在此之前 entry 不可讀。

在 Pulsar 中,客戶端通過(guò) broker 進(jìn)行讀寫(xiě)。這種讀寫(xiě)方式在延遲和性能上都有優(yōu)勢(shì)。由于在同一個(gè)節(jié)點(diǎn)上進(jìn)行讀寫(xiě),所以在將 entry ack 發(fā)送到寫(xiě)入器時(shí),該 entry 立即可讀。Pulsar 通過(guò)在 broker 上控制讀寫(xiě),得以支持更復(fù)雜的訂閱模型,如共享訂閱、Failover 訂閱[3]等。

一致性、多副本、Failover

LogDevice 和 Pulsar 采用相似的技術(shù)實(shí)現(xiàn)全局順序廣播協(xié)議(TOAB)[4]。將日志分為不同 epoch,每個(gè)節(jié)點(diǎn)(leader)可以決定該 epoch 中 entry 的序列號(hào),并且相應(yīng)機(jī)制保證不會(huì)寫(xiě)入以前的 epoch。

LogDevice 和 Pulsar 都使用 ZooKeeper 決定 leader。

在 LogDevice 中,leader 也稱(chēng)作 sequencer。每個(gè)日志都有一個(gè) sequencer,每個(gè) sequencer 都被(從 ZookKeeper)分配了一個(gè)“epoch”號(hào)。LSN 由 epoch 和一個(gè)局部單調(diào)遞增組件組成,sequencer 決定每個(gè) entry 的 LSN,并將 epoch 中的 entry 轉(zhuǎn)發(fā)到一組存儲(chǔ)節(jié)點(diǎn)上。當(dāng)足夠多的存儲(chǔ)節(jié)點(diǎn) ack entry 時(shí),sequencer 將 ack 發(fā)送到發(fā)起寫(xiě)請(qǐng)求的客戶端。在 sequencer 出現(xiàn)故障時(shí),就會(huì)有新的 sequencer 獲取新的 epoch,并可以立即服務(wù)于寫(xiě)入操作。在后臺(tái)啟動(dòng)一個(gè)“封閉”前一個(gè) epoch 的操作,則會(huì)禁止從新 epoch 進(jìn)行讀取的操作,直到前一個(gè) epoch 被封?!胺忾]”操作涉及從節(jié)點(diǎn)集向足夠多的存儲(chǔ)節(jié)點(diǎn)通知新 epoch 的存在,因此寫(xiě)入操作就不會(huì)有足夠多的 ack 來(lái)向客戶端 ack 寫(xiě)入操作。

對(duì)于 Pulsar 來(lái)說(shuō),epoch 就是 BookKeeper ledger。每個(gè) topic 都有 BookKeeper ledger 列表,這些列表組成了 topic 的全部日志。當(dāng)一個(gè) Pulsar broker 崩潰時(shí),另一個(gè) broker 會(huì)接管這一 topic,由此保證封閉前一個(gè) broker 中的 ledger,創(chuàng)建自己的 ledger,并將其添加至 topic 的 ledger 列表中。最后三個(gè)操作涉及到了 ZooKeeper。一旦更新了 topic 的 ledger 列表,broker 就可以開(kāi)始為 topic 上的讀寫(xiě)提供支持。所有向 topic 寫(xiě)入的數(shù)據(jù)在被 ack 并且對(duì)讀取器可見(jiàn)之前都會(huì)持久化到 BookKeeper ledger 上,存儲(chǔ)在一組存儲(chǔ)節(jié)點(diǎn)中。

對(duì)于 LogDevice 和 Pulsar(采用 BookKeeper)來(lái)說(shuō),entry 持久化只需要一個(gè) entry 命中一個(gè)節(jié)點(diǎn)子集,因此在有緩慢的或故障的存儲(chǔ)節(jié)點(diǎn)時(shí),可以保持低延遲的寫(xiě)入。

在檢測(cè)到 leader 出現(xiàn)故障時(shí),LogDevice 可以在發(fā)現(xiàn)故障后很快地提供寫(xiě)服務(wù),只需要兩次往返 ZooKeeper 來(lái)選擇一個(gè) sequencer。在 Pulsar 中,再次寫(xiě)入前,需要先恢復(fù)之前的 ledger,恢復(fù)操作包括與一些存儲(chǔ)節(jié)點(diǎn)對(duì)話、向 ZooKeeper 進(jìn)行新的寫(xiě)入等。另外,在 Pulsar 中,可以同時(shí)恢復(fù)讀寫(xiě),而在 LogDevice 中,讀取之前,必須進(jìn)行“封閉”操作,類(lèi)似于 ledger 的恢復(fù)操作。

我們猜測(cè) LogDevice 不允許在上一個(gè) epoch “封閉”之前寫(xiě)入,因其讀操作不協(xié)調(diào),與性能無(wú)關(guān)。不管是否封閉前一個(gè) epoch,檢測(cè)到 sequencer 發(fā)生故障會(huì)占用恢復(fù)時(shí)間。允許寫(xiě)入前的封閉操作需要 sequencer 與讀取器進(jìn)行協(xié)調(diào),這樣收效甚微,但卻會(huì)增加復(fù)雜性。在 Pulsar 中,由于是在 broker 上進(jìn)行讀取,在寫(xiě)入前恢復(fù)之前的 ledger 就很容易。

存儲(chǔ)

LogDevice 存儲(chǔ)節(jié)點(diǎn)將 entry 存儲(chǔ)在 RocksDB 中。Entry 存儲(chǔ)在按時(shí)間順序排列的列族集合中,entry 由日志 ID 和 entry 的 LSN 組合進(jìn)行鍵控。簡(jiǎn)單來(lái)說(shuō),每個(gè)存儲(chǔ)節(jié)點(diǎn)都有許多按時(shí)間順序排列的 RocksDB 實(shí)例,只向最新的 RocksDB 實(shí)例寫(xiě)入。這些 RocksDB 實(shí)例盡量確保只進(jìn)行少量壓縮,以避免寫(xiě)入放大。

Pulsar 存儲(chǔ)節(jié)點(diǎn)(BookKeeper)上有一個(gè)日志、一個(gè) entry 日志和一個(gè)索引。日志有專(zhuān)用磁盤(pán)。當(dāng)向 bookie 寫(xiě)入 entry 時(shí),其實(shí)是在向日志磁盤(pán)寫(xiě)入,并向?qū)懭肫?ack。然后,將 entry 放入一個(gè)暫存區(qū)域,當(dāng)此區(qū)域內(nèi)有足夠多的 entry 時(shí),就通過(guò) ledger ID 和 entry ID 進(jìn)行存儲(chǔ),flush 到 entry 日志。此時(shí),entry 日志中的每條 entry 都已寫(xiě)入索引,索引正是一個(gè) RocksDB 實(shí)例。

在有許多并發(fā)活躍日志時(shí),LogDevice 和 Pulsar 存儲(chǔ)層都可以實(shí)現(xiàn)低延遲寫(xiě)入。將多個(gè)日志的 entry 交叉放在幾個(gè)文件中,可以最小化隨機(jī)寫(xiě)入。這樣對(duì)旋轉(zhuǎn)磁盤(pán)的影響較大,在旋轉(zhuǎn)磁盤(pán)上寫(xiě)入多個(gè)文件意味著磁頭必須物理移動(dòng)多次,但即使在固態(tài)磁盤(pán)上,優(yōu)先順序?qū)懭氡入S機(jī)寫(xiě)入在性能上有更多優(yōu)勢(shì)。

但是,交錯(cuò)寫(xiě)入也意味著要進(jìn)行更多讀取。

日志系統(tǒng)中的讀取通常分為兩類(lèi),追尾讀和追趕讀。對(duì)于追尾讀,LogDevice 和 Pulsar 都不太可能命中磁盤(pán),因?yàn)樗钄?shù)據(jù)在某種程度上仍然應(yīng)該存儲(chǔ)在內(nèi)存緩存中;而追趕讀最終都會(huì)命中磁盤(pán)。吞吐量通常比追趕讀延遲更重要,LogDevice 和 Pulsar 的設(shè)計(jì)都與此相符。

雖然大多數(shù)讀取應(yīng)該是連續(xù)的,但是 LogDevice 需要讀取許多 SST 文件來(lái)進(jìn)行追趕讀。因?yàn)?RocksDB 在將 entry flush 到磁盤(pán)前會(huì)按鍵排序。這樣就會(huì)分不清楚是否在同一磁盤(pán)讀寫(xiě)。如果是,追趕讀可能會(huì)影響系統(tǒng)的寫(xiě)入性能。

RocksDB 允許配置多個(gè)路徑,將舊 SST 文件與新 SST 文件分開(kāi)存儲(chǔ)。

由于 Pulsar 將寫(xiě)入的關(guān)鍵路徑保存在單獨(dú)的磁盤(pán)上,讀取操作完全獨(dú)立。讀取通常也是有序的,因?yàn)?entry 日志中的數(shù)據(jù)在 flush 到磁盤(pán)前按照 ledger 和 entry ID 排序。

LogDevice 盡量避免壓縮,因此會(huì)放大寫(xiě)入。這對(duì)于日志系統(tǒng)說(shuō)得通,因?yàn)椴恍枰x取寫(xiě)入的大部分?jǐn)?shù)據(jù),但會(huì)影響數(shù)據(jù)保留。不能刪除單個(gè)日志,因此系統(tǒng)中所有日志的保存時(shí)間都必須由保留時(shí)間決定。集群內(nèi)的所有日志都不能永久保存,有些甚至只能保存幾個(gè)小時(shí)。

在 Pulsar 中,要從存儲(chǔ)節(jié)點(diǎn)刪除日志,就需要先從索引中刪除。因此,索引會(huì)經(jīng)常壓縮,但是由于 entry 數(shù)據(jù)本身不在索引中,這也影響不大。存儲(chǔ)節(jié)點(diǎn)監(jiān)聽(tīng)索引引用每個(gè) entry 日志的百分比。一旦一個(gè) entry 日志低于某個(gè)閾值,則復(fù)制活躍數(shù)據(jù)到新的“壓縮” entry 日志中,更新索引,并刪除原 entry 日志。

LogDevice 是對(duì)分布式日志空間的有趣補(bǔ)充。Pulsar 不僅是分布式日志系統(tǒng),更是一個(gè)完整的消息平臺(tái),因此不能將 LogDevice 直接與 Pulsar 進(jìn)行比較,但很高興看到 LogDevice 團(tuán)隊(duì)決定采用與 Pulsar 類(lèi)似的架構(gòu)?,F(xiàn)在 LogDevice 已經(jīng)開(kāi)源,十分期待它的使用。

看完上述內(nèi)容,你們掌握如何進(jìn)行LogDevice與Apache Pulsar之間的對(duì)比的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站名稱(chēng):如何進(jìn)行LogDevice與ApachePulsar之間的對(duì)比
標(biāo)題網(wǎng)址:http://muchs.cn/article34/igeope.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、建站公司面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、服務(wù)器托管、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)