自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 既然编译器可以判断一个函数是否适合 inline,那还有必要自己加 inline 关键字吗?

并且这个不同是有意为之,而不是粗心大意(虽然这个可能性很低,但不代表不存在),那么这个优化产生的行为将。

2022-11-24 14:15:22 172 1

原创 ToplingDB 的序列化框架:优化到极致

并且这个不同是有意为之,而不是粗心大意(虽然这个可能性很低,但不代表不存在),那么这个优化产生的行为将。

2022-11-23 15:02:13 277

原创 C++ 序列化与 RPC

ToplingDB 的 分布式 Compact 中 Client-Server 交互,使用了 topling-zip 中的序列化框架,该序列化框架初版完成于 2006 年,随后基于该序列化框架,实现了一个 RPC 系统。后来整个库命名为 febird 库在 google code 上开源,再后来 google code 停止服务,febird 迁移到 github,有段时间重命名为 nark,之后重命名为 terark,目前 topling-zip 中代码的 namespace 仍是 terark。从 20

2022-11-23 14:54:39 373

原创 MyTopling 分布式 Compact(三):PropertiesCollector

在稍微复杂点的 RocksDB 应用中,都少不了使用,相对而言,PropertiesCollector 比 CompactionFilter 露脸的机会要少一些。在 MyRocks 中,PropertiesCollector 的具体实现是,用来在 Flush/Compact 过程中来收集 SST 的统计信息,MyTopling原版 MyRocks 未保存 name 字段,这里的 name 字段是 MyTopling 新增的,我们为此还向 MyRocks 提交了一个 Pull Request:。

2022-11-23 14:42:10 219

原创 ToplingDB 的序列化框架:简介

的中 Client-Server 交互,使用了中的序列化框架,该序列化框架初版完成于 2006 年,后来命名为 febird 库在 google code 上开源,再后来 google code 停止服务,febird 迁移到 github,有段时间重命名为 nark,之后重命名为 terark,目前 topling-zip 中代码的 namespace 仍是 terark。

2022-11-23 11:11:24 180

原创 ToplingDB 的序列化框架:性能

中 Client-Server 交互,使用了中的序列化框架,该序列化框架初版完成于 2006 年,后来命名为 febird 库在 google code 上开源,再后来 google code 停止服务,febird 迁移到 github,有段时间重命名为 nark,之后重命名为 terark,目前 topling-zip 中代码的 namespace 仍是 terark。

2022-11-22 18:42:06 218

原创 如何用C++实现简单的序列化/反序列化库?

然而要实现这一点并不容易,需要对 C++ 有深刻的理解和灵活的运用,作为序列化/反序列化库,C++ 的这个优势就是一个耀眼的亮点。中 Client-Server 交互,使用了中的序列化框架,该序列化框架初版完成于 2006 年,后来命名为 febird 库在 google code 上开源,再后来 google code 停止服务,febird 迁移到 github,有段时间重命名为 nark,之后重命名为 terark,目前 topling-zip 中代码的 namespace 仍是 terark。

2022-11-21 15:30:20 767

原创 ToplingDB:怎样展示任意 WebView

AnyPlugin 是一个纯抽象类,其中包括 Update 和 ToSring 两个函数需要派生类实现。public:};注意在我们实现 HTML 展示时,不会用到 Update 函数,但是依然需要将其定义出,且为空。在 ToString 函数中,我们仅需要传入其第一个参数 dump_options,但我们可以不对这个参数做任何操作。

2022-11-15 14:46:51 63

原创 MyTopling 分布式 Compact(二):CompactionFilter

在稍微复杂点的 RocksDB 应用中,都少不了使用 CompactionFilter,虽然可以直接在 Options 中设置 CompactionFilter 对象,但我们还是更多地使用 CompactionFilterFactory,因为 CompactionFilter 经常是有状态的,而不是一个纯函数,所以需要动态创建并且在单个 subcompact 中维护其状态。

2022-11-15 14:12:42 109

转载 MyTopling sysbench 测试报告

sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。。CPU 性能,磁盘 IO 性能调度程序性能,POSIX 线程性能内存分配及传输速度数据库性能(OLTP 基准测试)sysbench 的数据库 OLTP 测试支持 MySQL、PostgreSQL、Oracle,目前主要用于 Linux 操作系统,开源社区已经将 sysbench 移植到了Windows,并支持 SQL Server 的基准测试。

2022-10-17 16:00:22 258

原创 出于什么样的原因,诞生了「协程」这一概念?

作者:雷鹏链接:https://www.zhihu.com/question/50185085/answer/2685219455来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。协程的理论模型是“有多个入口的带状态的函数”,通常我们把叫做“”,所以协程也就是“有多个入口的闭包”。所以相比“闭包”,协程是一个更加“通用”的概念。在现实世界中,我们使用协程的主要目的是把代码转化为。

2022-09-23 17:09:17 122

原创 Topling 人性化&可观测 Demo 演示页

Todis 提供了人性化的,可观测的监控页面,分别是 Grafana 监控和引擎观测 Web。这对于实时掌握数据库状态、调优、解决 bug 等非常有用。

2022-09-21 15:45:08 147

转载 多线程fork,子进程执行哪些函数是安全的?

在我们的测试中,MyTopling 的分布式 Compact Worker 一直有一个问题:经常跑着跑着,Compact Worker 就假死了,这个问题之前在多线程模型中也偶尔出现,当时经过痛苦的排错定位,最后发现是 NFS (客户端) 超时引起的,这个概率虽然很低,但有时会严重到接近卡死。直到昨天晚上,我忽然意识到,以前多线程的时候,假死的频率很低,而现在多进程,跑上几个小时,几乎必然假死……骂娘归骂娘,问题是必须要解决的,稍微搜索一下就发现,不止我们碰到了该问题(关键词。MyTopling 是基于。

2022-09-15 18:22:41 132

转载 C++11有了lambda后bind还有多大意义?

lambda 是语言层面的 feature,功能强大,性能高,而 bind 在很多时候使用起来更简洁。在现实中,至少有一种情况,一定时!注意其中使用的std::bind可以看到,BindType 至少需要占用两个指针的空间,记住这一点!std::function 的实现,一般(g++ 的 libstdc++)占用四个指针的空间,如果用来初始化 std::function 的 Functor 对象(包括函数指针、lambda……)尺寸过大,就需要通过 new 在堆上申请内存,用来保存 Functor。

2022-09-15 18:21:53 102

原创 记 MyTopling 分布式 Compact 触发的 glibc bug

在我们的测试中,MyTopling 的分布式 Compact Worker 一直有一个问题:经常跑着跑着,Compact Worker 就假死了,这个问题之前在多线程模型中也偶尔出现,当时经过痛苦的排错定位,最后发现是 NFS (客户端) 超时引起的,这个概率虽然很低,但有时会严重到接近卡死。直到昨天晚上,我忽然意识到,以前多线程的时候,假死的频率很低,而现在多进程,跑上几个小时,几乎必然假死……骂娘归骂娘,问题是必须要解决的,稍微搜索一下就发现,不止我们碰到了该问题(关键词。MyTopling 是基于。

2022-09-09 14:07:33 210

转载 MyTopling Query Plan 的改进 (records_in_range)

对 Fast Table,它使用的 CSPP 索引不是 BTree,CSPP 为了结构的紧凑和并发性能,其结点没有存储任何冗余信息,从而不能象 BTree 一样,仅通过靠近根部的结点就能得到近似的信息,好在 CSPP 的搜索极快,所以能快速地定位到具体的 Key,然后得到其中存储的 ValueOffset,就能计算出 Value 的 ApproximateSize 了,为了更准确,我们还得把 CSPP 索引所占的空间平摊到每条 KV 上,总体上还是比较简单的。它占的时间,竟然比真正干活的代码还要多!

2022-09-05 17:12:51 78

转载 MyTopling 索引:双数组 DoubleArray Trie Cache

因为其(精确的)时间复杂度是 O(log2(n)),100亿条,就需要平均 34 次内存访问,当然,因为 CPU Cache 的存在,真正的内存访问可能是 20 多次,在实测中,这比 NLT 的搜索还要慢得多(大约 3 倍),相比 NLT,其优势就只有遍历(iteration)。在使用 NLT 对索引数据进行压缩之前,是难以预判最终的压缩率的,所以,我们最近做了一个改进:在 Key 长度固定的情况下,如果创建出来的 NLT 压缩率太差,我们就使用新的索引:FixedLenKeyIndex。

2022-09-05 10:20:54 107

转载 MyTopling 中的 iterator 缓存

MyTopling 即将开源,开源的同时,我们会推出 DBaaS 内测版,欢迎大家体验,进入官网,扫码加入 Topling 用户群!

2022-08-31 16:16:33 67

转载 大道至简,事半功倍:MultiGet IO 并发在 ToplingDB 中的协程实现,以及在 MyTopling 中的落地应用

接下来,我们看 fiber_aio_read 是怎么使用 fiber 和 io uring 的,io uring 的原理和用法,有很多非常优秀的介绍文章,所以这里我就不再唠叨了。io_uring_submit_and_wait 返回后,我们就开始收割 io 执行的结果,对于每一个 io 执行的结果(我们自定义的io_return),我们切换回(以这样的方式,整个执行链路上的代码无需任何改动,具体到我们这个 MultiGet 实现,就是 get_in_sst(i) 调用的。...

2022-08-26 18:58:02 245

转载 代码修改的微创手术法:RocksDB MultiGet 的协程优化,10 行代码提升 10 倍性能

在 RocksDB 中,MultiGet 就是干这个事的,不过在当时的 RocksDB 中,MultiGet 基本上就是顺次执行各个 Key 的 Get,并没有进行任何(针对 IO 的)优化。boost fiber 大概是最优秀的(有栈)协程实现了,所以我一开始就选择了它,但是在读 fiber 代码时,还是发现了很多可以优化的点,所以,我对 boost fiber 做了。,只要上层使用了这个接口,上层的任务就完成了,至于如何优化,是下层存储引擎的事情。的 IO 优化,查看一下代码,各种相关改动,

2022-08-23 15:23:09 593

转载 为什么 ToplingDB 不需要针对反向扫描做优化

按照 ToplingDB 的设计哲学,至少在软件层面,反向扫描没有理由比正向扫描更慢。然而,这个被我们认为是自然而然的事情,却被很多主流的数据库认为是极难实现,甚至不可能实现的。于是,他们发明了一种叫做降序索引。

2022-08-23 14:22:46 62

转载 ToplingDB 的 CompositeUintIndex

在CO-Index 中,除了,还有。

2022-08-19 15:52:29 45

转载 ToplingDB 的 UintIndex

在 ToplingDB 的 CO-Index(Compressed Ordered Index) 家族中,Nest Succinct Trie 是的。但是,伴随的,往往是。我们针对一些特殊场景,采用了特殊的实现,用以提高性能……这里面,最特殊的一类 Index,就是 UintIndex,顾名思义,就是 Key 为 unsigned int 时的 index。

2022-08-19 15:49:06 49

转载 自定义 Comparator 与自定义 Encoding

从而,它的 Comparator,还分为 User Comparator 和 Internal Comparator,User Comparator 就是用户提供的 Comparator,Internal Comparator 只是在 User Comparator 的基础上,增加了对 SeqNum 和 OpType 的比较。...,都有一个必不可少的 Comparator,这个 Comparator 定义了 Key 的顺序。,只要我们看到这个名字,我们就知道,不管它是怎么实现的,它的行为一定是“

2022-08-19 15:29:45 176

转载 ToplingDB CSPP MemTable

架构上的改进,如果没有高效的实现来验证,总是缺乏一些说服力,我们经过不懈的努力,在算法层面获得了 8 倍以上的性能提升,同时 MemTable 的内存用量还大大降低。表对应到存储引擎上:name 字段就是 key,count 字段是 value,对于一般的场景,value 尺寸是远大于 key 的,但在这个场景中,key 的尺寸却远大于 value,一下就命中了 MyRocks 的软肋……新的 MemTable 不能无缝 plugin,这个缺陷我们也曾经提交过相关的 Pull Request(也未被接受)

2022-08-19 15:16:06 79

转载 把 C/C++ 的变参宏玩出花样

时,开发的一个技巧,其核心是获取变参宏参数列表的长度(这个是在网上看到的,讲述该技巧的文章很多),以此为机制,构建了一个方法体系。以这样的方式,我们可以在 C 语言的语法范围内,实现 C++ 中仅根据参数个数的 overload ,于是,我们可接解决系统调用。现在,我们来实现一个在 C++ 中使用起来更方便的 printf,首先,我们实现一个参数变换。个固定参数,再加一个可变参数列表,其展开为固定参数列表的最后一个参数 XX。,将宏的参数使用多次,并且每次都展开为不同的形式。代表的参数列表长度为 N 时,

2022-08-19 15:00:14 142

转载 在 C 语言中实现模板函数的方法

第一种方法,易于跟踪调试,但是效率低下,适用于对可变函数(函数指针)的效率要求不高,但程序出错的可能性较大(复杂),模板函数(Sum)本身很复杂,模板参数也比较复杂(add)的场合。第二种方法,效率高,但很难跟踪调试,在模板函数和模板参数本身都很复杂的时候更是如此。第三种方法,是我最近几天才想出的,我认为是最好的,在模板参数(Add)比较复杂时可以用函数(第二种也可以如此),简单时可以用宏,并且,易于调试。在模板函数本身很复杂,而模板参数比较简单时更为优越。但是,可能有点繁琐。

2022-08-19 14:56:08 99

转载 支持 并、交、差 的多正则引擎

这个测试页面可以看到一些例子和相应的 DFA/NFA 状态转移图,当初我做这个页面的初衷是为了辅助调试。

2022-08-19 14:49:14 94

转载 AC 自动机的实现(使用双数组 DoubleArray Trie 树)

关于,有太多的文章在讲述它的原理,讲述者借此来展示自己的算法能力。但其实AC自动机的原理很简单,真正困难的地方在于一个高效的!

2022-08-19 14:44:41 352

转载 CompactionFilterFactory As SidePlugin

中的所有符号可能都不会被其它文件中的代码引用,在这种情况下,如果将 my_filter.o 编译为静态链接库,再把该静态链接库链接到可执行文件时,my_filter.o 将会被链接器删除,所以,插件必须以 .o 的形式或动态库(.so)的形式被链接,不能以静态库的形式被链接!来管理和配置 CompactionFilterFactory,我们就需要修改一点代码,主要是将我们自定义的 CompactionFilterFactory 注册到 SidePlugin 体系。,导入该配置,打开 db。

2022-08-19 14:30:59 48

转载 C++ Enum Reflection

简而言之,编程语言中的反射(Reflection)指的是从运行时中获取语言本身的类型等信息。C++ 缺乏这样的机制,对于最简单的 enum 类型,我们或许可以实现带有反射功能的 enum。我们实现了几个宏,通过宏定义的 enum,就自动地拥有反射功能。// 可在任意 namespace 中调用,不可在 struct/class 内调用// 可在 struct/class 内调用,不可在任意 namespace 中调用。

2022-08-19 11:01:53 368

转载 MyTopling 解决的 MyRocks Bug: create index 引发的内存问题

好在问题的解决并不难:我们只需要周期性地 Refresh Iterator 就可以了,最简单的方案就是,记住当前 Key,释放旧的 Iterator,用(跟旧Iterator相同的快照)创建一个新的 Iterator(但是会绑定新的 Version 对象),再 Seek 到记下的 Key 中,然后一切继续。一边创建索引,一边持续高负载写入,这样的应用场景不多,这是好事,也是坏事,说它是好事,是因为避免了致命问题,说它是坏事,是因为只要不出事,这个问题就一直被掩盖着,从 MyRocks 诞生一直掩盖至今!..

2022-08-15 14:47:34 85

转载 MyTopling 分布式 Compact(一):从多线程到多进程

我们先看单个 MyTopling 实例的集群架构:从图中可以看到,除了传统的多副本(传统主从 或 Raft)之外,MyTopling 还多了一个 Compact Worker Cluster,这个 Cluster 还有那么多结点,这不是要消耗更多的硬件资源吗?但是,作为云原生 DB 提供商,我们是有很多个MyTopling 实例的!重要的话要说三遍:是很多个,很多个,很多个:同一个Compact 集群服务很多个MyTopling DB 实例,这里面的关键点很多个。...

2022-08-15 11:32:17 136

转载 MyTopling 的 AutoSort SST

这个方案,就是一个标准的,教科书式的外排序实现,非常适合 MyRocks + RocksDB 这样的组合,跟 DB 中其它组件的性能比较相配,但是在 MyTopling 中,DB 其它组件的性能有了极大的提升,这样的处理方式就显得太慢了。MyTopling 创建索引时会使用 bulk_load,而索引的 Value,在绝大多数情况下,都是空的,而我们的 AutoSort SST,是支持变长 Value 的,自然就有变长 Value 的成本。这在火焰图中原本是几乎完全看不到的,却成了新的热点。...

2022-08-11 14:20:16 202

转载 Topling CSPP MemTable 开源啦

memtablerep_bench 测试的是 MemTable 本身的性能,虽然相比直接测试 CSPP 算法损失了不少性能,但相比 SkipList 仍体现出巨大的优势。的组件,跟 ToplingDB 是松耦合的,所以未使用 submodule,而是在编译 ToplingDB 的时候,会自动 clone 并获取最新版。CSPP MemTable 是。...

2022-08-09 14:23:33 90

转载 RocksDB有哪些好的文章和资料(markDY)?

作者祖师爷链接https来源知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2022-07-27 18:39:42 124

转载 Todis的性能那么强,真是因为分布式Compact吗?

首先,(外存版Redis)的性能优势,主要来自底层的存储引擎,fork自RocksDB,增加了很多改进,修改了一些bug,其中有很多修改也。目前Todis仍在中,可通过快速开始。

2022-07-27 18:36:08 145

转载 ToplingDB 省略 L0 Flush

ToplingDB fork 自 RocksDB,自然而然地兼容了 RocksDB 的生态,但是,兼容 RocksDB 有优点,就自然有缺点,例如 RocksDB 的 L0 Flush 在我们看来就完全是多余的,但是,要去掉 L0 Flush,并且在 RocksDB 的巨大的 Code Base 上动刀,难度杠杠的,不过,至少,我们的思路是清晰的:副本数多了,最重要的不是浪费内存和磁盘空间(因为 L0 的数据总量并不大),而是浪费 CPU 和内存带宽,最最严重的是浪费 IO 带宽,并且因为 Flush 是在

2022-07-19 16:06:42 72

转载 ToplingDB 的 Enum Reflection

简而言之,编程语言中的反射(Reflection)指的是从运行时中获取语言本身的类型等信息。C++ 缺乏这样的机制,对于最简单的 enum 类型,我们或许可以实现带有反射功能的 enum。 我们实现了几个宏,通过宏定义的 enum,就自动地拥有反射功能。3. 支持的功能3.1 函数支持的函数都定义在全局 namespace 中:3.2 举例说明:上面的宏展开会生成以下代码:4. 应用场景最典型的应用场景莫过于处理配置信息,把用户配置的字符串,转化为 Enum 值,写

2022-06-30 19:02:16 57

转载 ToplingDB 的 旁路插件化

在 RocksDB 中,有大量 这样的类,例如 ,它用来实现 SST 文件的插件化,用户要换一种 SST,只需要配置一个相应的 即可,这其实已经很灵活了。这种简单的 Factory 机制存在两个问题:当年在 中,我为了实现无缝集成 ,避免用户修改代码,使用了一种非常 Hack 的方案:在 中拦截配置,如果发现了相关的环境变量,就启用 。 这样就允许用户不用修改代码,只需要定义环境变量就能使用 。这种配置方式实现了 TerarkDB 当时的预期目标,但只是一个简陋的补丁!作为一个完备的、系统化的解决方

2022-06-30 18:58:41 132

新发布:兼容 MySQL 的云原生数据库 MyTopling 使用教程

大家好,今天跟大家介绍一款 Topling 的新产品——MyTopling。MyTopling 是基于 ToplingDB ,兼容 MySQL 的 云原生数据库,ToplingDB 和 MyTopling 的关系,相当于 InnoDB 和 MySQL 的关系。 MyTopling 是真正的云原生数据库,架构上基于存储计算分离,并且实现了前台计算与后台计算的分离,把耗费 CPU 最多的后台计算转移到了专门的计算集群中,这是 MyTopling 特有的一个优势,市面上的其它数据库都还没有做到这一点,例如亚马逊的 Aurora 和阿里云的 PolarDB。 同时,MyTopling 还拥有非常优异的压缩能力,相比原版 MySQL,能节省 5 倍以上的存储空间,并且提供更高的查询性能。MyTopling 还有很多其它的优势,具体详情可以看我们详细的测试报告。 现在,MyTopling 已经开放邀请内测,接下来,让我们一起来体验一下内测流程。

2022-09-22

云原生数据库 Todis 使用教程

由第三方数据库厂商 Topling 出品。 Todis 是 Redis On ToplingDB,兼容 Redis 的分布式数据库,但 Todis 的数据是存储在硬盘上的。 同时,Todis 是基于公有云的托管 Redis 服务,对用户可以 即刻交付,立马可用。 另外,Todis 性能优异,价格低廉,目前处于内测期间,完全免费。 Todis 在性能上远优于竞品,同时能够最大限度的为用户节省成本,真正做到为企业降本增效。 用户所属行业广泛,垂直电商、出海用户、在线游戏、咨询新闻、社交网络等互联网企业为主。

2022-09-20

新发布:兼容 MySQL 的云原生数据库 MyTopling 使用教程

大家好,今天跟大家介绍一款 Topling 的新产品——MyTopling。MyTopling 是基于 ToplingDB ,兼容 MySQL 的 云原生数据库,ToplingDB 和 MyTopling 的关系,相当于 InnoDB 和 MySQL 的关系。 MyTopling 是真正的云原生数据库,架构上基于存储计算分离,并且实现了前台计算与后台计算的分离,把耗费 CPU 最多的后台计算转移到了专门的计算集群中,这是 MyTopling 特有的一个优势,市面上的其它数据库都还没有做到这一点,例如亚马逊的 Aurora 和阿里云的 PorlarDB。 同时,MyTopling 还拥有非常优异的压缩能力,相比原版 MySQL,能节省 5 倍以上的存储空间,并且提供更高的查询性能。MyTopling 还有很多其它的优势,具体详情可以看我们详细的测试报告。 现在,MyTopling 已经开放邀请内测,接下来,让我们一起来体验一下内测流程。

2022-09-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除