RocksDB-源码分析(1)BlockTable 读源码分析
本文讨论了RocksDB的Prefetch和Async机制,在回顾LevelDB的SSTable读流程基础上,深入分析RocksDB的BlockBasedTableReader读流程、Prefetch相关函数及异步读取机制,还介绍了相关类设计和简单测试结果。包括:
- LevelDB的SSTable读流程:分为Open和Get两个步骤,Open包括文件句柄管理、Footer读取等;Get使用二分查找索引定位数据块,缓存优先读取,启用布隆过滤器且所有块未缓存读取时,与文件系统交互6次。
- RocksDB的Open流程:调用FilePrefetchBuffer预取文件尾部获取Footer,加载元索引块等,缓存关键元数据,减少磁盘I/O操作。
- PrefetchTail函数:确定预读取大小和范围,尝试文件系统预取,通过限制浪费比例确保I/O效率提升。
- Get流程:用户发起请求,经过时间戳和过滤块匹配检查,创建索引迭代器遍历索引块和数据块,最终返回结果。
- 异步读取:非阻塞操作,提高并发性,与预取结合进一步提高系统并发处理能力。
- 相关类设计:FilePrefetchBuffer负责预取缓冲区管理;BlockFetcher独立Block的异步化读取操作,结合多种缓存和Prefetch机制。
- 简单测试:生成测试命令,对比启用和禁用异步扫描的测试结果,RocksDB的Prefetch和Async机制优化了读取性能。