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个数的两倍才行。
相关文章:

Java项目:网上花店商城系统(java+jsp+servlert+mysql+ajax)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 一套完整的网上花店商场系统,系统支持前台会员的注册 登陆系统留言,花朵的品种选择,详情浏览,加入购物 车,购买花…

使用Uboot启动内核并挂载NFS根文件系统
配置编译好内核之后,将生成的内核文件uImage拷贝到/tftpboot/下,通过tftp服务器将内核下载到开发板,使用命令:tftp 31000000 uImage.下载完成之后配置bootargs环境变量:setenv bootargs noinitrd consolettySAC0,11520…

Centos系统上安装php遇到的错误解决方法集锦
Centos系统上安装php遇到的错误解决方法集锦1.configure: error: xml2-config not found. Please check your libxml2 installationyum install libxml2 libxml2-devel2.configure: error: Cannot find OpenSSL’s yum install openssl openssl-devel3.configure: error: Pleas…

2.27 MapReduce Shuffle过程如何在Job中进行设置
一、shuffle过程 总的来说: *分区 partitioner*排序 sort*copy (用户无法干涉) 拷贝*分组 group可设置 *压缩 compress*combiner map task端的Reduce二、示例 package com.ibeifeng.hadoop.senior.mapreduce;import java.io.IOException; import java.util.StringTo…

Rocksdb Slice使用中的一个小坑
本文记录一下使用Rocksdb Slice过程中的一个小小坑,差点没一口老血吐出来。 rocksdb的Slice 数据结构是一个小型得不可变类string数据结构,设计出来的目的是为了保证rocksdb内部处理用户输入的key在从内存到持久化磁盘的整个处理链路是不会被修改的&…

Java项目:仿天猫网上商城项目(java+jsp+servlet+mysql+ajax)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 前台: * 用户模块 * 分类模块 * 商品模块 * 购物车模块 * 订单模块 后台: * 管理员模块 * 分类管理模块 * 商品管理模块 * 订单模块…

转--Android如何在java代码中设置margin
3 在Java代码里设置button的margin(外边距)? 1、获取按钮的LayoutParams LinearLayout.LayoutParams layoutParams (LinearLayout.LayoutParams)button.getLayoutParams(); 2、在LayoutParams中设置margin layoutParams.setMargins(100,20,10,5);//4个参数按顺序分…

poj12月其他题解(未完)
最近编程的时间比较少啊…… poj3253 就是个合并果子,各种优先队列即可(显然单调队列最优) poj3263 线段树统计每个点被覆盖了多少次即可,注意要去重 poj3625 最小生成树 poj3626 bfs poj3624 01背包 poj3615 floyd即可 poj3278 简…

0409-0416的笔记
1 获取前几天,近几个月的时间 function getDay(day) {var today new Date();var targetday_milliseconds today.getTime() 1000 * 60 * 60 * 24 * day;today.setTime(targetday_milliseconds); //注意,这行是关键代码var tYear today.getFullYear();…

Linux NUMA 架构 :基础软件工程师需要知道一些知识
文章目录前言从物理CPU、core到HT(hyper-threading)UMA(Uniform memory access)NUMA架构NUMA下的内存分配策略1. MPOL_DEFAULT2. MPOL_BIND3. MPOL_INTERLEAVE4. MPOL_PREFERRED5. 一些NUMA架构下的内核配置总结参考前言 NUMA(Non-Uniform m…

Java项目:网上书城+后台管理系统(java+jsp+servlert+mysql+ajax)
源码获取:博客首页 "资源" 里下载! 一、项目简述(附带IW文档) 功能: 前台: * 用户模块 * 分类模块 * 图书模块 * 购物车模块 * 订单模块 后台: * 管理员模块 * 分类管理模块 * 图书管理模块 * 订单模块 …

java.util.concurrent包API学习笔记
newFixedThreadPool 创建一个固定大小的线程池。 shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭。 awaitTermination():用于等待子线程结束,再继续执行下面的代码。该例中我设置一直等着子线程结束。Java…

oracle读书记录
很久没有关注自己怕博客了,差不多有两年了。虽然这两年来一直关注51CTO,每天上班打开电脑或者周末在家开启电脑的时候都会浏览一下,这已经是习惯了,但是把自己的blog给忘了。今天,周末,2013年12月21日,同往…

输入、方法的运用
/ /猜数游戏,编写一个功能,完成猜数游戏,产生一个1~10之间的随机数 //与输入的数对对比,返回结果 猜中和没猜中 import java.util.Scanner; //引入(输入)的util包Scanner public class HelloWorld { public static void main(String[] args) {System…

Rocksdb 利用recycle_log_file_num 重用wal-log文件
recycle_log_file_num 复用wal文件信息, 优化wal文件的空间分配,减少pagecache中文件元信息的更新开销。 为同事提供了一组rocksdb写优化参数之后有一个疑惑的现象被问到,发现之前的一些代码细节有遗忘情况,同时也发现了这个参数…

Java项目:网上商城系统(java+jsp+servlert+mysql+ajax)
源码获取:博客首页 "资源" 里下载! 一、项目简述(需求文档PPT) 功能: 主页显示热销商品;所有商品展示,可进行商品搜索;点 击商品进入商品详情页,显示库存&…

clock函数返回负值~ (转)
使用clock() 函数来进行计时,时不时的返回一个很大的负数,怎么检查也检查不出错误,现在找出错误原因,给大家分享一下。 来源网页:http://kebe-jea.blogbus.com/logs/33603387.html 跑实验的时候,结果时不时…

c实现面向对象编程(3)
http://blog.csdn.net/kennyrose/article/details/7564105转载于:https://www.cnblogs.com/pengkunfan/p/3486612.html

echarts - 条形图grid设置距离绘图区域的距离
在一些数据量过大的情况下,在一个固定的区域绘图往往需要对图表绘制区域的大小进行动态改变。这时候设置条形图距离绘图区域上下左右的距离可使用如下方式:表示条形图的柱子距离绘图区左边30%,距离右边40%,而距离顶部和底部分别为…

TitanDB 中使用Compaction Filter ,产生了预期之外几十倍的读I/O
Compaction过程中 产生大量读I/O 的背景 项目中因大value 需求,引入了PingCap 参考Wisckey 思想实现的key-value分离存储 titan, 使用过程中因为有用到Rocksdb本身的 CompactionFilter功能,所以就直接用TitanDB的option 传入了compaction fi…

Java项目:前台+后台精品图书管理系统(java+SSM+jsp+mysql+maven)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能包括: 登录注册,办理借阅。借阅记录,预约借阅,借出未还, 借阅逾期,学生管理,图书管理,书库分类查询搜索…

消除 activity 启动时白屏、黑屏问题
默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白屏,显然影响用户体验,怎么消除呢? 在 Activity theme 设置style 即可 1 <style na…

理解并实施:HSRP(CCNA200-120新增考点)
理解并实施:HSRP思科热备路由器协议HSRP(HotStandby Router Protocol)是企业级网络路由器的故障冗余服务。如图9.116所示,192.168.2.0/24的子网需要与目标192.168.5.2的计算机通信。192.168.2.0/24的子网有两台出口路由器,一台是R…

使用机智云APP控制战舰V3 (转)
源:使用机智云APP控制战舰V3 转载于:https://www.cnblogs.com/LittleTiger/p/10725586.html

从JoinBatchGroup 代码细节 来看Rocksdb的相比于leveldb的写入优势
文章目录1. Rocksdb写入模型2. LevelDB写入的优化点3. Rocksdb 的优化1. Busy Loop2. Short Wait -- SOMETIMES busy Loop3. Long-wait4. 测试验证4. 总结1. Rocksdb写入模型 本节讨论一下Rocksdb在写入链路上的一个优化点,这个优化细节可以说将Rocksdb这个存储引擎…

Java项目:嘟嘟网上商城系统(java+jdbc+jsp+mysql+ajax)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 商品的分类展示,用户的注册登录,购物车,订单结算, 购物车加减,后台商品管理,分类管理,订单…

SOAPUI请求及mockservice 使用
1、新建soap Project,输入wsdl的地址,运行request 2.邮件Project,建立mockservice,建立多个response,选在mock operation,选择response dispa…

空间直角坐标系与球面坐标互转
空间直角坐标系与球面坐标互转 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace AppSurveryTools.SphericalAndCartesian7 {8 class CartesianCoord9 { 10 public double x; 11 public dou…

Ajax 的优势和不足
Ajax 的优势 1. 不需要插件支持 Ajax 不需要任何浏览器插件,就可以被绝大多数主流浏览器所支持,用户只需要允许 JavaScript 在浏览器上执行即可。 2. 优秀的用户体验 这是 Ajax 技术的最大优点,能在不刷新整个页面的前提下更新数据࿰…

BitCask 持久化hash存储引擎 原理介绍
文章目录前言引擎背景引擎原理1. 磁盘数据结构2. 内存数据结构3. 读流程4. 数据合并总结前言 最近工作中部分项目中,对存储引擎的需求希望高性能的写、点查,并不需要Range。这里看到大家总会提到BitCask这个存储引擎方案,并不是很了解&#…