yugabytedb之DocDB儲存層
yugabytedb之DocDB儲存層
一旦資料被複制到多數派節點的Yugabytedb tablet peer上,就可以將資料應用到tablet peer本地的DocDB文件儲存中。
儲存模型
儲存層採用的是key-object/document模型,儲存模型如下圖所示:
key和對應的document描述如下:
DocDB key
DocDB document模型中的key由一個或多個hash組成,後面跟著零個或多個有序的元件組成。這些元件按照資料型別指定的排序方式進行順序儲存,每個key都支援升序或降序排序。
DocDB value
DocDB document模型中的values可以是:
基本型別:比如int32,int64,doouble,text,timestamp等。
非基本型別(有序maps):這些物件將標量key對映到values,這些值可以是標量對映或排序對映。
該模型允許多級巢狀,類似於Json格式。其他資料結構(比如list、sorted set等)使用DocDB的特殊編碼方式,object型別。在DocDB中,每次更新的時間戳都會被記錄,這樣就可以恢復document在過去任何時候的狀態。只要快照上沒有讀取舊值的事務,覆蓋或刪除的資料版本就會被垃圾收集。
Encoding documents
documents使用基於RocksDB的無型別key-value儲存來儲存。documents與時間戳一起轉換為多個key-value對。因為文件包含很多不同的key-value,所以可以廉價的對它們進行部分修改。
例如,考慮以下儲存在DocDB中的文件
DocumentKey1 = {
SubKey1 = {
SubKey2 = Value1
SubKey3 = Value2
},
SubKey4 = Value3
}
RocksDB中儲存的key由許多部分組成,其中第一部分是“document key”,後面是一些標量部分,最後是MVCC時間戳(按相反順序排序)。DocumentKey、SubKey和Value中的每個部分都是基本值,只是key-value對,可以對字串進行編碼和解碼。對key的基本value進行編碼時,使用binary-comparable方式編碼,因此編碼的排序順序和值的排序順序相同。
Updates and deletes
假設上面的示例文件完全是在時間T10編寫的。在內部,上述示例的文件使用5個RocksDB鍵值對進行儲存:
DocumentKey1, T10 -> {} // This is an init marker
DocumentKey1, SubKey1, T10 -> {}
DocumentKey1, SubKey1, SubKey2, T10 -> Value1
DocumentKey1, SubKey1, SubKey3, T10 -> Value2
DocumentKey1, SubKey4, T10 -> Value3
刪除Documents和SubDocuments的方法是在相應的值處寫入一個Tombstone標記。在壓縮過程中,將清除覆蓋或刪除的值以回收空間。