kudu 使用以及架構


kudu的介紹:
KUDU在 HDFS 和 HBase 這兩個中平衡了隨機讀寫和批量分析的性能,既支持了SQL實時查詢,也支持了數據更新插入操作
kudu 術語:
Tablet(段):一個tablet是一張table連續的segment,與其它數據存儲引擎或關系型數據庫partition(分區)相似。在一定的時間范圍內,tablet的副本冗余到多個tserver服務器上,其中一個副本被認為是leader tablet。任何副本都可以對讀取進行服務,並且寫入時需要為tablet服務的一組tablet server之間達成一致性。一張表分成多個tablet,分布在不同的tablet server中,最大並行化操作,Tablet在Kudu中被切分為更小的單元,叫做RowSets,RowSets分為兩種MemRowSets和DiskRowSet,MemRowSets每生成32M,就溢寫到磁盤中,也就是DiskRowSet
Catalog Table(目錄表):catalog table是Kudu 的 metadata(元數據中)的中心位置。它存儲有關tables和tablets的信息。該catalog table(目錄表)可能不會被直接讀取或寫入。相反,它只能通過客戶端 API中公開的元數據操作訪問
MetaData: block和block在data中的位置。
MemRowSet:其中MemRowSet用於存儲insert數據和update后的數據,寫滿后會刷新到磁盤中也就是多個DiskRowSet中,默認是1G刷新一次或者是2分鍾。
BloomFile:根據DiskRowSet中key生成一個bloom filter,用於快速模糊的定位某一個key是否在DiskRowSet中。
Ad_hoc Index:是主鍵的索引,用於定位key在DiskRowSet中具體哪個偏移位置。
BaseData:是MemRowSet flush下來的數據,按照列存儲,按照主鍵有序。
UndoFile:是BaseData之前的數據歷史數據。
RedoFile:是BaseData之后的mutation記錄,可以獲得較新的數據。
DeltaMem:用於在內存中存儲mutation記錄,先寫到內存中,然后寫滿后flush到磁盤,形成deltafile。
Minor Compaction:多個DeltaFile進行合並生成一個大的DeltaFile。默認是1000個DeltaFile進行合並一次
Major Compaction:DeltaFile文件的大小和Base data的文件的比例為0.1的時候,會進行合並操作,生成Undo data

tablet 架構圖:
1,kudu中的Tablet是負責Table表的一部分的讀寫工作,Tablet是有多個或一個Rowset組成的,其中一個Rowset處於內存中,叫做MemRowSet,MemRowSet主要是負責處理新的數據寫入請求。DiskRowSet是MemRowSet達到1G刷新一次或者是時間超過2分鍾后刷新到磁盤后生成的,實際底層存儲是是有Base Data(一個CFile文件)、多個Delta file(Undo data、Redo data組成)的和Delta MemStore,其中位於磁盤中的Base data、Undo data、Redo data是不可修改的,Delta Memstore達到一定程度后會刷新到磁盤中的生成Redo data,其中kudu后台有一個類似HBase的compaction線程策略進行合並處理
2,當創建Kudu客戶端時,其會從主master上獲取tablet位置信息,然后直接與服務於該tablet的服務器進行交談。為了優化讀取和寫入路徑,客戶端將保留該信息的本地緩存,以防止他們在每個請求時需要查詢主機的tablet位置信息。隨着時間的推移,客戶端的緩存可能會變得過時,並且當寫入被發送到不是領導者的tablet服務器時,則將被拒絕。然后,客戶端將通過查詢主服務器發現新領導者的位置來更新其緩存。


讀流程:
1、客戶端連接TMaster獲取表的相關信息,包括分區信息,表中所有tablet的信息
2、客戶端找到需要讀取的數據的tablet所在的TServer,Kudu接受讀請求,並記錄timestamp信息,如果沒有顯式指定,那么表示使用當前時間
3、從內存中讀取數據,也就是MemRowSet和DeltaRowSet中讀取數據,根據timestamp來找到對應的mutation鏈表
4、從磁盤中讀取數據,從metadata文件中使用boom filter快速模糊的判斷所有候選RowSet是否含有此key。然后從DiskRowSet中讀取數據,實際是根據B+樹,判斷key在那些DiskRowSet的range范圍內,然后從metadata文件中,獲取index來判斷rowId在Data中的偏移,或者是利用validex來判斷數據的偏移(只有一個key),根據讀操作中包含的timestamp信息判斷是否需要將base data進行回滾操作從而獲取數據
寫流程(Kudu插入一條新數據):
1、客戶端連接TMaster獲取表的相關信息,包括分區信息,表中所有tablet的信息
2、客戶端找到負責處理讀寫請求的tablet所負責維護的TServer。Kudu接受客戶端的請求,檢查請求是否符合要求(表結構)
3、Kudu在Tablet中的所有rowset(memrowset,diskrowset)中進行查找,看是否存在與待插入數據相同主鍵的數據,如果存在就返回錯誤,否則繼續
4、寫入操作先被提交到tablet的預寫日志(WAL),並根據Raft一致性算法取得追隨節點的同意,然后才會被添加到其中一個tablet的內存中,插入會被添加到tablet的MemRowSet中。為了在MemRowSet中支持多版本並發控制(MVCC),對最近插入的行(即尚未刷新到磁盤的新的行)的更新和刪除操作將被追加到MemRowSet中的原始行之后以生成REDO記錄的列表
5、Kudu在MemRowset中寫入一行新數據,在MemRowset(1G或者是120s)數據達到一定大小時,MemRowset將數據落盤,並生成一個diskrowset用於持久化數據,還生成一個memrowset繼續接收新數據的請求
數據的更新流程:
1、客戶端連接TMaster獲取表的相關信息,包括分區信息,表中所有tablet的信息
2、Kudu接受請求,檢查請求是否符合要求
3、因為待更新數數據可能位於memrowset中,也可能已經flush到磁盤上,形成diskrowset。因 此根據待更新數據所處位置不同,kudu有不同的做法
1),當待更新數據位於memrowset時,找到待更新數據所在行,然后將更新操作記錄在所在行中一個mutation鏈表中;在memrowset將數據落盤時,Kudu會將更新合並到base data,並生成UNDO records用於查看歷史版本的數據,REDO records實際上也是以DeltaFile的形式存放
2),當待更新數據位於DiskRowset時,找到待更新數據所在的DiskRowset,每個DiskRowset都會在內存中設置一個DeltaMemStore,將更新操作記錄在DeltaMemStore中,在DeltaMemStore達到一定大小時,flush在磁盤,形成DeltaFile中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM