rocksdb采用的lsm tree的数据结构来存储key value数据。
所有修改保存在内存中,达到一定量后,批量写入到磁盘中,写入前会做个合并,不排序。
1.将key value预写入到磁盘的日志中(wal动作)(以防断电,内存中丢失)(有个sync_log参数,如果true,那会直接写入磁盘中,不经过操作系统缓存,防止宕机导致操作系统的缓存被清空)(如果2个,当数据落盘sst后,wal文件就可以覆盖了)
2.将key value写入到memtable中。(write buffer_size,当量达到改参数后,被转存到immutable memtable,然后会重新开辟一个memtable给后面的数据使用。)(读也是从memtable中读)
3.当immutable memtable有一个时,就会刷到磁盘中,生成sst文件(ssd table)(write stall=5,表示有5个immutable memtable时,数据库认为你生成immutable memtable太快了,开始对memtable写入限速。日志中会记录write stall。也是一个参数。)
数据写入到wal磁盘日志中,然后写入到memtable中,这时一次写入结束了,1次磁盘io,1次内存io。后面的由后台进程继续。
Level 0就是immutable memtable的复刻。达到4个,向下一个走(动作叫compaction)。
按照key排好序,二分查找法找key(因为是排好序的),找key如果在,返回,不在,找另外文件。
在level 0达到4个,做压缩、key排序的动作(compaction),压成1个sst文件。
Level 1达到256m,做压缩、key排序的动作,压缩成level2的sst。以此类推。
Level 0 4个
Level 1 256m
Level 2 2.5g
Level 3 25g
Level 4 250g
删除了的话,在读取的时候,memtable这边看到key=xxxx没有。
插入操作:
Block cache中缓存着最近最常读的数据
Block cache——memtable——immutable memtable——level0——level1.。。。。。。。。
如果key1 开始是张三,在level3,后面改了叫李四,在level2中,那他读到level2就出结果了。
某个sst的读取就是上一层所有文件的集合。
找key数据的时候,每个sst文件会给出最大值和最小值,如果key在次中,就二分法继续找,不在就下一个文件。
每个文件都有bloom filter(过滤器),如果它说这个key不在这个文件里,那key肯定不在里面,如果说在,那不一定在里面。
Column family(cf、列簇)(数据分片技术)
每个cf有自己的block cache、memtable、immutable memtable、sst。多个cf共享几个wal(默认3个)
不同的cf存不同的一张表或者几张表。
写的时候可以指定某个cf
Write (cf1,id,name,………)
Write (cf2,id,adree……….)
不指定cf,就是默认到default列簇中。