Rocksdb 获取当前db内部的有效key个数 (估值)
文章目录
- 1. 基本接口
- 2. Memtable key个数统计
- 3. Immutable Memtable key个数统计
- 4. Sstables key个数统计
- 5. 疑问
Rocksdb因为是AppendOnly 方式写入,所以没有办法提供db内部唯一key个数的接口(可能存在多版本的key,对用户来说只有一个userkey,但是rocksdb认为是多个internal key)。
不过Rocksdb支持提供获取大概非删除key 的internal-key的个数接口,也能让用户对写入的key有一个大体量级的估计。
本文相关rocksdb代码版本是6.4.6
1. 基本接口
可以通过如下接口来获取:
uint64_t int_num;
dbfull()->GetIntProperty("rocksdb.estimate-num-keys", &int_num)
这一部分key组成从Rocksdb的写入整体架构来看应该由三部分组成:
- memtable-keys
- imm memtable-keys
- sstables-keys
实际获取的时候还需要将删除key(DeleteType)过滤掉。
具体estimate-num-keys
的底层实现接口是:
bool InternalStats::HandleEstimateNumKeys(uint64_t* value, DBImpl* /*db*/,Version* /*version*/) {// Estimate number of entries in the column family:// Use estimated entries in tables + total entries in memtables.const auto* vstorage = cfd_->current()->storage_info(); uint64_t estimate_keys = cfd_->mem()->num_entries() + // memtable 的keyscfd_->imm()->current()->GetTotalNumEntries() + // imm 的keysvstorage->GetEstimatedActiveKeys(); // sstables 的keysuint64_t estimate_deletes = // 删除keyscfd_->mem()->num_deletes() + cfd_->imm()->current()->GetTotalNumDeletes();*value = estimate_keys > estimate_deletes * 2? estimate_keys - (estimate_deletes * 2): 0;return true;
}
2. Memtable key个数统计
针对memtable中的keys的统计会获取mem()->num_entries()
中的num_entries_
的个数,memtable即active-memtable 在写入路径中达到write-buffer-size阈值之前有且仅有一个,所以只需要看一下当前的用户进程中这一个memtable中写入的key的个数即可,而这个数据会在Add memtable的时候同步更新。
3. Immutable Memtable key个数统计
针对immutable memtable的keys统计,因为这种只读的memtable可能存在多个,由一个链表进行管理,后续统一进行flush,所以获取对应的有效key以及删除key的个数的话只需要逐个累加immutable memtable中的key的个数即可。
uint64_t MemTableListVersion::GetTotalNumEntries() const {uint64_t total_num = 0;for (auto& m : memlist_) {total_num += m->num_entries();}return total_num;
}
这一些有效key的更新是在Status MemTable::Add()
函数中进行更新的,包括后续的num_deletes_
的个数也一样。
4. Sstables key个数统计
这个数据的统计也是我们想要的数据主体,因为大多数的时候 我们数据还是会持久化到sst文件之中的。
针对sst的有效key的个数统计是通过如下接口实现的:
大体逻辑是
- 如果发现sst文件个数为0,则直接返回0。
这个场景接口也说明了,在用户写入少量 key没有达到触发flush的条件时,这里获取到的数据就是0 - 如果当前统计的有效key的个数
current_num_non_deletions_
比实际的删除key的个数还少,则也认为这一些有效key后续都会被删除,也返回0 - 有效key的个数 通过
current_num_non_deletions_ - current_num_deletions_
即可获得 - 为了防止返回的key数量过多(compaction完成之后会伴随着文件的删除),这里会重新逐层获取一下sst文件数量,和实际统计的sst文件数量做一个比值再乘上一步有效key的个数 – 双重保险
uint64_t VersionStorageInfo::GetEstimatedActiveKeys() const {// Estimation will be inaccurate when:// (1) there exist merge keys// (2) keys are directly overwritten// (3) deletion on non-existing keys// (4) low number of samplesif (current_num_samples_ == 0) {return 0;}if (current_num_non_deletions_ <= current_num_deletions_) {return 0;}uint64_t est = current_num_non_deletions_ - current_num_deletions_;uint64_t file_count = 0;for (int level = 0; level < num_levels_; ++level) {file_count += files_[level].size();}if (current_num_samples_ < file_count) {// casting to avoid overflowingreturnstatic_cast<uint64_t>((est * static_cast<double>(file_count) / current_num_samples_));} else {return est;}
}
而实际的这一些指标的填充都是VersionStorageInfo::UpdateAccumulatedStats
这个函数中,这个函数的调用链实际能贯穿到compaction ,如下调用链
DBImpl::BackgroundCompaction // compaction执行入口VersionSet::LogAndApply // compaction 执行结束前需要更新manifest的version信息VersionSet::ProcessManifestWrites // manifest更新入口Version::PrepareApply // 更新各个指标Version::UpdateAccumulatedStats // 更新当前version内所有层的所有文件元信息VersionStorageInfo::UpdateAccumulatedStats // 更新每一个sst文件的元信息
最后一个函数的的更新一个sst文件元数据指标方式如下:
void VersionStorageInfo::UpdateAccumulatedStats(FileMetaData* file_meta) {assert(file_meta->init_stats_from_file);accumulated_file_size_ += file_meta->fd.GetFileSize();accumulated_raw_key_size_ += file_meta->raw_key_size;accumulated_raw_value_size_ += file_meta->raw_value_size;accumulated_num_non_deletions_ +=file_meta->num_entries - file_meta->num_deletions;accumulated_num_deletions_ += file_meta->num_deletions;current_num_non_deletions_ +=file_meta->num_entries - file_meta->num_deletions;current_num_deletions_ += file_meta->num_deletions;current_num_samples_++;
}
5. 疑问
可以看到以上代码中
current_num_non_deletions_
的数值是file_meta->num_entries - file_meta->num_deletions;
,已经减去了当前文件被删除的数据条目,细心的同学可能会发现估算sst文件内key的个数的函数GetEstimatedActiveKeys
中有一行代码uint64_t est = current_num_non_deletions_ - current_num_deletions_;
,这里又减了一次统计的删除key,有点奇怪。
针对删除类型的key减了两次,这里想一想,rocksdb写入一个删除类型的key肯定表示需要删除之前一个已经存在的key,所以我们想要保证返回的是有效key,需要减掉当前删除key个数的两倍才行。
Rocksdb 获取当前db内部的有效key个数 (估值)相关推荐
- php 获取key的位置,PHP使用腾讯地图获取指定地址坐标:创建key(图文+视频)
本篇文章主要给大家介绍PHP用腾讯地图获取指定地址坐标之创建key的步骤方法. 我们在项目开发过程中,有时可能会遇到用腾讯或百度地图接口获取相关数据的需求.那么对于PHP初学者来说,可能对相关知识不太 ...
- PHP 如何获取二维数组中某个key的集合(高性能查找)
分享下PHP 获取二维数组中某个key的集合的方法. 具体是这样的,如下一个二维数组,是从库中读取出来的. 代码: $user = array( 0 => array( 'id' => 1 ...
- boost::log模块测试get_attributes()这个const方法可以获取线程模型内部的互斥锁
boost::log模块测试get_attributes这个const方法可以获取线程模型内部的互斥锁 实现功能 C++实现代码 实现功能 boost::log模块测试get_attributes() ...
- php 获取js对象的属性值,js获取对象,数组所有属性键值(key)和对应值(value)的方法示例...
本文实例讲述了js获取对象,数组所有属性键值(key)和对应值(value)的方法.分享给大家供大家参考,具体如下: var values=function(object) { var values ...
- linux虚拟机怎么看var文件,一种获取Linux虚拟机内部日志的方法
一种获取Linux虚拟机内部日志的方法 [技术领域] [0001]本发明涉及云计算管理技术领域,特别是指一种获取Linux虚拟机内部日志的方法. [背景技术] [0002]在云计算环境下,虚拟机被广泛 ...
- JavaScript获取数组对象里面的键(key)和值(value)
JavaScript获取数组对象里面的键key和值value对象键值 知识回调 场景复现 三种方法获取数组对象里的键值 1.Object.keys() 2.Object.entries(obj) 3. ...
- 获取url转义之后的后面key值
1.例如 https://editor.csdn.net/md?not_checkout=1&articleId=111070909,获取not_checkout值: getUrlParame ...
- arcpy获取gdb/Dataset/featureClass中所有要素个数:(地理国情监测)
arcpy获取gdb/Dataset/featureClass中所有要素个数:(地理国情监测) coding = 'utf-8' import os import arcpy #Author By A ...
- python获取List数组中重复元素的个数(arcpy中统计FeatureClass中各类型地物要素的图斑数)(地理国情监测)
python获取List数组中重复元素的个数(arcpy中统计FeatureClass中各类型地物要素的图斑数)(地理国情监测) for str_Val in set(shp_JH_list): #循 ...
最新文章
- 什么是标记符控制的分水岭算法
- 你知道socket.io中connect事件和connection事件的区别吗?
- 720不能建立远程计算机连接,有高手知道错误720:不能建立到远程计算机的连接这个问题怎么解决? 爱问知识人...
- HTML、HTML5、XML、XHMTL区别
- jquery event 封装的源源分析
- 解决sublime3不能编辑插件default settings的问题
- TensorFlow10-多层神经网络建模,存储和载入
- php case 多个条件判断语句,Shell case语句(多分支条件判断)
- hibernate关联映射
- WTA (winner-take-all) 与 自组织映射 SOM (self organizing map)的理解
- java代码走查_java代码开发完成后,代码走查规范
- SSM高校实验室安全培训系统设计与实现.docx
- 企业的病毒,要及时清理
- 苹果手机语音备忘录在哪_真没想到!苹果手机还自带语音记录,按下这个按钮,语音秒变文字...
- 突然讨厌做前端,讨厌代码_如何安全清洁讨厌的游戏控制器
- 拼多多迈向后黄峥时代
- 数据分析研究思维导图
- 山村屠杀源与公共知识的运用
- 最新苹果开发者账号注册申请流程最强详解!
- win10下如何配置JAVA环境