使用场景
TiKV 中的使用:
-
TiDB GC 中用来通过 table collector 统计文件中 mvcc 版本信息,min mvcc ts ,delete和 put 数量等,来优化 filter 的触发时机,避免需要 gc 的数据太少的时候依然触发 gc filter。
-
RawKV V1TTL 场景:通过收集文件中 min ts,避免不必要的 filter 触发。
-
其他:RocksDB 本身 NewCompactOnDeletionCollectorFactory ,来处理 delete 量远多余 put 的情况;
使用方式
-
自定义一个 table properties ,里面自定义指标
-
自定义一个 rocksdb table collector 来做自定义指标的具体统计逻辑
-
一个 DB 可以加载多个 table collector
主要实现 table collector 的 Finish 和 Add 两个函数;
Finish 和 Add 在 RocksDB 中的调用
class TablePropertiesCollector {
public:
virtual ~TablePropertiesCollector() {}
// DEPRECATE User defined collector should implement AddUserKey(), though
// this old function still works for backward compatible reason.
// Add() will be called when a new key/value pair is inserted into the table.
// @params key the user key that is inserted into the table.
// @params value the value that is inserted into the table.
virtual Status Add(const Slice& /*key*/, const Slice& /*value*/) {
return Status::InvalidArgument(
"TablePropertiesCollector::Add() deprecated.");
}
// Finish() will be called when a table has already been built and is ready
// for writing the properties block.
// @params properties User will add their collected statistics to
// `properties`.
virtual Status Finish(UserCollectedProperties* properties) = 0;
//...
};
RocksDB中的调用链路
用户定义的table collector 加载:
CompactionJob::ProcessKeyValueCompaction
CompactionJob::OpenCompactionOutputFile
TableBuilder* NewTableBuilder
BlockBasedTableFactory::NewTableBuilder
BlockBasedTableBuilder::BlockBasedTableBuilder
Rep
Finish 函数调用链路
构造 sst 结束的时候执行
CompactionJob::ProcessKeyValueCompaction
CompactionJob::FinishCompactionOutputFile
GetTableProperties
collector->Finish
Add 函数调用链路
每遍历一个 entry,执行一次所有加载的 table collector 的 Add 。
CompactionJob::ProcessKeyValueCompaction
CompactionJob::FinishCompactionOutputFile //这里遍历所有要固化的数据,写文件
//遍历过程中调用下面代码
BlockBasedTableBuilder::Add
NotifyCollectTableCollectorsOnAdd
//这里是和 table collector 相关的代码,可以设置多个 table colloector
//NotifyCollectTableCollectorsOnAdd内部每个 colloctor 都会执行一次Add