Skip to content

ForceInjection/java-lsm-tree

 
 

Repository files navigation

Java LSM Tree 实现

License Java Maven

一个用 Java 实现的 Log-Structured Merge Tree (LSM Tree) 数据结构,包含所有 LSM Tree 的核心特性。

1. 简介与特性

1.1 什么是 LSM Tree

LSM Tree(Log-Structured Merge Tree)是一种专为写密集型工作负载优化的数据结构,核心思想是将随机写入转换为顺序写入,从而充分利用磁盘的顺序访问性能优势。它被广泛应用于现代分布式数据库系统(如 LevelDB, RocksDB, Cassandra, HBase)。

1.2 核心特性

  • 高性能写入: O(log N) 写入性能,将随机 IO 转为顺序 IO
  • 数据持久化: WAL (Write-Ahead Log) 确保崩溃恢复
  • 自动压缩: 支持 Leveled (LevelDB风格) 和 Size-Tiered (Cassandra风格) 策略
  • 并发安全: 读写锁分离,写操作互斥,读操作并发
  • 空间优化: 布隆过滤器减少无效磁盘查询
  • 高级查询: 支持范围查询 (Range Query) 和快照读取

1.3 架构设计

写入流程: Write -> WAL -> MemTable -> (满了) -> SSTable
查询流程: MemTable -> Immutable MemTables -> SSTables (按时间倒序)
分层压缩: Level 0 -> Level 1 -> Level 2 ... (自动合并与清理)

2. 循序渐进教程

本项目不仅是一个高性能的 KV 存储引擎,更是一套完整的 LSM Tree 学习资源。我们提供了8 天学习计划,循序渐进地带领你掌握数据库内核开发。

2.1 教程概览

  • 教程主页:查看完整的学习路径、设计图解与代码实现细节。

2.2 完整课程表

💡 进阶挑战:如果你已经掌握了基础,请尝试完成 Advanced Tasks 中的 12 个实战任务,将你的存储引擎打造为生产级产品。


3. 快速开始

3.1 环境要求

  • Java 8 或更高版本
  • Maven 3.6 或更高版本

3.2 安装与构建

# 克隆项目
git clone https://github.com/brianxiadong/java-lsm-tree.git
cd java-lsm-tree

# 推荐使用构建脚本
./build.sh build

# 运行测试
./build.sh test

3.3 基础使用示例

import com.brianxiadong.lsmtree.LSMTree;

// 创建实例 (数据目录, MemTable最大条目数)
try (LSMTree db = new LSMTree("./data", 10000)) {
    // 写入数据
    db.put("user:1", "Alice");

    // 查询数据
    String value = db.get("user:1"); // 返回 "Alice"

    // 删除数据
    db.delete("user:1");
} // 自动关闭资源

4. 核心文档

本项目的技术文档深入剖析了实现细节与性能优化,建议按顺序阅读:

4.1 核心原理与源码分析

4.2 测试与性能优化

4.3 运维与工具


5. 性能表现

在现代硬件环境 (Java 8, SSD) 下的基准测试结果:

5.1 核心指标

操作类型 吞吐量 (ops/sec) 延迟 (P99) 说明
顺序写入 ~700,000 1.9μs 极致的写入性能
随机写入 ~450,000 2.5μs 依然保持极高吞吐
读取 ~3,500 - 受限于磁盘 IO,需依赖缓存优化

5.2 性能特征总结

  • 写入优化: 写入性能极高,适合日志、监控等场景。
  • SSTable 分析: 百万级条目的大文件分析仅需几十毫秒。
  • 压缩开销: 开启 LZ4 压缩会增加少量 CPU 开销,但显著减少磁盘占用。

详细测试报告请参考 性能基准测试


6. 开发者指南

6.1 项目结构

java-lsm-tree/
├── src/main/java/       # 核心源码 (LSMTree, MemTable, SSTable, WAL)
├── src/test/java/       # 单元测试与基准测试
├── docs/                # 技术文档
├── tutorials/           # 循序渐进的教程
├── test-suite/          # 自动化测试脚本集
├── analyze-db.sh        # 数据库分析工具
└── build.sh             # 构建脚本

6.2 核心组件

  • MemTable: 基于 ConcurrentSkipListMap 实现的内存有序表。
  • SSTable: 自定义文件格式,包含 DataBlock、BloomFilter 和稀疏索引。
  • WAL: 使用 FileChannel 实现的预写日志,支持批量刷盘。
  • Compaction: 独立的后台线程池执行合并任务,支持插件化策略。

6.3 扩展功能与路线图

  • [✓] 基础 CRUD 与持久化
  • [✓] Leveled & Size-Tiered 压缩
  • [✓] 布隆过滤器
  • [✓] 范围查询 (Range Query)
  • [✓] 数据压缩 (LZ4)
  • [✓] 指标监控 (Micrometer)
  • T1: 范围查询反向扫描优化 (计划中)
  • T7: 异步 I/O (Group Commit) (计划中)

完整开发计划请见 Advanced Tasks


7. 贡献与许可

7.1 贡献代码

欢迎提交 Pull Request!建议先阅读 测试套件指南 确保代码通过所有测试。

  1. Fork 项目
  2. 创建特性分支 (git checkout -b feature/NewFeature)
  3. 提交更改并推送到分支
  4. 创建 Pull Request

7.2 许可证

本项目采用 Apache 2.0 许可证

7.3 作者


如果这个项目对你有帮助,请给个 Star!

About

Java LSM Tree 教学,原项目作者:@brianxiadong

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Java 76.5%
  • Shell 23.5%