#wal #db

nightly bin+lib wral

持久性写入前日志

2 个不稳定版本

0.2.0 2021年3月12日
0.1.0 2020年12月5日

数据库接口 中排名第 2454

每月下载量 48

MIT 许可证

62KB
1.5K SLoC

Documentation

为 Rust 应用程序提供写入前日志。 写入前日志是数据持久性应用程序的关键组件。很多时候,将新数据(或现有数据的修改)刷新并同步到磁盘数据结构(如索引)是不高效的。写入前日志通过将写操作追加到磁盘并进行同步来促进,允许应用程序以最有效的方式预处理一批写操作并将它们写入磁盘结构。

目标

  • 将写操作序列化到追加日志文件。
  • 生成单调递增的 序列号 并将其返回给应用程序。
  • 可配置的日志文件限制,超过限制后日志文件将轮换。
  • 可配置的 fsync,以确保持久性。
  • 按单调递增的 seqno 顺序遍历日志文件中持久化的所有条目。
  • 通过 start-seqnoend-seqno 指定的子集遍历条目。
  • Wal 类型由状态类型 S 参数化。这对于使用 Wal 类型与一致性协议(如 Raft)一起使用很有帮助。
  • 对单个日志实例进行并发读写。

并发

单个日志实例可以被克隆并在多个线程之间共享以进行并发读写。所有写操作都是序列化的。虽然读写操作是互斥的,但允许并发读取。

性能

使用不同负载大小和启用 fsync 的单线程写入性能。

负载 总条目数 耗时 吞吐量
100 10000 31秒 300/s
1000 10000 31秒 300/s
10000 10000 31秒 300/s
10000 1000 3.1秒 300/s

使用恒定负载大小(每个操作100字节)和启用 fsync 的多线程写入性能。

线程 总条目数 耗时 吞吐量
1 10000 31秒 300/s
2 20000 60秒 300/s
4 40000 59秒 650/s
8 80000 54秒 1300/s
16 160000 50秒 3200/s

使用恒定负载大小(每个操作100字节)和启用 fsync 的多线程读取性能。

线程 总条目数 耗时 吞吐量
1 10000 0.15秒 66000/s
2 20000 0.28秒 71000/s
4 40000 0.38秒 105000/s
8 80000 0.62秒 130000/s
16 160000 1.10秒 150000/s

贡献

  • 简单的工作流程。Fork - 修改 - 提交请求。
  • 在创建 PR 之前,
    • 运行 make build 以确认所有构建版本均通过,无警告且无错误。
    • 运行 check.sh,无警告,无错误,所有测试用例通过。
    • 运行 perf.sh,无警告,无错误,所有测试用例通过。
    • 安装 并运行 cargo spellcheck 以去除常见的拼写错误。
  • 首选 开发者证书来源

依赖项

~4–13MB
~162K SLoC