🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
文章有点长,耐心看完应该可以懂实际原理到底是啥子。
这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期。
当然,这个其实也算是NoSQL的雏形,有助于深入了解相关数据库的内部原理概念,也有助于实际入门。
适合对数据库原理以及实现感兴趣的朋友们。
整体代码,大概1500行,核心代码大概500行。
为啥要实现一个数据库
大概2018年的时候,就萌生了想自己研发一个数据库的想法了,虽然,造轮子可能不如现有各种产品的强大,但是,能造者寥寥无几,而且,造数据库的书更是少的可怜,当然,不仅仅是造数据库的书少,而是各种各样高级的产品的创造级的书都少。
虽然,现在有各种各样的开源,但是,像我这种底子薄的,就不能轻易的了解,这些框架的架构设计,以及相关的理念,纯看代码,没个长时间,也不容易了解其存在的含义。
恰逢其时,前一个月看到【痴者工良】大佬的一篇《【万字长文】使用 LSM Tree 思想实现一个 KV 数据库 》文章给我很大触动,让我停滞的心,又砰砰跳了起来,虽然大佬是用GO语言实现的 ,但是,对我来讲,语言还是个问题么,只要技术思想一致,我完全可以用C#实现啊,也算是对【痴者工良】大佬的致敬,我这边紧随其后。
当然,我自己对数据的研究也是耗时很久,毕竟,研究什么都要先从原理开始研究,从谷歌三个论文《GFS,MapReduce,BigTable》开始,但是,论文,毕竟是论文,读不懂啊,又看了网上各种大佬的文章,还是很蒙蔽,实现的时候,也没人交流,导致各种流产。
有时候,自己实现某个产品框架的时候,总是在想,为啥BUG都让我处理一个遍哦,后来一想,你自己从新做个产品,也不能借鉴技术要点,那还不是从零开始,自然一一遇到BUG。
下图就是,我在想做数据库后,自己写写画画,但是,实际做的时候,逻辑表现总没有那么好,当然,这个是关系型数据库,难度比较高,下面可以看看之前的手稿,都是有想法了就画一下。
实现难度有点高,现在这个实现是KV数据库,算是列式数据库了,大名鼎鼎的HBase,底层数据库引擎就是LSM-Tree的技术思想。
LSM-Tree 是啥子
LSM-Tree 英文全称是 Log Structured Merge Tree (中文:日志结构合并树),是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能高的技术特点,来实现高写入吞吐量的存储系统的核心。
具体的说,原理就是针对硬盘,尽量追加数据,而不是随机写数据,追加速度要比随机写的速度快,这种结构适合写多读少的场景,所以,LSM-Tree被设计来提供比传统的B+树或者ISAM更好的写操作吞吐量,通过消去随机的本地更新操作来达到这个性能目标。
相关技术产品有Hbase、Cassandra、Leveldb、RocksDB、MongoDB、TiDB、Dynamodb、Cassandra 、Bookkeeper、SQLite 等
所以,LSM-Tree的核心就是追加数据,而不是修改数据。
LSM-Tree 架构分析
其实这个图已经表达了整体的设计思想了,主体其实就围绕着红色的线与黑色的线,两部分展开的,其中红色是写,黑色是读,箭头表示数据的方向,数字表示逻辑顺序。
整体包含大致三个部分,数据库操作部分(主要为读和写),内存部分(缓存表和不变缓存表)以及硬盘部分(WAL Log 和 SSTable),这三个部分。
先对关键词解释一下
MemoryTable
内存表,一种临时缓存性质的数据表,可以用 二叉排序树实现,也可以用字典来实现,我这边是用字典实现的。
WAL Log
WAL 英文 (Write Ahead LOG) 是一种预写日志,用于在系统故障期间提供数据的持久性,这意味着当写入请求到来时,数据首先添加到 WAL 文件(有时称为日志)并刷新到更新内存数据结构之前的磁盘。
如果用过Mysql,应该就知道BinLog文件,它们是一个道理,先写入到WAL Log里,记录起来,然后,写入到内存表,如果电脑突然死机了,内存里的东西肯定丢失了,那么,下一次重启,就从WAL Log 记录表里,从新恢复数据到当前的数据状态。
Immutable MemoryTable
Immutable(不变的),相对于内存表来讲,它是不能写入新数据,是只读的。
SSTable
SSTable 英文 (Sorted Strings Table) ,有序字符串表,就是有序的字符串列表,使用它的好处是可以实现稀疏索引的效果,而且,合并文件更为简单方便,我要查某个Key,但是,它是基于 某个有序Key之间的,可以直接去文件里查,而不用都保存到内存里。
这里我是用哈希表实现的,我认为浪费一点内存是值得的,毕竟为了快,浪费点空间是值得的,所以,目前