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上的運行時也更新為新的編碼格式,大家可安裝測試。另碼文不易,一邊碼程式碼一邊碼文更不易,作者需要您的支援請多多點贊推薦!