AppBoxFuture: 123挨個站-數據按序存儲
- 2019 年 10 月 3 日
- 筆記
最近幾天在優化存儲的編碼規則,順帶把之前設計了但未實現的倒排序一併實現了。由於所有數據(元數據、實體、索引等)都映射至RocksDB的Key-Value存儲,所以必須擴展RocksDB的自定義比較器(Comparator)來實現自定義Key的排序規則。存儲層涉及到需要自定義排序的主要是分區元數據、實體數據以及索引,下面分別說明:
一、分區排序
在大表分區設置分區鍵及其規則時,可以根據需要設置每個分區鍵的排序,如下圖所示:
如果分區鍵規則是Hash,設置排序將被忽略
二、實體排序
在新建實體模型時可以根據需要指定主鍵排序,這裡需要注意的是不同於傳統資料庫可以指定任意欄位作為主鍵,實體的主鍵是128位的順序Guid,包括時間戳及集群節點等編碼資訊,所以這裡的實體排序指的是按時間戳正倒排。如果實體是如訂單等跟時間相關的數據類型,建議設置為倒排以方便掃描最近的實體數據。具體參考下圖設置:
三、索引排序
在添加索引時可以根據需要設置每個索引鍵的排序,如下圖所示:
四、排序測試
我們來做個簡單的測試:
-
新建一個分區表VehicleState按時間降序,加入欄位VID Int32, Speed Int32,設置分區鍵為VID按降序;
- 新建一個服務填充3 * 3條數據,如下示例程式碼:
public async Task<object> Insert() { return await SimplePerfTest.Run(3, 3, async (i, j) => { var obj = new Entities.VehicleState(i + 1); obj.Speed = 10 + j; await EntityStore.SaveAsync(obj); }); }
-
通過dbscan工具驗證分區元數據排列順序,如下圖所示紅框內為3個分區的排列順序:
-
通過實體模型設計介面內的數據瀏覽驗證排列順序,如下圖所示3個紅框為3個分區的排列順序:
五、本篇小結
經過這次編碼規則優化,存儲引擎的編碼格式已基本定型,下一步按計劃實現各項必須功能並加強存儲引擎的測試,GitHub上的運行時也更新為新的編碼格式,大家可安裝測試。另碼文不易,一邊碼程式碼一邊碼文更不易,作者需要您的支援請多多點贊推薦!