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 2023年12月21日

#16 in Database implementations

Download history 193/week @ 2024-05-01 332/week @ 2024-05-08 730/week @ 2024-05-15 291/week @ 2024-05-22 57/week @ 2024-05-29 221/week @ 2024-06-05 88/week @ 2024-06-12 43/week @ 2024-06-19 317/week @ 2024-06-26 235/week @ 2024-07-03 309/week @ 2024-07-10 378/week @ 2024-07-17 99/week @ 2024-07-24 185/week @ 2024-07-31 290/week @ 2024-08-07 85/week @ 2024-08-14

每月674次下载
3 个crate中使用 (via len_mtime)

MIT/Apache

210KB
4K SLoC

CI docs.rs Crates.io MSRV Discord

Фьалль — это встраиваемый ключ-значение 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 对应用程序所需的数据持久性类型一无所知。在写入数据(insertremove 或提交一个写批)之后,您可以选择调用 Keyspace::persist,该函数接受一个 PersistMode 参数。默认情况下,每1000毫秒数据会异步地进行 fsync。另外,当键空间被丢弃时,它将尝试同步地持久化日志。

多线程、异步和多进程

Fjall 内部已同步以支持多线程访问,因此您可以根据需要克隆 KeyspacePartition,无需锁定自己。常见的操作,如插入和读取通常是锁免费的。

有关异步示例,请参阅 tokio 示例。

但是,单个键空间不能从不同的 进程 并行加载。

功能标志

bloom

使用布隆过滤器来减少非现有键的磁盘 I/O。提高点读取性能,但增加内存使用。

默认禁用。

single_writer_tx

允许打开一个事务性键空间进行单写(序列化)事务,允许 RYOW(读取你自己的写入)、fetch-and-update 以及其他原子操作。

默认启用。

稳定的磁盘格式

自1.0.0版本以来,磁盘格式是稳定的。未来的破坏性更改将导致主要版本号升级和迁移路径。

示例

在此处查看 实际示例。

并且查看 Smoltable,这是一个使用 fjall 作为其存储引擎的独立 Bigtable 启发式迷你宽列数据库。

贡献

您如何帮助?

许可证

所有源代码都根据 MIT 或 Apache-2.0 许可。

所有贡献都必须根据 MIT 或 Apache-2.0 许可。

依赖项

~4–13MB
~163K SLoC