代码修改的微创手术法:RocksDB MultiGet 的协程优化,10 行代码提升 10 倍性能
1. 背景三年前,我还在努力改进曾经的 TerarkDB,其中一个改进就是通过 fiber(Coroutine 协程) 提升 MultiGet 性能。彼时 linux 的 io uring 还远未成熟,所以使用的是 aio,虽然 aio 仅支持 direct io,但是经过我的改进,MultiGet 仍获得了数量级的性能提升。2. 方案2.1. IO 模型,选择 aio如果放到现在,自然是 io
MyTopling 解决的 MyRocks Bug: create index 引发的内存问题
背景Snapshot 字面意思是“快照”,在数据库中,指的就是数据库在某个时刻全体数据的状态。假定我们在 T1 时刻创建了一个快照 A,那么通过快照 A 就只能看到 T1 时刻之前的数据,看不到 T1 时刻之后的。MyTopling 与 ToplingDBMyTopling 是基于 ToplingDB 的 MySQL,分叉自 MyRocks,ToplingDB 则分叉自 Roc
MyTopling 分布式 Compact(一):从多线程到多进程
背景MyTopling 是基于 ToplingDB 的 MySQL,分叉自 MyRocks,ToplingDB 则分叉自 RocksDB,兼容 RocksDB 接口,从而 MyTopling 可以复用 MyRocks 的大部分成果。ToplingDB 早已开源,MyTopling 也会于近期开源,目前我们正处于紧张的内部开发中ToplingDB 的一个重要功
MyTopling 的 AutoSort SST
1. 背景MyTopling 是基于 ToplingDB 的 MySQL,分叉自 MyRocks,ToplingDB 则分叉自 RocksDB,兼容 RocksDB 接口,从而 MyTopling 可以复用 MyRocks 的大部分成果。ToplingDB 早已开源,MyTopling 也会于近期开源。2. MyRocks 的 bulk_load在 MyRocks 中
Topling CSPP MemTable 开源啦
开源地址:GitHub - topling/cspp-memtable编译CSPP MemTable 是 ToplingDB 的组件,跟 ToplingDB 是松耦合的,所以未使用 submodule,而是在编译 ToplingDB 的时候,会自动 clone 并获取最新版。clone 并编译 ToplingDB(with CSPP MemTable)sudo yum
ToplingDB 的去虚拟化(devirtualization)
背景ToplingDB 是 topling 开发的 KV 存储引擎,fork 自 RocksDB,进行了很多改造,也修改了很多 RocksDB 的 bug,其中有几十个修改也给上游 RocksDB 发了 Pull Request,让即便不使用 ToplingDB 的用户也能收益,虽然 RocksDB 接受得不够积极,但是我们确实已经尽力了!本文主要来讲 ToplingDB 的去虚拟化(d
AC 自动机的实现(使用双数组 DoubleArray Trie 树)
关于 AC 自动机,有太多的文章在讲述它的原理,讲述者借此来展示自己的算法能力。但其实AC自动机的原理很简单,真正困难的地方在于一个高效的实现!对于任何一个基础算法,一个好的实现都要尽量满足:不好的实现 可悲的是,大家能找到的那些实现,最多只满足速度快的需求,因为要速度快实在是太容易了,下面这个数据结构就能满足:class AcTrie { &nb
发掘双数组Trie (Double Array Trie)的能力
描述 Double Array Trie 的文章有很多,我在这里从另一个视角来讲 Double Array Trie。首先,是 base 和 check 的更深层含义,然后再详细说一下由此引申出来的问题。 Double Array Trie 其实就是一个树形自动机(DFA),既然是自动机,最基本的概念就是状态与转移,套用图的概念,状态就是结点,转移就是边。 不过DFA比图要多出来一点东西:
hash_strmap 能有多快
看到很多使用 map<string, ….> 的代码, 也有一些使用了 unordered_map<string, …> 或者 hash_map<string, …>, 当然, hash_map 不是标准的, unordered_map 也只在 boost, tr1 和 c++0x 中可用. 从代码的简洁性和可移植性上讲
ToplingDB 源码分析:allow_fdatasync参数分析
ToplingDB fork 自 rocksdb,核心是两个 github 仓库:github 仓库内容ToplingDBfork 自 RocksDB,仅对 RocksDB 进行最少的必要的修改,从而可以对 RocksDB 保持 100% 的兼容性rocksideSidePlugin 插件体系,是 ToplingDB 的 submoduleToplingDB 对 RocksDB 做了很多
LSM 算法的原理是什么
LSM 的原理已经有很多答主写得非常详细了。目前,在实践上,RocksDB 是 LSM 的典型代表乃至事实标准,围绕 RocksDB 的各种系统与应用,已经形成了一个巨大的生态:· MySQL 的 MyRocks 存储引擎· TiDB/CockroachDB· MongoDB 的 MongoRocks· 各种外存版 Redis: ssdb, pika, kvrocks, tendis,
ToplingDB SidePlugin 配置系统
ToplingDB 配置系统当年在 TerarkDB 中,我为了实现无缝集成 TerarkZipTable,避免用户修改代码,使用了一种非常 Hack 的方案:在 DB::Open 中拦截配置,如果发现了相关的环境变量,就启用 TerarkZipTable。 这样就允许用户不用修改代码,只需要定义环境变量就能使用 TerarkZ
CompactionFilterFactory As SidePlugin
背景在稍微复杂点的 RocksDB 应用中,都少不了使用 CompactionFilter,虽然可以直接在 Options 中设置 CompactionFilter 对象,但我们还是更多地使用 CompactionFilterFactory,因为 CompactionFilter 经常是有状态的,而不是一个纯函数,所以需要动态创建并且在单个 subcompact 中维护其状态。因为 C++ 没有语
ToplingDB 的 旁路插件化
原文链接雷鹏:ToplingDB 的 旁路插件化背景在 RocksDB 中,有大量 XXXXFactory 这样的类,例如 TableFactory,它用来实现 SST 文件的插件化,用户要换一种 SST,只需要配置一个相应的 TableFactory 即可,这其实已经很灵活了。问题这种简单的 Factory 机制存在两个问题:1.要更换 Fact
ToplingDB 使用 REST Web 在线修改配置
使用 ToplingDB,可以在 json/yaml 中设置配置参数,这些配置参数在进程运行过程中是固定的,无法修改。然而,在实际应用中,在线修改配置参数是个很现实的需求。2022-03-04,我们通过内嵌的 Web Service 实现了在线修改配置的功能。主要分两大类:1. DBOptions & CFOptions在 RocksDB 体系中,DBOptions & CFOpt
MyTopling:兼容 MySQL 的云原生数据库
MyToplingMyTopling 是拓扑岭(topling.cn)开发的 MySQL 兼容数据库。MyTopling fork 自 facebook 的 myrocks-8.0.23,进行了大幅修改: 1.将存储引擎从 RocksDB 替换为 ToplingDB 2.对 myrocks 的接入层进行了深度优化 3.对 ToplingDB Transact
ToplingDB 的 Enum Reflection
1. 概述简而言之,编程语言中的反射(Reflection)指的是从运行时中获取语言本身的类型等信息。C++ 缺乏这样的机制,对于最简单的 enum 类型,我们或许可以实现带有反射功能的 enum。 我们实现了几个宏,通过宏定义的 enum,就自动地拥有反射功能。2. 用法2.2 宏定义// 可在任意 namespace 中调用,不可在 struct/cla
ToplingDB CSPP Trie 设计解析
一提到 Trie,很多人可能会想到 Double Array Trie,但是,在这里,必须断了 Double Array Trie 这个念头。这个 CSPP Trie 是要为 MemTable 服务的,所以性能需求十分苛刻,按照预期:1.插入性能至少要达到 rbtree 的 150%2.精确搜索的性能至少要达到 rbtree 的 300%3.范围搜索 (lower_bound 语义) 至少要与 r
ToplingDB的分布式Compact和RocksDB的RemoteCompaction有什么不同?
首先澄清一点:RocksDB 的 RemoteCompaction 是 Rockset 贡献的!现在开始正文:原理上,RocksDB 的 RemoteCompaction 和 ToplingDB 的分布式 Compact 是类似的。分布式 Compact 的创新点是理念,落实到工程实现上并没有多少难度。作为理念创新:● RocksDB 的 RemoteCompaction 主要是把 Compact
ToplingDB 省略 L0 Flush
ToplingDB fork 自 RocksDB,自然而然地兼容了 RocksDB 的生态,但是,兼容 RocksDB 有优点,就自然有缺点,例如 RocksDB 的 L0 Flush 在我们看来就完全是多余的,但是,要去掉 L0 Flush,并且在 RocksDB 的巨大的 Code Base 上动刀,难度杠杠的,不过,至少,我们的思路是清晰的:省略 L0 Flush1.L0 中的数据