AppBoxFuture: 123挨個站-數據按序存儲

  最近幾天在優化存儲的編碼規則,順帶把之前設計了但未實現的倒排序一併實現了。由於所有數據(元數據、實體、索引等)都映射至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上的運行時也更新爲新的編碼格式,大家可安裝測試。另碼文不易,一邊碼代碼一邊碼文更不易,作者需要您的支持請多多點贊推薦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章