我们首先对MemTable、SSTable、Block这些模块实现读接口,代码可见:src/MemTable.zig,src/block.zig,src/ss_table.zig,这里单独简单介绍下SSTable的读接口实现思路,其他的模块实现思路类似,感兴趣的直接阅读源码即可。 复制 pub const SsTableIterator = struct { allocator: std.mem.Allocator, table: SsTablePtr, blk...
现在首先实现内存的数据结构, 其实我一开始想直接用基于红黑树的std::map的, 但发现LevelDB和RocksDB使用的低层数据结构都是跳表, 主要是因为: 1. 跳表天然支持顺序遍历,适合 LSM Tree 的 Compaction 和范围查询 2. 跳表的代码实现和维护成本低 3. 跳表的插入更简单, 而红黑树需要通过左旋或右旋来保证黑色节点...
有了缓存池后我们可以更新block的读取逻辑,即在读取block时先从缓存池中查找,如果命中则直接返回,否则从磁盘中读取: // 这里的 block_cache 就是我们实现的缓存池的指针std::shared_ptr<Block>SST::read_block(size_tblock_idx){if(block_idx>=meta_entries.size()){throwstd::out_of_range("Block index ...
笔者使用 Go 语言来实现 LSM Tree 数据库,因为 LSM Tree 的实现要求对文件进行读写、锁的处理、数据查找、文件压缩等,所以编码过程中也提高了对 Go 的使用经验,项目中也使用到了一些栈、二叉排序树等简单的算法,也可以巩固了基础算法能力。适当给自己设定挑战目标,可以提升自己的技术水平。 下面,我们来了解 LSM ...
基于X-Engine引擎实现一写多读能力后,我们采用基准测试工具sysbench对性能做了摸底,主要对比了RDS(X-Engine),PolarDB(X-Engine)以及PolarDB(InnoDB)的性能。 1 测试环境 测试的client和数据库server均从阿里云官网购买。client采用ecs,规格是ecs.c7.8xlarge(32core,64G),测试sysbench版本是sysbench-1.0.20,测试的数...
基于LSM-tree引擎实现一写多读,不仅计算资源和存储资源解耦,多个节点共享一份数据还能进一步压缩存储成本。 基于LSM-tree引擎实现一写多读面临着与B+tree引擎不一样的技术挑战,首先是存储引擎日志不一样,LSM-tree引擎是双日志流,需要解决双日志流的物理复制问题;其次是...
这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期。 当然,这个其实也算是NoSQL的雏形,有助于深入了解相关数据库的内部原理概念,也有助于实际入门。 适合对数据库原理以及实现感兴趣的朋友们。
我们选择这种策略有两个原因:1)原子写入和数据完整性仅由 WAL 保证,每个写入只需要 fsync WAL 文件;2)我们将 Titan 引擎设计为 RocksDB 的插件,因此我们没有改变关键的写入路径,并将分离大值的逻辑移动到内存表刷新阶段。压缩在每个 blob 级别实现。
基于LSM-tree引擎实现一写多读,不仅计算资源和存储资源解耦,多个节点共享一份数据还能进一步压缩存储成本。 基于LSM-tree引擎实现一写多读面临着与B+tree引擎不一样的技术挑战,首先是存储引擎日志不一样,LSM-tree引擎是双日志流,需要解决双日志流的物理复制问题;其次是数据组织方式不一样,LSM-tree引擎采用分层存储,...