RocksDB Tombstone 详解

article/2025/10/6 21:48:11

目录

为什么会有墓碑?

使用场景

原理

描述

 分段

查询

优化点

总结


为什么会有墓碑?

        我们知道 TP 数据库一般选择 KV 引擎作为存储引擎,数据库的元数据和数据通过一定的编码规则变成 KV 对存储在存储引擎中,比如 CockroachDB 数据库的编码前缀规则如下。

/Local/… =>   节点本地数据
/Meta1/… =>   一级路由数据
/Meta2/… =>   二级路由数据
/System/… =>  系统数据
/Table/… =>   表数据

        我们拿 Table 数据作为例子,表数据划分为系统表数据和用户表数据。用户完成建表和数据插入后,CockroachDB 内部的 SQL-KV 转换模型会将用户表数据转换成一系列 KV 对,按照 Key 顺序存储在存储引擎中。KV 对分为以 Primary Key 为前缀和以Index(二级索引)为前缀的编码,其中以 Primary Key 为前缀的 KV 对存储了用户表的实际数据。

主键索引编码规则:

// Key 编码
/Table/<id>/<index>/<pk val>/<family>Table:表示为行数据的前缀
<id>:表示表 ID
<index>:表示主索引ID
<pk val>:表示主索引的值
<family>:表示列族ID。没有建列族默认为 0// Value 编码
<crc><type>/TUPLE/colIDDiff:colID:type/val/../colIDDiff:colID:type/val/
<crc>: 表示整个 KV 对的 4 字节 CRC 校验码
<type>:表示 1 字节的值类型

        所以,当我们删除一张表时,其实就是删除了多个具有同样前缀的 KV 对,我们若是用 Tombstone 来标记一下,而不是真正的立即删除多个 KV 对,岂不是速度快了很多~

使用场景

        既然删除一张表(写操作)变得那么简单,那么读时该怎么办呢?其实很简单,就是 KV 引擎在查找某个 key 时,若查询到后,会再去墓碑中判断一下该 key 是否已经被删除。举个栗子:

        KV 引擎在 sequence = 9 时,查询用户 key="/table/1/xxx",查到结果 value,该 key 的插入 sequence = 6。我们拿 key="/table/1/xxx" 与 sequence = 9 作为入参,查询在当前 sequence 下,用户 key 的最大墓碑覆盖序列号 max_covering_tombstone_seq。

代码描述如下

std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(NewRangeTombstoneIterator(read_opts,GetInternalKeySeqno(key.internal_key()))); // 指定了读操作的 sequence。if (range_del_iter != nullptr) {
*max_covering_tombstone_seq =std::max(*max_covering_tombstone_seq,range_del_iter->MaxCoveringTombstoneSeqnum(key.user_key())); // 查询在当前 sequence 下,用户 key 的最大墓碑覆盖序列号
}

若用户 key 的插入 sequence < max_covering_tombstone_seq,则代表被删除了。

if ((type == kTypeValue || type == kTypeMerge || type == kTypeBlobIndex) &&max_covering_tombstone_seq > seq) {type = kTypeRangeDeletion;
}

查询原理部分看下面。

原理

描述

struct RangeTombstone {Slice start_key_;Slice end_key_;SequenceNumber seq_;
}

我们可以看出是由 key 和 sequence 两个维度来描述一个墓碑,代表在 sequence 时刻插入了一条墓碑值。一批墓碑可能产生重叠交叉等,下面是 5 条墓碑值:

 分段

我们可以看出,分段后就变成了 10 条墓碑,他们之间可能完全重叠(比如2、3、4),但不会出现交叉情况,通过分段后,我们就可以对分段后的墓碑进行排序了。排序规则:先比 key,key 相同(重叠)则 sequence 越大值越小。既然我们可以排序,那么就可以通过二分查找的思想快速定位到某个墓碑进行查询啦。

查询

经过分段后,我们进行查询,使用场景章节说过需要两个入参: 用户 key 和查询时刻 sequence。我们还举个栗子

key=d,sequence=kMaxSequenceNumber    ==> MaxCoveringTombstoneSeqNum=10key=d,sequence=9                     ==> MaxCoveringTombstoneSeqNum=8

怎么推出 MaxCoveringTombstoneSeqNum 值的直接看下图。

优化点

RocksDB 中,MaxCoveringTombstoneSeqNum 值计算可以延迟,因为一些 key 就未查到,导致该计算用不上。延迟后可节省部分 MaxCoveringTombstoneSeqNum 计算时间。

总结

本章主要解释了

1、Tombstone 的由来。

2、Tombstone 的使用场景。

3、Tombstone 的原理。

4、RocksDB 中 Tombstone 相关优化点。

代码我是看的 RocksDB,谢谢收看,欢迎交流~


http://chatgpt.dhexx.cn/article/wv4LJZ9x.shtml

相关文章

Tombstone 文件分析

Tombstone 文件分析 /* * 下面信息是dropbox负责添加的 **/ isPrevious: true Build: Rock/odin/odin:7.1.1/NMF26F/1500868195:user/dev-keys Hardware: msm8953 Revision: 0 Bootloader: unknown Radio: unknown Kernel: Linux version 3.18.31-perf-g34cb3d1 (smartcmhardc…

android Tombstone 流程

一 总述 下面是一份dump 的log&#xff1a; 810 876 I system_server: libdebuggerd_client: started dumping process 678 740 740 I /system/bin/tombstoned: registered intercept for pid 678 and type kDebuggerdNativeBacktrace 678 678 I libc : Requested du…

android tombstone log分析

今天和大家一起聊聊android 中出现的 Tombstone问题&#xff0c;近期在定制pad 上分析设备概率性重启&#xff0c;导出bugreport日志后&#xff0c;除了看到anr log外&#xff0c;同级目录下还看到了tombstones 并且对比以往日志&#xff0c;发现都生产了大量tombstone...,于是…

深入学习tombstone和signal

三驾马车&#xff08;CPU&#xff0c;内存和存储设备&#xff09;中&#xff0c;跑得最慢的就是存储设备了 电脑上&#xff0c;从HDD 到SSD&#xff0c;从SATA SSD到PCIe SSD&#xff0c;硬盘是越来越快&#xff1b; 手机上&#xff0c;从SD卡&#xff0c;到eMMC卡&#xff0…

tombstone

1.什么是tombstone 当一个动态库&#xff08;native 程序&#xff09;开始执行时&#xff0c;系统会注册一些连接到 debuggerd 的 signal handlers&#xff0c;当系统 crash 的时候&#xff0c;会保存一个 tombstone 文件到/data/tombstones目录下&#xff08;Logcat中也会有相…

Tombstone原理分析

本文主要围绕三个问题对tombstone进行分析和介绍&#xff0c;debuggerd是如何监控进程并生成tombstone的&#xff1f;tombstone文件中的信息都是什么&#xff0c;是怎么获取的&#xff1f;tombstone文件应该怎么分析&#xff1f; 一、Tombstone简介 当一个native程序开始执行时…

【date】Linux date命令修改时间的问题

Linux date命令修改时间的问题 问题路径找原因解决方法 问题 Android10&#xff1b;高通平台 使用下面date命令修改时间日期&#xff0c;时分秒生效&#xff0c;年月日不生效 > date -D YYYY-MM-DD hh:mm:ss 路径 \android\external\toybox\toys\posix\date.c \android\e…

i2ctools工具移植到android(使用NDK方式 在某android平台测试)

前提条件 主板i2c已在设备树配置status和引脚复用正常&#xff0c;即设备的i2c总线达到正常使用条件I2C device interface假设内核已配置进去 编译工具链NDK环境搭建 下载NDK 下载地址点我解压 ~/workspace/ndk$ ls android-ndk-r22b android-ndk-r22b-linux-x86_64.zip …

高通平台 Android9 adb shell “hwclock -w“ 报错

hwclock -w 报错 文章目录 hwclock -w 报错问题现象分析1. hwclock命令分析2. /dev/rtc0驱动节点分析 修改设备树后hwclock -w报错没有了&#xff0c;但是系统会重启&#xff0c;原因未知 问题现象 sdm660_64:/ # hwclock -w hwclock: ioctl 4024700a: Invalid argument分析 …

Android top命令、ps命令、busybox命令

top命令 usage: top [-Hbq] [-k FIELD,] [-o FIELD,] [-s SORT] [-n NUMBER] [-m LINES] [-d SECONDS] [-p PID,] [-u USER,]Show process activity in real time.-H Show threads -k Fallback sort FIELDS (default -S,-%CPU,-ETIME,-PID) -o Show FIELDS (def PID,USER,PR,N…

OpenHarmony啃论文俱乐部—盘点开源鸿蒙引用的三方开源软件[1]

目录这里写自定义目录标题 OpenHarmony third_party三方库&#xff1a;学术研究和参与开源的结合third_party_openh264third_party_ninjathird_party_gnthird_party_markupsafethird_party_toyboxthird_party_gstreamerthird_party_ffmpegthird_party_mtdevthird_party_flutter…

Android缺少awk工具的几种解决方法

在日常测试中&#xff0c;我们会用到各种各样的Android平台&#xff0c;用于测试存储设备的性能。其中&#xff0c;我们依赖到Android平台自身的工具&#xff0c;通过编写shell脚本来实现测试存储设备的性能。   而awk工具(shell命令)在shell脚本中会经常用到&#xff0c;一般…

toybox 和 busybox 的作用

来自知乎&#xff1a;程序员秘书 ##前言## 我们在做android开发时&#xff0c;经常会有在板子系统里要修改文件内容对比验证问题&#xff0c;或者要操作特殊的shell命令操作看些信息&#xff0c;等等一些需求。但是往往会因为刷到板子的系统里默认没有/不支持相关的命令&…

欢乐听:一个简洁的瀑布流模式的音乐分享站

欢乐听 一个简洁的瀑布流模式的音乐分享站。

分享5个高质无损音乐网站,歌曲很丰富,爱听歌的小伙伴有耳福了

生活中很多人都离不开音乐&#xff0c;散步的时候听音乐&#xff0c;等待的时候听着音乐&#xff0c;心情不好的时候听音乐&#xff0c;不管走到哪&#xff0c;有音乐的陪伴一点也不寂寞&#xff0c;不同音乐的旋律给我们带来不同的心情&#xff0c;今天小编就给爱听音乐的小伙…

【音乐】收藏的300多首抖音神曲,MP3音乐分享,近一年的抖音歌曲

今天给大家分享N多&#xff08;300&#xff09;首抖音神曲。抖音大家都知道&#xff0c;各种火&#xff0c;各种原因&#xff0c;其中的BGM(背景音乐)更是起到了至关重要&#xff08;画龙点睛&#xff09;的作用&#xff0c;不知道是哪个大神搞的&#xff0c;去年我搞视频的时候…

搭建一个点歌QQ机器人,另外还能看美女

目录 前言具体实现1、爆照2、生日书3、获取歌词和分享音乐 完整项目下载地址&#xff08;配置了python环境&#xff09;完整项目下载地址&#xff08;电脑没有python环境&#xff09; 前言 完整项目&#xff0c;包括框架、代码和详细使用说明可以去社区下载&#xff08;下载完…

基于java的音乐网站的设计与实现

欢迎添加微信互相交流学习哦&#xff01; 项目源码&#xff1a;https://gitee.com/oklongmm/biye 基于java的音乐网站的设计与实现 摘 要 随着互联网和宽带上网的普及&#xff0c;网络传输以其特有的快速、高效、便捷的传输方式越来越被人们接受。在当今社会的影响下&…

android wifi传输音乐,让你通过WiFi分享手机上的歌曲,音乐共享软件MyStream十一发布Android版...

MyStream原来是 iOS上的音乐共享应用&#xff0c;十一期间&#xff0c;它将跨出iOS平台&#xff0c;首次推出Android版音乐共享服务。 MyStream和主流的Pandora、Spotify、Turntable.fm、Songza这些音乐分享服务并不一样。它将手机上的本地音乐通过WiFi或蓝牙和周围的设备进行音…

竞品分析:网易云音乐和QQ音乐,音乐类app的战场

文章从产品的角度分别分析两款产品的行业市场、功能、业务模式以及运营策略&#xff0c;进一步了解两款产品的差异与不同。 一、产品概况 1. 产品概述及版本 网易云音乐是一款专注于发现与分享的音乐产品&#xff0c;依托专业音乐人、DJ、好友推荐及社交功能&#xff0c;为用…