What Is LevelDB
- LevelDB is a fast key-value storage library written at Googlethat provides an ordered mapping from string keys to stringvalues.
– A Fast And Lightweight KV Storage Library,Not A DataBase
- Reference
– http://code.google.com/p/leveldb/
Three Tags
- Nosql Movement
– KV Store
- Open Source
– New BSD License
- Made In Google
– Authors
- also develop GFS\MapReduce\Bigtable\Protocol Buffers
- More Info
–http://research.google.com/people/jeff
–http://research.google.com/people/sanjay/
Birth for HTML5
- IndexedDB
- – HTML 5 客户端存储Object storage
- – History: Cookies -> Web storage -> sql Database
- – 已有执行标准之间妥协的产物
- – More Info
Leveldb Vs BigTable
- 关系和区别
Storage Category
- Embedded Store
– DB: sqlite、BerkeleyDB、innondb– KV: tokyo/kyoto cabinet、riak bitcask
- Storage Server
– RDBMS– Nosql
- tc&tt、kc&kt 、flare
- bigtable、hbase、hypertable
- mongodb、couchdb、orientdb
- dynamo 、voldmort、cassandra
- neo4j、flockdb
Code Dir.
- util---------common cache、crc、hash
- port--------multiple os support
- include----c/ c++ api
- table------- block sstable reader/writer
- db ----------memtable、commit log、snapshot、compaction
LevelDB Architecture
- Log Structured Merge Tree (LSM)
- 更新记Commit Log,写到in-memory table;
- Memory数据延迟落地到磁盘,不断打patch;
- 定期将磁盘数据sstable 在后台进行Compact.
MEMTABLE
- Dynamic Data Struct
– Order by (Key + Sequence)– frozen + active– Skiplist implemention
- 写操作是insert到list,没有删除list node操作
- 这种场景指针操作顺序保证单写多读线程安全
LOG
- Commit Log File Format
– Fix length block Array
- Pros
– 可以过滤出错记录,跳跃到正确的BLOCK
– Find next FULL or FIRST type record
- Cons
– 不支持压缩存储,空间有少量浪费(trailer)
– 每个定长block包含一条或者多条日志记录
SSTABLE
- Static Table File Format
COMPACTION
- Multiple Level Compaction
– 此level 非彼level (skiplist)– Input + Output
- Level 0: 无序多路归并
- Level n: 有序两路归并
– New数据从Level 0逐渐向Level N搬迁– 每层的新数据总量达到10^i时触发– 同一key的多次更新、部分删除被合并
Compaction Analogy
- Compaction BG Task
- 属于IO密集型任务对于正常的随机顺序读有较大影响
- 触发条件选择、带宽占比、速度控制都至关重要
Multi-Level Data
- Multi-level SSTable Data Layout
– Level 内部
- Level 0 sst 内部有序, sst之间无序,key有重叠
- Level N sst内部有序, sst之间有序,key无重叠
– Level 之间
- 新旧数据,Patch关系
Write / Read
Write
- 顺序/随机写
– 顺序记commit Log + 更新到active Memtable– 顺序写场景的compaction进行IO优化
- 纠结中权衡
Random Read
- 随机读
– 从新到旧反向Read数据
Sequential Read
- 顺序扫描
– 2 Memtables + 多Level归并
- Level 0所有sstable,其他Level部分sstable归并
- 大部分操作是对下层sstable数据的顺序扫描
- 最坏情况下需要合并Memtable 和所有level的数据
- Level 0 sstable越多,level层次越多,性能越差?
ACID 特性
- 没有提供事务相关接口,需要上层封装
– 原子性(Atomic)
- Write Ahead Log
- commit log要么成功,要么失败成为bad record
– Consistency 一致性()
- Not Relational
– 隔离性( Isolation )– 持久性(Durability)
- 可配置的sync方式Not flush every write
- 隔离性(Isolation)
– 第三级隔离性可重复读
- 先写log后更新Memtable未提交事务不会读到
- 由sequence可以保证两次读Memtable一致性
- 如何保证读写线程安全
– 写写线程:由log writer condition锁控制– 读写静态数据无需同步– 读写动态数据主要包括
» cache :多线程安全» memtable :单线程写多线程读
Cache & Arena
- Cache Sharding
– 按key做分片,分片数固定– 每个分片是功能独立的cache (hashtable + LRU)– 在分片内部加锁降低锁冲突
- Memtable Arena
– 内存池,只负责分配一次性回收– 定长block + 变长的block 链表
- 如需新block而待分配内存超过block_size/4时,直接分配相应大小的block
Performance
- Pros.
– SSD性能优异,容易Scale Up
- Cons.
– 读写比率和频率需适用– 大Value性能较差
LeveDB Discuss
- LevelDB 定位
– IndexedDB是客户端存储
- 胖客户端是趋势
- 不关心内存管理
– 只有Memtable 使用了Arena内存池–怀疑会有类似Redis内存碎片问题
– 互联网服务器应用是否适用
Optimize Discuss
- 关于优化的讨论
– increase Memtable Size
– 提高Scan顺序扫描以及compaction的多路归并性能
- 降低compaction频率,降低对读稳定性影响
– Log sync Strategy (Bad Record Skip)
– Multiple Disk Support When Compaction
– Add Bloom Filter as sstable size increase
– Less Level for speed up Read
参考:淘宝解伦
原文链接:https://www.f2er.com/nosql/203881.html