badgerdb
文章平均质量分 75
林凡_123
这个作者很懒,什么都没留下…
展开
-
badgerdb中的logfile
logfile是一种日志结构,用来记录日志,lsm tree是日志追加写的模式,在bagerdb中,vlog和sst在磁盘中的存放方式都是使用的logfile结构。原创 2023-08-24 22:06:30 · 197 阅读 · 0 评论 -
badgerdb 压缩合并
同一层的同一个table只能是一个压缩协程占用。第0层的table表和table之间的排列不是按照sst的范围来排的,只是按照写入的时间顺序来排,非0层table表之间按照sst的范围来排,非0层选择待压缩的table就直接从第0个开始,即写入时间最旧的,如果和下一个table表有交集就也需要加入,下一个table表的范围没有交集就退出。先按提交的时间把合并层的tbale表排序,提交时间早的优先被挑选到,挑选出来的table有最大和最小的key,在待合并的下一层找到和这个范围有交集的table表。原创 2023-08-24 20:10:03 · 307 阅读 · 0 评论 -
badger的写过程
当value的长度大于默认1M就先写vlog,再插入lsm tree,小于1M的就直接插入lsm tree,这种方式的写入主要是为了k,v分离,lsm tree里面不存大的value,在lsm tree合并压缩的时候就不需要读写大value,整体减少磁盘资源的消耗。memtable在内存上用的是一个跳表的数据结构,在磁盘上是一个以.mem结尾的文件,写memtable是先把entry写入文件,再修改跳表里面的内存。目录下的文件,用来保护目录只能被一个进程打开,避免多进程badger同时打开这个目录。原创 2023-08-24 21:42:52 · 253 阅读 · 0 评论 -
badgerdb里面的事务
创建一个事务的时候,要进行授时txn.readTs = db.orc.readTs(),这个时间是一个递增的序列,接下来主要来分析一下db.orc.readTs()这个函数,获得readTs后会等待readTs这个时间戳提交的事务彻底写入LSM tree后才返回,保证了不会。但如上图,如果事务 t2 在执行时,多次读某个记录 x 的状态,在事务 t1 未启动前,发现 x = 2,在事务 t1 提交后,发现 x = 3,这便出现了不一致。多个事务执行时,不能受并发的事务的影响,后面会详细的说隔离级别。原创 2023-08-17 07:50:07 · 1045 阅读 · 1 评论 -
badger的mainfest文件解读
ReplayManifestFile函数在回放数据的时候,是在重新打开数据库,数据库目录存在MANIFEST就直接从MANIFEST来读取,即使上次在写MANIFEST-REWRITE的发生断电,内存中的lsm tree的sst表修改是在后的,不会执行,不影响数据可靠性,等下次重新写MANIFEST文件的时候,就会重新把上次的脏数据擦除。mainfest文件是记录lsm tree中的各层tables表的创建删除记录的一个日志文件,主要的作用是badger数据库重启后,重新恢复内存中的各层tables表。原创 2023-08-13 17:30:37 · 226 阅读 · 0 评论