searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Rocks DB的wide-columns特性介绍

2023-12-15 09:52:44
115
0

       RocksDB从8.0开始推出了Wide Columns特性,支持半结构化的数据存储,不再只是单纯的key-value存储。wide-columns模型在kv存储和关系数据库之间起到了桥接作用。

        WideColumn的特性具体来说就是把一个value拆分成多个属性记录,value为一组column的组合,在value中会同时记录column_name和column_value信息。在内部实现上,写入时会使用WideColumnSerialization::Serialize接口把一组WideColumns序列化为string落盘,读取时则使用WideColumnSerialization::Deserialize接口反序列化为WideColumns输出。

       Rocks DB为wide-column定义了新的put/get接口,以WideColumns的形式读写数据,写接口支持DB和WriteBatch的PutEntiy,读接口同时支持MultiGet,支持批量key读取,具体接口如下:

Status DB::PutEntity(const WriteOptions& options,
                         ColumnFamilyHandle* column_family, const Slice& key,
                         const WideColumns& columns);
Status WriteBatch::PutEntity(ColumnFamilyHandle* column_family, const Slice& key,
                 const WideColumns& columns) override;
Status DB::GetEntity(const ReadOptions& /* options */,
                          ColumnFamilyHandle* /* column_family */,
                          const Slice& /* key */,
                          PinnableWideColumns* /* columns */);
DB::MultiGetEntity(const ReadOptions& /* options */,
                             ColumnFamilyHandle* /* column_family */,
                             size_t num_keys, const Slice* /* keys */,
                             PinnableWideColumns* /* results */,
                             Status* statuses,
                             bool /* sorted_input */ = false);
void DB::MultiGetEntity(const ReadOptions& /* options */, size_t num_keys,
                             ColumnFamilyHandle** /* column_families */,
                             const Slice* /* keys */,
                             PinnableWideColumns* /* results */,
                             Status* statuses,
                             bool /* sorted_input */ = false);

         Wide-Columns特性也兼容非结构化value的读取, 非结构化的value会作为default column处理,调用MultigeGetEntity接口时,如果传入的key读取到的value为非结构化数据,则作为default column返回,而merge操作只会把增加的值merge到default column中,相当于保留了之前版本的语义。另外Delete,DeleteRange,SingleDelete也支持wide-column。

          Compaction filter也做了wide-columns的适配,提供了FilterV3版本,上层业务可决定compaction之后输出default key-value还是wide-column。

          当前版本的wide-column特性还不支持column-level的操作,从代码层面可以看到,PutEntity接口的内部实现还未处理新老数据的合并,也就是没有Merge-on-Write或者Merge-on-Read策略,所以每次的更新都需要上层自己读取,merge然后再更新。这部分的功能在rocksdb的future plan中。另外column group也在规划中(column group可以聚合存储频繁查询的column,提升性能)。见下图:

             

          综合来说,RocksDB8.0提供了基础的wide-column功能,但对业务来说可用性还有待评估,可跟踪这个特性的更新发展,成熟之后再考虑引用。

0条评论
0 / 1000
王****威
4文章数
0粉丝数
王****威
4 文章 | 0 粉丝
原创

Rocks DB的wide-columns特性介绍

2023-12-15 09:52:44
115
0

       RocksDB从8.0开始推出了Wide Columns特性,支持半结构化的数据存储,不再只是单纯的key-value存储。wide-columns模型在kv存储和关系数据库之间起到了桥接作用。

        WideColumn的特性具体来说就是把一个value拆分成多个属性记录,value为一组column的组合,在value中会同时记录column_name和column_value信息。在内部实现上,写入时会使用WideColumnSerialization::Serialize接口把一组WideColumns序列化为string落盘,读取时则使用WideColumnSerialization::Deserialize接口反序列化为WideColumns输出。

       Rocks DB为wide-column定义了新的put/get接口,以WideColumns的形式读写数据,写接口支持DB和WriteBatch的PutEntiy,读接口同时支持MultiGet,支持批量key读取,具体接口如下:

Status DB::PutEntity(const WriteOptions& options,
                         ColumnFamilyHandle* column_family, const Slice& key,
                         const WideColumns& columns);
Status WriteBatch::PutEntity(ColumnFamilyHandle* column_family, const Slice& key,
                 const WideColumns& columns) override;
Status DB::GetEntity(const ReadOptions& /* options */,
                          ColumnFamilyHandle* /* column_family */,
                          const Slice& /* key */,
                          PinnableWideColumns* /* columns */);
DB::MultiGetEntity(const ReadOptions& /* options */,
                             ColumnFamilyHandle* /* column_family */,
                             size_t num_keys, const Slice* /* keys */,
                             PinnableWideColumns* /* results */,
                             Status* statuses,
                             bool /* sorted_input */ = false);
void DB::MultiGetEntity(const ReadOptions& /* options */, size_t num_keys,
                             ColumnFamilyHandle** /* column_families */,
                             const Slice* /* keys */,
                             PinnableWideColumns* /* results */,
                             Status* statuses,
                             bool /* sorted_input */ = false);

         Wide-Columns特性也兼容非结构化value的读取, 非结构化的value会作为default column处理,调用MultigeGetEntity接口时,如果传入的key读取到的value为非结构化数据,则作为default column返回,而merge操作只会把增加的值merge到default column中,相当于保留了之前版本的语义。另外Delete,DeleteRange,SingleDelete也支持wide-column。

          Compaction filter也做了wide-columns的适配,提供了FilterV3版本,上层业务可决定compaction之后输出default key-value还是wide-column。

          当前版本的wide-column特性还不支持column-level的操作,从代码层面可以看到,PutEntity接口的内部实现还未处理新老数据的合并,也就是没有Merge-on-Write或者Merge-on-Read策略,所以每次的更新都需要上层自己读取,merge然后再更新。这部分的功能在rocksdb的future plan中。另外column group也在规划中(column group可以聚合存储频繁查询的column,提升性能)。见下图:

             

          综合来说,RocksDB8.0提供了基础的wide-column功能,但对业务来说可用性还有待评估,可跟踪这个特性的更新发展,成熟之后再考虑引用。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0