1. 程式人生 > >kudu內部機制

kudu內部機制

1. kudu:面向結構化資料的開源的table儲存引擎,支援低延遲的隨機存取以及高效的分析處理

2. kudu的內部實現原理如圖所示:


3. kudu通過水平分割槽來實現資料的分散式儲存,儲存以每個partition即tablet為單位,並基於raft協議解決多個partition副本的一致性問題

4. kudu表會指定其所有column的一個有序子集為primary key,作為在update和delete時的索引並用於分割槽,具有唯一性,並不能通過alter來drop這些primary key

5. kudu目前不支援除primary key以外的二級索引和唯一性限制

6. kudu使用scan運算元來查詢table中的資料,scan使用projection來選擇columns並支援兩種型別的謂詞來filter,一個是column與常量的對比,另一個是primary key的範圍

7. kudu提供了API用於將資料存放在指定的tablet server上面

8. kudu叢集包含一個master節點和多個tablet server節點,分別儲存元資料和實際的資料

9. kudu對table進行橫向分割槽,單個row將會基於其primary key分到特定的分割槽中,每個分割槽稱為一個tablet,因此,單個insert或者update操作只會影響單個tablet

10. 在建立kudu表時必須指定分割槽模式,分割槽的原理:根據指定的分割槽模式計算出primary key對應的binary partition key,因為每個tablet覆蓋一段連續的binary partition key, 因此可找到相應的tablet分割槽並進行進一步操作,圖示如下:


11. kudu中有兩種分割槽模式,即基於hash和基於range,前者由primary key的一個子集以及分割槽的數量組成,後者由primary key的範圍劃分組成

12. kudu基於raft協議在叢集中對每個tablet都儲存多個副本,副本中的內容不是實際的資料,而是操作該副本上的資料時對應的更改資訊。

13. kudu的master程序的主要作用:
            (a)管理所有table以及tablet的元資料資訊,比如表模式資訊,這些資訊儲存在記憶體中一個使用者無法訪問的單tablet的table當中,稱為catalog table,該tablet也基於raft協議實現了master節點的元資料的備份
            (b)協調叢集的正常執行,比如心跳和故障恢復,當叢集啟動時,tablet server要向master彙報所有tablet資訊,後續只彙報增刪改的tablet資訊。基於raft協議,tablet自身負責其狀態的改變,然後master節點再基於raft中的資訊來更新tablet的狀態資訊
            (c)管理所有tablet的位置資訊、分割槽range、備份資訊,當執行讀寫操作時,client首先從master中查詢對應的tablet的位置、raft配置、primary key range等資訊並快取在client端,再直接與對應的tablet server通訊,如果tablet資訊過期,再重新向master查詢

14. tablet server中的每個tablet之間是相互獨立解耦的,資料的儲存以tablet為單位,其儲存設計要求能夠提供快速的列式資料掃描、低延遲的隨機更新、高效的一致性

15. 每個tablet內部由多個rowset組成,包括一個memrowset和多個diskrowset,前者儲存於記憶體中,後者一部分在記憶體,一部分在磁碟,table中的單個row只能對應一個rowset。通過insert新插入的資料放在memrowset當中,一旦資料量達到上限(32MB),觸發flush操作,將memrowset儲存到磁碟當中變成一個或者多個diskrowset,並生成一個新的空memrowset。

16. memrowset基於B樹實現,按行儲存,這一點與diskrowset不同。Memrowset中的資料基於primary key有序,因此diskrowset也有序

17. diskrowset包含兩部分,即base data以及delta stores。Base data按列來依次儲存table中存在於該rowset的資料,對每個列的儲存又分成多個page。當查詢資料時,根據一個B樹結構能夠快速定位需要操作的資料所在的page。在base data中按列儲存資料時,同時也會儲存一個primary key index,用於快速查詢待操作的row,同時還會生成一個chunked bloom filter來快速判斷待操作的row是否存在於該rowset

18. 按列儲存的base data被看做是不可變的,因此執行刪改操作時,將刪改資訊儲存在delta stores當中。Delta stores包含一個儲存於記憶體中的deltamemstore和多個儲存於磁碟中的deltafiles。當執行刪改操作時,先根據primary key基於base data中一個B樹結構查詢到對應的page,並根據page元資料查詢到對應的row在整個rowset中的offset。然後在deltamemstore中儲存一個(offset,time)到changelist的對映,deltamemstore也是一個B樹,與memrowset被flush為diskrowset一樣,當deltamemstore達到一定的容量時,被flush到磁碟變成deltafile,同時生成一個新的空deltamemstore

19. 當diskrowset中的deltafiles較多時,會影響查詢速度,因此相關程序將會對其做compaction操作,將其合併到base data當中,該合併過程主要是resolve掉delta stores中的update記錄

20. 在每個tablet中還會週期性的對一些diskrowset做compaction操作,生成一些新的diskrowset,目的是對多個diskrowset進行重新排序,以此來使其更有序並減少diskrowset的數量,同時在compaction的過程中還會resolve掉delta stores當中的delete記錄