#cache #low-latency #distributed #storage #byte-vector #sha-256

已撤销 blobnet

基于内容寻址存储的非易失性分布式文件缓存

25个版本

0.3.14 2023年6月20日
0.3.8 2023年5月29日
0.3.5 2023年3月30日
0.2.7 2022年12月30日
0.1.0 2022年7月26日

#15 in #byte-vector

Download history 14/week @ 2024-03-14 37/week @ 2024-03-28 9/week @ 2024-04-04

145 每月下载次数

MIT 协议

125KB
2.5K SLoC

blobnet

Latest Version API Documentation

一个可配置的、低延迟的用于内容寻址数据的blob存储服务器。

有关更多信息,请参阅API 文档

安装

cargo install blobnet  # install server CLI / binary
cargo add blobnet      # add to your project

作者

本库由Modal团队创建。


lib.rs:

Blobnet

一个可配置的、低延迟的用于内容寻址数据的blob存储服务器。

这充当一个非易失性的、通过网络的内容缓存。客户端可以将二进制blob(固定大小的字节数组)添加到缓存中,数据通过其SHA-256哈希值进行索引。给定哈希值和要读取的字节范围,可以检索任何blob。

存储在blobnet中的数据是本地缓存的且持久的。

提供者

blobnet的核心是Provider trait。此trait定义了所有blobnet实例共享的接口。它被这样使用

use std::io::Cursor;
use blobnet::ReadStream;
use blobnet::provider::{self, Provider};

// Create a new provider.
let provider = provider::Memory::new();

// Insert data, returning its hash.
let data: ReadStream = Box::pin(b"hello blobnet world!" as &[u8]);
let hash = provider.put(data).await?;

// Check if a blob exists and return its size.
let size = provider.head(&hash).await?;
assert_eq!(size, 20);

// Read the content as a binary stream.
provider.get(&hash, None).await?;
provider.get(&hash, Some((0, 10))).await?; // Requests the first 10 bytes.

您可以以任何顺序组合这些操作,并且它们可以并行运行,因为它们使用共享的&self接收器。每个操作的语义应独立于提供者而保持一致。

Provider trait是公开的,并提供了一些提供者,支持在本地目录、网络文件系统或AWS S3中存储。

网络服务器

Blobnet允许您将其作为服务器运行并通过网络发送数据。它通过HTTP/2协议响应blob操作。例如,您可以在本地机器上运行blobnet服务器:

export BLOBNET_SECRET=my-secret
blobnet --source localdir:/tmp/blobnet --port 7609

这指定了使用字符串语法为--source标志指定的提供者。您可以将另一个进程中的服务器作为提供者连接到

use blobnet::{client::FileClient, provider};

let client = FileClient::new_http("https://127.0.0.1:7609", "my-secret");
let provider = provider::Remote::new(client);

为什么你想在网络中共享blobnet服务器?一个用例是用于共享缓存。

缓存

Blobnet支持使用Cached提供者进行数据的两级缓存。这会将文件分割成可配置的页面大小的块,并将它们存储在本地缓存目录和内存页面缓存中。通过在非易失性存储中添加缓存,我们可以通过多个数量级加速文件操作,与网络文件系统相比,例如

use blobnet::provider;

// Create a new provider targeting a local NFS mount.
let provider = provider::LocalDir::new("/mnt/nfs");

/// Add a caching layer on top of the provider, with 2 MiB page size.
let provider = provider::Cached::new(provider, "/tmp/blobnet-cache", 1 << 21);

缓存对于访问远程blobnet服务器也非常有用。它很好地组合在一起,可以增加数据流中的更多层级,提高系统效率和网络负载。

use blobnet::{client::FileClient, provider};

// Create a new provider fetching content over the network.
let client = FileClient::new_http("https://127.0.0.1:7609", "my-secret");
let provider = provider::Remote::new(client);

/// Add a caching layer on top of the provider, with 2 MiB page size.
let provider = provider::Cached::new(provider, "/tmp/blobnet-cache", 1 << 21);

这些抽象一起允许您创建一个可配置的、非常低延迟的内容寻址存储系统。

依赖项

~68MB
~1.5M SLoC