#ceph #storage #safe #rados #librados #api-bindings

rad

使用cceph-rust的底层C绑定,为librados提供类型安全的、高级接口

9个版本 (4个破坏性更新)

使用旧Rust 2015

0.5.0 2017年9月25日
0.4.0 2017年9月23日
0.3.3 2017年9月21日
0.3.0 2017年8月9日
0.1.1 2017年6月12日

异步 中排名 #858

MPL-2.0 许可证

40KB
688

Build Status Docs Status On crates.io

rad:与RADOS交互的高级Rust库

此库为RADOS(可靠的自主分布式对象存储)提供了一个类型安全且极端高级的Rust接口。它使用来自 ceph-rust 的原始C绑定。

安装

要构建和使用此库,需要一个Ceph librados开发文件的正常安装。在具有apt-get的系统上,可以像这样获取

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
sudo apt-add-repository 'deb https://download.ceph.com/debian-luminous/ `lsb_release -sc` main'
sudo apt-get update
sudo apt-get install librados-dev

注意:luminous 是当前的Ceph版本。此库不会与Ceph/librados的早期版本(Jewel或更早;Kraken是正常的)正确或按预期工作。

有关安装Ceph软件包的更多信息,请参阅 Ceph文档

示例

连接到集群

以下示例展示了如何通过提供一个指向 ceph.conf 文件的路径、一个指向 client.admin 密钥环的路径以及请求使用 admin 用户连接,来连接到RADOS集群。此API与裸机librados API几乎没有相似之处,但它 确实 容易追踪底层的操作:ConnectionBuilder::with_userConnectionBuilder::new 分配一个新的 rados_tread_conf_file 调用 rados_conf_read_fileconf_set 调用 rados_conf_set,而 connect 调用 rados_connect

use rad::ConnectionBuilder;

let cluster = ConnectionBuilder::with_user("admin").unwrap()
    .read_conf_file("/etc/ceph.conf").unwrap()
    .conf_set("keyring", "/etc/ceph.client.admin.keyring").unwrap()
    .connect()?;

.connect() 返回的类型是 Cluster 处理句柄,它是对 rados_t 的包装,保证在连接被丢弃时执行 rados_shutdown

使用同步I/O将文件写入集群

use std::fs::File;
use std::io::Read;

use rad::ConnectionBuilder;

let cluster = ConnectionBuilder::with_user("admin")?
    .read_conf_file("/etc/ceph.conf")?
    .conf_set("keyring", "/etc/ceph.client.admin.keyring")?
    .connect()?;

// Read in bytes from some file to send to the cluster.
let file = File::open("/path/to/file")?;
let mut bytes = Vec::new();
file.read_to_end(&mut bytes)?;

let pool = cluster.get_pool_context("rbd")?;

pool.write_full("object-name", &bytes)?;

// Our file is now in the cluster! We can check for its existence:
assert!(pool.exists("object-name")?);

// And we can also check that it contains the bytes we wrote to it.
let mut bytes_from_cluster = vec![0u8; bytes.len()];
let bytes_read = pool.read("object-name", &mut bytes_from_cluster, 0)?;
assert_eq!(bytes_read, bytes_from_cluster.len());
assert!(bytes_from_cluster == bytes);

使用异步I/O和 futures-rs 将多个对象写入集群

rad-rs 还支持librados AIO接口,使用 futures crate。此示例将并发启动 NUM_OBJECTS 个写入,然后等待它们全部完成。

use std::fs::File;
use std::io::Read;

use rand::{Rng, SeedableRng, XorShiftRng};

use rad::ConnectionBuilder;

const NUM_OBJECTS: usize = 8;

let cluster = ConnectionBuilder::with_user("admin")?
    .read_conf_file("/etc/ceph.conf")?
    .conf_set("keyring", "/etc/ceph.client.admin.keyring")?
    .connect()?;

let pool = cluster.get_pool_context("rbd")?;

stream::iter_ok((0..NUM_OBJECTS)
    .map(|i| {
        let bytes = XorShiftRng::from_seed([i as u32 + 1, 2, 3, 4])
            .gen_iter::<u8>()
            .take(1 << 16).collect();

        let name = format!("object-{}", i);

        pool.write_full_async(name, &bytes)
    }))
    .buffer_unordered(NUM_OBJECTS)
    .collect()
    .wait()?;

运行测试

提供了针对演示集群的集成测试,测试套件(目前确实有些简略)使用Docker和一个从Ceph ceph/demo容器派生出来的容器,以在本地启动一个小型Ceph集群。提供了一个脚本用于启动测试套件

./tests/run-all-tests.sh

启动测试套件需要安装Docker。

许可证

本项目采用Mozilla公共许可证,版本2.0。

依赖项

~7MB
~122K SLoC