寫入操作是指需進行插入、更新或刪除操作的一組行。需要注意的事項是Kudu強制執行主關鍵字的唯一性,主關鍵字是可以更改行的唯一標識符。為了強制執行此約束條件,Kudu必須以不同的方式處理插入和更新操作,並且這會影響tablet服務器如何處理寫入
Kudu中的每個tablet包含預寫式日志(WAL)和多個行集合(RowSet),它們是保存在存儲器和磁盤上(被刷新時)的不相交的行集合。
寫入操作先被提交到tablet的預寫式日志(WAL),並根據Raft 一致性算法取得追隨節點的同意,然后才會被添加到其中一個tablet的內存中;
插入會被添加到tablet的MemRowSet中。為了在MemRowSet中支持多版本並發控制(MVCC),對最近插入的行(即尚未刷新到磁盤的新的行)的更新和刪除操作將被追加到MemRowSet中的原始行之后以生成重做(REDO)記錄的列表。(讀取者需要應用相關的重做(REDO)記錄,根據掃描程序給定的時間戳構建行的正確快照。)
當MemRowSet填滿時,則被刷新到磁盤並成為一個DiskRowSet。為了支持磁盤中存儲數據的多版本並發控制(MVCC)功能,DiskRowSets被分為兩種不同的文件類型:
MemRowSet中行的最新版本(即應用了其所有重做(REDO)記錄的原始插入)被寫入到基礎數據文件。這是一種柱狀文件格式(非常像Parquet),用於快速、高效的讀取訪問,其賦予了Kudu支持分析訪問模式的能力。
MemRowSet中存在的行的先前版本(即重做(REDO)記錄的倒序)作為一組撤銷(UNDO)記錄寫入增量文件。時間行程讀取可以應用相關的撤銷(UNDO)記錄,從早期的時間點構建行的正確快照。
更新已被編碼和壓縮的柱狀格式化數據文件需要重寫整個文件,因此基礎數據文件一旦被刷新則被認為是不可變的。
此外,行關鍵字唯一性約束意味着基本記錄的更新和刪除不能被添加到tablet的MemRowSet中,而是被添加到名為DeltaMemStore的單獨的內存存儲器中。
像MemRowSet一樣,所有的變化都將被添加到DeltaMemStore中作為一組重做(REDO)記錄;
當DeltaMemStore填滿時,重做(REDO)記錄將被刷新到磁盤上存儲的增量文件中。
每個DiskRowSet都存在一個單獨的DeltaMemStore。如需構建行的正確快照,讀取者必須在應用相關撤銷(UNDO)或重做(REDO)記錄之前首先找到行的基本記錄
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記錄的列表。
-