2 个不稳定版本
0.2.0 | 2021年3月12日 |
---|---|
0.1.0 | 2020年12月5日 |
在 数据库接口 中排名第 2454
每月下载量 48 次
62KB
1.5K SLoC
为 Rust 应用程序提供写入前日志。 写入前日志是数据持久性应用程序的关键组件。很多时候,将新数据(或现有数据的修改)刷新并同步到磁盘数据结构(如索引)是不高效的。写入前日志通过将写操作追加到磁盘并进行同步来促进,允许应用程序以最有效的方式预处理一批写操作并将它们写入磁盘结构。
目标
- 将写操作序列化到追加日志文件。
- 生成单调递增的
序列号
并将其返回给应用程序。 - 可配置的日志文件限制,超过限制后日志文件将轮换。
- 可配置的 fsync,以确保持久性。
- 按单调递增的
seqno
顺序遍历日志文件中持久化的所有条目。 - 通过
start-seqno
和end-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 |
贡献
依赖项
~4–13MB
~162K SLoC