自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

互聯(lián)網(wǎng)海量數(shù)據(jù)如何存儲Kafka

大數(shù)據(jù) 存儲
Kafka的數(shù)據(jù)是如何存儲、分片、復(fù)制的?它是如何保證高可用,如何保證數(shù)據(jù)一致性的?那你會發(fā)現(xiàn)它和分布式存儲系統(tǒng),并沒有什么太大的區(qū)別。唯一的區(qū)別就是,它的查詢語言(生產(chǎn)和消費(fèi)消息)和存儲引擎的數(shù)據(jù)結(jié)構(gòu)(Commit Log)比一般的存儲系統(tǒng)要簡單很多。

對于大部分互聯(lián)網(wǎng)公司來說,數(shù)據(jù)量最大的幾類數(shù)據(jù)是:點(diǎn)擊流數(shù)據(jù)、監(jiān)控數(shù)據(jù)和日志數(shù)據(jù)。這里面「點(diǎn)擊流」指的是在 App、小程序和 Web 頁面上的埋點(diǎn)數(shù)據(jù),這些埋點(diǎn)數(shù)據(jù)記錄用戶的行為,比如你打開了哪個頁面,點(diǎn)擊了哪個按鈕,在哪個商品上停留了多久等等這些。

當(dāng)然你不用太擔(dān)心自己的隱私問題,記錄的這些行為數(shù)據(jù)不是為了監(jiān)控用戶,主要目的是為了從統(tǒng)計上分析群體用戶的行為,從而改進(jìn)產(chǎn)品和運(yùn)營。比如,某件商品看的人很多,停留時間很長,最后下單購買的人卻很少,那采銷人員就要考慮是不是這件商品的定價太高了。

除了點(diǎn)擊流數(shù)據(jù)以外,還有監(jiān)控和日志數(shù)據(jù)都是大家常用的。

這類數(shù)據(jù)都是真正海量的數(shù)據(jù),相比于訂單、商品這類業(yè)務(wù)的數(shù)據(jù),數(shù)據(jù)量要多出 2~3 個數(shù)量級。每天產(chǎn)生的數(shù)據(jù)量就可能會超過 TB(1 TB = 1024 GB)級別,經(jīng)過一段時間累積下來,有些數(shù)據(jù)會達(dá)到 PB(1 PB = 1024 TB)級別。

這種量級的數(shù)據(jù),在大數(shù)據(jù)技術(shù)出現(xiàn)之前,是沒法保存和處理的,只能是通過抽樣的方法來湊合著做分析。Hadoop 等大數(shù)據(jù)技術(shù)出現(xiàn)以后,才使得存儲和計算海量數(shù)據(jù)成為可能。那么如果要保存像「點(diǎn)擊流」這樣的海量數(shù)據(jù),應(yīng)該選擇什么樣的存儲系統(tǒng)?

使用 Kafka 存儲海量原始數(shù)據(jù)

早期對于這類海量原始數(shù)據(jù),都傾向于先計算再存儲 。也就是,在接收原始數(shù)據(jù)的服務(wù)中,先進(jìn)行一些數(shù)據(jù)過濾、聚合等初步的計算,將數(shù)據(jù)先收斂一下,再落存儲。這樣可以降低存儲系統(tǒng)的寫入壓力,也能節(jié)省磁盤空間。

這幾年,隨著存儲設(shè)備越來越便宜,并且,數(shù)據(jù)的價值被不斷地重新挖掘,更多的大廠都傾向于 先存儲再計算,直接保存海量的原始數(shù)據(jù),再對數(shù)據(jù)進(jìn)行實(shí)時或者批量計算。這種方案,除了貴以外都是優(yōu)點(diǎn):

  • 不需要二次分發(fā)就可以同時給多個流和批計算任務(wù)提供數(shù)據(jù);
  • 如果計算任務(wù)出錯,可以隨時回滾重新計算;
  • 如果對數(shù)據(jù)有新的分析需求,上線后直接就可以用歷史數(shù)據(jù)計算出結(jié)果,而不用去等新數(shù)據(jù)。

但是,這種方式對保存原始數(shù)據(jù)的存儲系統(tǒng)要求就很高了:既要有足夠大的容量,能水平擴(kuò)容,還要讀寫都足夠快,跟得上數(shù)據(jù)生產(chǎn)的寫入速度,還要給下游計算提供低延遲的讀服務(wù)。什么樣的存儲能滿足這樣的要求呢?這里給出幾種常用的解決方案。

第一種方案是,使用 Kafka 來存儲。Kafka 不是一個消息隊(duì)列么,怎么成了存儲系統(tǒng)了?實(shí)際上,現(xiàn)代的消息隊(duì)列,本質(zhì)上就是分布式的流數(shù)據(jù)存儲系統(tǒng)。 

那么Kafka的數(shù)據(jù)是如何存儲、分片、復(fù)制的?它是如何保證高可用,如何保證數(shù)據(jù)一致性的?那你會發(fā)現(xiàn)它和分布式存儲系統(tǒng),并沒有什么太大的區(qū)別。唯一的區(qū)別就是,它的查詢語言(生產(chǎn)和消費(fèi)消息)和存儲引擎的數(shù)據(jù)結(jié)構(gòu)(Commit Log)比一般的存儲系統(tǒng)要簡單很多。但也正是因?yàn)檫@個原因,使得 Kafka 的讀寫性能遠(yuǎn)遠(yuǎn)好于其他的存儲系統(tǒng)。Kafka 官方給自己的定位也是「分布式流數(shù)據(jù)平臺」,不只是一個 MQ。

Kafka 提供「無限」的消息堆積能力,具有超高的吞吐量,可以滿足我們保存原始數(shù)據(jù)的大部分要求。寫入點(diǎn)擊流數(shù)據(jù)的時候,每個原始數(shù)據(jù)采集服務(wù)作為一個生產(chǎn)者,把數(shù)據(jù)發(fā)給 Kafka 就可以了。下游的計算任務(wù),可以作為消費(fèi)者訂閱消息,也可以按照時間或者位點(diǎn)來讀取數(shù)據(jù)。并且,Kafka 作為事實(shí)標(biāo)準(zhǔn),和大部分大數(shù)據(jù)生態(tài)圈的開源軟件都有非常好的兼容性和集成度,像 Flink、Spark 等大多計算平臺都提供了直接接入 Kafka 的組件。

圖片

Kafka 也支持把數(shù)據(jù)分片,這個在 Kafka 中叫 Partition,每個分片可以分布到不同的存儲節(jié)點(diǎn)上。寫入數(shù)據(jù)的時候,可以均勻地寫到這些分片上,理論上只要分片足夠多,存儲容量就可以是「無限」的。但是,單個分片總要落到某一個節(jié)點(diǎn)上,而單節(jié)點(diǎn)的存儲容量畢竟是有限的,隨著時間推移,單個分片總有寫滿的時候。

即使它支持?jǐn)U容分片數(shù)量,也沒辦法像其他分布式存儲系統(tǒng)那樣,重新分配數(shù)據(jù),把已有分片上的數(shù)據(jù)遷移一部分到新的分片上。所以擴(kuò)容分片也解決不了已有分片寫滿的問題。而 Kafka 又不支持按照時間維度去分片,所以,受制于單節(jié)點(diǎn)的存儲容量,Kafka 實(shí)際能存儲的數(shù)據(jù)容量并不是無限的。

圖片

#Kafka 之外還有哪些解決方案?

如果需要長時間(幾個月 - 幾年)保存的海量數(shù)據(jù),就不適合用 Kafka 存儲。這種情況下,只能退而求其次,使用第二種方案了。

第二種方案是,使用 HDFS 來存儲。使用 HDFS 存儲數(shù)據(jù)也很簡單,就是把原始數(shù)據(jù)寫成一個一個文本文件,保存到 HDFS 中。我們需要按照時間和業(yè)務(wù)屬性來組織目錄結(jié)構(gòu)和文件名,以便于下游計算程序來讀取,比如說:click/20200808/Beijing_0001.csv,代表 2020 年 8 月 8 日,從北京地區(qū)用戶收集到的點(diǎn)擊流數(shù)據(jù),這個是當(dāng)天的第一個文件。

對于保存海量的原始數(shù)據(jù)這個特定的場景來說,HDFS 的吞吐量是遠(yuǎn)不如 Kafka 的。按照平均到每個節(jié)點(diǎn)上計算,Kafka 的吞吐能力很容易達(dá)到每秒鐘大幾百兆,而 HDFS 只能達(dá)到百兆左右。這就意味著,要達(dá)到相同的吞吐能力,使用 HDFS 就要比使用 Kafka,多用幾倍的服務(wù)器數(shù)量。

但 HDFS 也有它的優(yōu)勢,第一個優(yōu)勢就是,它能提供真正無限的存儲容量,如果存儲空間不夠了,水平擴(kuò)容就可以解決。另外一個優(yōu)勢是,HDFS 能提供比 Kafka 更強(qiáng)的數(shù)據(jù)查詢能力。Kafka 只能按照時間或者位點(diǎn)來提取數(shù)據(jù),而 HDFS 配合 Hive 直接就可以支持用 SQL 對數(shù)據(jù)進(jìn)行查詢,雖然說查詢的性能比較差,但查詢能力要比 Kafka 強(qiáng)大太多了。

圖片

以上這兩種方案因?yàn)槎加懈髯缘膬?yōu)勢和不足,在實(shí)際生產(chǎn)中,都有不少的應(yīng)用,你可以根據(jù)業(yè)務(wù)的情況來選擇。那有沒有兼顧這二者優(yōu)勢的方案呢?最好能做到,既有超高的吞吐能力,又能無限擴(kuò)容,同時還能提供更好的查詢能力,有這樣的好事兒么?

目前已經(jīng)有一些的開源項(xiàng)目,都致力于解決這方面的問題。

一類是 分布式流數(shù)據(jù)存儲,比較活躍的項(xiàng)目有 Pravega 和 Pulsar 的存儲引擎 Apache BookKeeper。這些分布式流數(shù)據(jù)存儲系統(tǒng),走的是類似 Kafka 這種流存儲的路線,在高吞吐量的基礎(chǔ)上,提供真正無限的擴(kuò)容能力,更好的查詢能力。

還有一類是 時序數(shù)據(jù)庫(Time Series Databases),比較活躍的項(xiàng)目有 InfluxDB 和 OpenTSDB 等。這些時序數(shù)據(jù)庫,不僅有非常好的讀寫性能,還提供很方便的查詢和聚合數(shù)據(jù)的能力。但是,它們不是什么數(shù)據(jù)都可以存的,它們專注于類似監(jiān)控數(shù)據(jù)這樣,有時間特征并且數(shù)據(jù)內(nèi)容都是數(shù)值的數(shù)據(jù)。如果你有存儲海量監(jiān)控數(shù)據(jù)的需求,可以關(guān)注一下這些項(xiàng)目。

在互聯(lián)網(wǎng)行業(yè),點(diǎn)擊流、監(jiān)控和日志這幾類數(shù)據(jù),是海量數(shù)據(jù)中的海量數(shù)據(jù)。對于這類數(shù)據(jù),一般的處理方式都是 先存儲再計算,計算結(jié)果保存到特定的數(shù)據(jù)庫中,供業(yè)務(wù)系統(tǒng)查詢。

所以,對于海量原始數(shù)據(jù)的存儲系統(tǒng),我們要求的是超高的寫入和讀取性能,和近乎無限的容量,對于數(shù)據(jù)的查詢能力要求不高。生產(chǎn)上,可以選擇 Kafka 或者是 HDFS,Kafka 的優(yōu)點(diǎn)是讀寫性能更好,單節(jié)點(diǎn)能支持更高的吞吐量。而 HDFS 則能提供真正無限的存儲容量,并且對查詢更友好。

為什么 Kafka 能做到幾倍于 HDFS 的吞吐能力,技術(shù)上的根本原因是什么?

這個問題的最根本原因是,對于磁盤來說,順序讀寫的性能要遠(yuǎn)遠(yuǎn)高于隨機(jī)讀寫,這個性能差距視不同的磁盤,大約在幾十倍左右。Kafka 是為順序讀寫設(shè)計的,而 HDFS 是為隨機(jī)讀寫的設(shè)計的,所以在順序?qū)懭氲臅r候,Kafka 的性能會更好。

雖然 hdfs 和 kafka 都可以用來做存儲, 但 kafka 在使用方面像磁帶;hdfs 更像硬盤,總結(jié)一下針對海量數(shù)據(jù)的存儲方案有如下幾個要點(diǎn):

  1. 采用批處理的方式提升吞吐量
  2. 利用了磁盤文件順序讀寫性能高的特點(diǎn)設(shè)計存儲
  3. 利用了操作系統(tǒng)的 PageCache 做緩存,減少 IO
  4. 采用零拷貝技術(shù)加速消費(fèi)流程
責(zé)任編輯:龐桂玉 來源: 數(shù)字化助推器
相關(guān)推薦

2011-10-28 09:05:09

2014-04-11 10:35:49

實(shí)時計算

2021-05-17 14:21:48

物聯(lián)網(wǎng)數(shù)據(jù)存儲

2009-10-20 09:14:28

2015-10-29 13:56:55

數(shù)據(jù)中心互聯(lián)網(wǎng)運(yùn)營

2012-05-24 09:22:22

虛擬化互聯(lián)網(wǎng)數(shù)據(jù)爆炸

2015-12-07 09:58:45

初志科技云存儲

2015-06-24 15:35:54

2013-05-07 10:42:20

互聯(lián)網(wǎng)營銷大數(shù)據(jù)

2015-10-08 15:20:34

互聯(lián)網(wǎng)物聯(lián)網(wǎng)

2018-02-24 13:50:59

互聯(lián)網(wǎng)分布式存儲

2020-07-06 11:38:12

5G

2019-01-08 15:58:09

安全可信數(shù)據(jù)存儲

2015-10-30 17:50:18

互聯(lián)網(wǎng)金融

2018-08-15 09:02:59

產(chǎn)業(yè)互聯(lián)網(wǎng)工業(yè)互聯(lián)網(wǎng)物聯(lián)網(wǎng)

2022-11-28 19:55:33

亞馬遜

2015-09-22 09:17:33

互聯(lián)網(wǎng)發(fā)展史

2014-01-15 14:35:35

云計算

2015-05-28 16:11:07

互聯(lián)網(wǎng)+

2021-07-29 12:17:40

戴爾
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號