27个版本 (13个稳定版)
1.5.0 | 2024年8月5日 |
---|---|
1.4.0 | 2024年7月19日 |
1.1.3 | 2024年6月27日 |
0.8.0 | 2024年5月13日 |
0.1.0 |
|
#16 in Database implementations
每月674次下载
在 3 个crate中使用 (via len_mtime)
210KB
4K SLoC
Фьалль — это встраиваемый ключ-значение LSM-базированный хранилище данных, написанный на Rust. Он имеет такие функции:
- Тред-безопасный API, напоминающий BTreeMap
- 100% безопасный и стабильный Rust
- Индексация и поиск префиксов с прямым и обратным итерированием
- Снимки для различных разделов (MVCC)
- Автоматическое обслуживание в фоновом режиме
- Транзакции с одним писателем (опционально)
Каждый Keyspace
— это логическая база данных и разделена на partitions
(т.е. column families) - вы, возможно, хотите использовать только один keyspace для вашего приложения. Каждый раздел физически является одним LSM-tree и своей логической коллекцией; однако, операции записи между разделами атомарны, так как они сохраняются в едином журнале уровня keyspace, который будет восстановлен при перезагрузке.
Это не
- независимый сервер
- реляционная база данных
- широко-колонная база данных: у нее нет представления о столбцах
Ключи ограничены 65536 байтами, значения — 65536 байтами. Как и в любом другом виде хранилища данных, более большие ключи и значения оказывают большее влияние на производительность.
Как и в любом типичном хранилище ключ-значение, ключи хранятся в лексикографическом порядке. Если вы храните целочисленные ключи (например, временные ряды данных), вы должны использовать форматы big endian, чтобы обеспечить локальность.
Основное использование
cargo add fjall
use fjall::{Config, PersistMode, Keyspace, PartitionCreateOptions};
let keyspace = Config::new(folder).open()?;
// Each partition is its own physical LSM-tree
let items = keyspace.open_partition("my_items", PartitionCreateOptions::default())?;
// Write some data
items.insert("a", "hello")?;
// And retrieve it
let bytes = items.get("a")?;
// Or remove it again
items.remove("a")?;
// Search by prefix
for kv in items.prefix("prefix") {
// ...
}
// Search by range
for kv in items.range("a"..="z") {
// ...
}
// Iterators implement DoubleEndedIterator, so you can search backwards, too!
for kv in items.prefix("prefix").rev() {
// ...
}
// Sync the journal to disk to make sure data is definitely durable
// When the keyspace is dropped, it will try to persist
// Also, by default every second the keyspace will be persisted asynchronously
keyspace.persist(PersistMode::SyncAll)?;
Подробности
- Разделы (т.е. column families) с атомарными семантиками между разделами (атомарные пачки записи)
- Разделенный журнал для параллельных записей
- Снимки для различных разделов (MVCC)
- все остальное, реализованное в
lsm-tree
Для реализации LSM-tree, см.: https://crates.io/crates/lsm-tree.
Тонкость
为了支持不同类型的工作负载,Fjall 对应用程序所需的数据持久性类型一无所知。在写入数据(insert
、remove
或提交一个写批)之后,您可以选择调用 Keyspace::persist
,该函数接受一个 PersistMode
参数。默认情况下,每1000毫秒数据会异步地进行 fsync。另外,当键空间被丢弃时,它将尝试同步地持久化日志。
多线程、异步和多进程
Fjall 内部已同步以支持多线程访问,因此您可以根据需要克隆 Keyspace
和 Partition
,无需锁定自己。常见的操作,如插入和读取通常是锁免费的。
有关异步示例,请参阅 tokio
示例。
但是,单个键空间不能从不同的 进程 并行加载。
功能标志
bloom
使用布隆过滤器来减少非现有键的磁盘 I/O。提高点读取性能,但增加内存使用。
默认禁用。
single_writer_tx
允许打开一个事务性键空间进行单写(序列化)事务,允许 RYOW(读取你自己的写入)、fetch-and-update 以及其他原子操作。
默认启用。
稳定的磁盘格式
自1.0.0版本以来,磁盘格式是稳定的。未来的破坏性更改将导致主要版本号升级和迁移路径。
示例
在此处查看 实际示例。
并且查看 Smoltable
,这是一个使用 fjall
作为其存储引擎的独立 Bigtable 启发式迷你宽列数据库。
贡献
您如何帮助?
- 提问
- 或加入 Discord 服务器: https://discord.com/invite/HvYGp4NFFk
- 发布基准测试和您创建的内容
- 打开一个问题(错误报告,异常)
- 打开一个 PR
许可证
所有源代码都根据 MIT 或 Apache-2.0 许可。
所有贡献都必须根据 MIT 或 Apache-2.0 许可。
依赖项
~4–13MB
~163K SLoC