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
40KB
688 行
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_user
或 ConnectionBuilder::new
分配一个新的 rados_t
。 read_conf_file
调用 rados_conf_read_file
,conf_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