日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Kafka的Log存儲解析

Kafka的Log存儲解析

來源:程序員人生   發布時間:2015-01-26 09:02:02 閱讀次數:6699次

Kafka的Log存儲解析

標簽(空格分隔): kafka


引言

Kafka中的Message是以topic為基本單位組織的,不同的topic之間是相互獨立的。每一個topic又可以分成幾個不同的partition(每一個topic有幾個partition是在創建topic時指定的),每一個partition存儲1部份Message。借用官方的1張圖,可以直觀地看到topic和partition的關系。
Anatomy of a Topic

partition是以文件的情勢存儲在文件系統中,比如,創建了1個名為page_visits的topic,其有5個partition,那末在Kafka的數據目錄中(由配置文件中的log.dirs指定的)中就有這樣5個目錄: page_visits-0, page_visits⑴,page_visits⑵,page_visits⑶,page_visits⑷,其命名規則為<topic_name>-<partition_id>,里面存儲的分別就是這5個partition的數據。

接下來,本文將分析partition目錄中的文件的存儲格式和相干的代碼所在的位置。

Partition的數據文件

Partition中的每條Message由offset來表示它在這個partition中的偏移量,這個offset不是該Message在partition數據文件中的實際存儲位置,而是邏輯上1個值,它唯1肯定了partition中的1條Message。因此,可以認為offset是partition中Message的id。partition中的每條Message包括了以下3個屬性:

  • offset
  • MessageSize
  • data

其中offset為long型,MessageSize為int32,表示data有多大,data為message的具體內容。它的格式和Kafka通訊協議中介紹的MessageSet格式是1致。

Partition的數據文件則包括了若干條上述格式的Message,按offset由小到大排列在1起。它的實現類為FileMessageSet,類圖以下:
FileMessageSet類圖
它的主要方法以下:

  • append: 把給定的ByteBufferMessageSet中的Message寫入到這個數據文件中。
  • searchFor: 從指定的startingPosition開始搜索找到第1個Message其offset是大于或等于指定的offset,并返回其在文件中的位置Position。它的實現方式是從startingPosition開始讀取12個字節,分別是當前MessageSet的offset和size。如果當前offset小于指定的offset,那末將position向后移動LogOverHead+MessageSize(其中LogOverHead為offset+messagesize,為12個字節)。
  • read:準確名字應當是slice,它截取其中1部份返回1個新的FileMessageSet。它不保證截取的位置數據的完全性。
  • sizeInBytes: 表示這個FileMessageSet占有了多少字節的空間。
  • truncateTo: 把這個文件截斷,這個方法不保證截斷位置的Message的完全性。
  • readInto: 從指定的相對位置開始把文件的內容讀取到對應的ByteBuffer中。

我們來思考1下,如果1個partition只有1個數據文件會怎樣樣?

  1. 新數據是添加在文件末尾(調用FileMessageSet的append方法),不論文件數據文件有多大,這個操作永久都是O(1)的。
  2. 查找某個offset的Message(調用FileMessageSet的searchFor方法)是順序查找的。因此,如果數據文件很大的話,查找的效力就低。

那Kafka是如何解決查找效力的的問題呢?有兩大寶貝:1) 分段 2) 索引。

數據文件的分段

Kafka解決查詢效力的手段之1是將數據文件分段,比如有100條Message,它們的offset是從0到99。假定將數據文件分成5段,第1段為0⑴9,第2段為20⑶9,以此類推,每段放在1個單獨的數據文件里面,數據文件以該段中最小的offset命名。這樣在查找指定offset的Message的時候,用2分查找就能夠定位到該Message在哪一個段中。

為數據文件建索引

數據文件分段使得可以在1個較小的數據文件中查找對應offset的Message了,但是這仍然需要順序掃描才能找到對應offset的Message。為了進1步提高查找的效力,Kafka為每一個分段后的數據文件建立了索引文件,文件名與數據文件的名字是1樣的,只是文件擴大名為.index。
索引文件中包括若干個索引條目,每一個條目表示數據文件中1條Message的索引。索引包括兩個部份(均為4個字節的數字),分別為相對offset和position。

  • 相對offset:由于數據文件分段以后,每一個數據文件的起始offset不為0,相對offset表示這條Message相對其所屬數據文件中最小的offset的大小。舉例,分段后的1個數據文件的offset是從20開始,那末offset為25的Message在index文件中的相對offset就是25⑵0 = 5。存儲相對offset可以減小索引文件占用的空間。
  • position,表示該條Message在數據文件中的絕對位置。只要打開文件并移動文件指針到這個position就能夠讀取對應的Message了。

index文件中并沒有為數據文件中的每條Message建立索引,而是采取了稀疏存儲的方式,每隔1定字節的數據建立1條索引。這樣避免了索引文件占用過量的空間,從而可以將索引文件保存在內存中。但缺點是沒有建立索引的Message也不能1次定位到其在數據文件的位置,從而需要做1次順序掃描,但是這次順序掃描的范圍就很小了。

在Kafka中,索引文件的實現類為OffsetIndex,它的類圖以下:
OffsetIndex類圖

主要的方法有:

  • append方法,添加1對offset和position到index文件中,這里的offset將會被轉成相對的offset。
  • lookup, 用2分查找的方式去查找小于或等于給定offset的最大的那個offset

小結

我們以幾張圖來總結1下Message是如何在Kafka中存儲的,和如何查找指定offset的Message的。

Message是依照topic來組織,每一個topic可以分成多個的partition,比如:有5個partition的名為為page_visits的topic的目錄結構為:
topic_partition

partition是分段的,每一個段叫LogSegment,包括了1個數據文件和1個索引文件,下圖是某個partition目錄下的文件:
partition
可以看到,這個partition有4個LogSegment。

借用博主@lizhitao博客上的1張圖來展現是如何查找Message的。
search
比如:要查找絕對offset為7的Message:

  1. 首先是用2分查找肯定它是在哪一個LogSegment中,自然是在第1個Segment中。
  2. 打開這個Segment的index文件,也是用2分查找找到offset小于或等于指定offset的索引條目中最大的那個offset。自然offset為6的那個索引是我們要找的,通過索引文件我們知道offset為6的Message在數據文件中的位置為9807。
  3. 打開數據文件,從位置為9807的那個地方開始順序掃描直到找到offset為7的那條Message。

這套機制是建立在offset是有序的。索引文件被映照到內存中,所以查找的速度還是很快的。

1句話,Kafka的Message存儲采取了分區(partition),分段(LogSegment)和稀疏索引這幾個手段來到達了高效性。

?
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 自拍欧美日韩 | 久久久久久一区 | 日韩一级精品视频在线观看 | 男操女视频网站 | 黄色日韩 | 色婷婷中文 | 99久久综合国产精品二区国产 | 91精品国产综合久久蜜臀 | 插综合网 | 欧美激情专区 | 免费成人av网站 | 九九色在线观看 | 国产精品久久久久婷婷二区次 | 国产精品久久久久久久久免费蜜臀 | 久久生活片 | 一区网站在线观看 | 日本高清视频在线 | 日韩精品视频免费在线观看 | 亚洲区一区二区三区 | 亚洲午夜视频在线观看 | 国产主播精品 | 国产在线一区二区三区 | 欧美不卡一区二区 | 日韩三级一区 | 成人影院网站ww555久久精品 | a毛片| 久久久夜精品 | 国产一区二区三区在线观看视频 | a天堂在线 | 欧美hdfree性xxxx| 日韩色区 | 亚洲精品国产第一综合99久久 | 久久精品国产一区二区三区 | 亚洲在看| 62久久久成人精品电影 | 精品无码久久久久久国产 | 国产精品亚洲综合 | 日韩精品久久久久久久电影99爱 | 久国产精品韩国三级视频 | 日本福利网站 | 国产精品无码永久免费888 |