基于DOAS文件系统接口(DFS)暴露的SPDK块设备
基于DOAS文件系统(DFS后端)暴露的SPDK块设备
整体架构
步骤
-
编译daos, 记录daos安装目录, 比如/opt/daos, 启动daos_agent, daos_engine, daos_server
-
编译spdk
git clone https://github.com/spdk/spdk.git
git submodule update –init
./configure –with-daos #指定daos include目录和lib目录
make -j 16
-
启动spdk nvmf_tgt sudo HUGE_EVEN_ALLOC=yes scripts/setup.sh
sudo ./build/bin/nvmf_tgt -m [21,22,23,24]
-
创建传输层
sudo ./scripts/rpc.py nvmf_create_transport -t TCP -u 2097152 -i 2097152
-
创建块设备: ./scripts/rpc.py bdev_daos_create daosdev0 test-pool test-cont 64 4096 # 4K * 64 = 256KB -> |4K|4K|…|
-
创建子系统: ./scripts/rpc.py nvmf_create_subsystem $subsystem -a -s SPDK0000000000000$i -d SPDK_Virtual_Controller_$i
-
子系统添加命名空间: ./scripts/rpc.py nvmf_subsystem_add_ns $subsystem disk$i
-
添加监听: scripts/rpc.py nvmf_subsystem_add_listener $subsystem -t tcp -a ${BIND_IP} -s 4420
-
nvme客户端连接: nvme connect-all -t tcp -a 172.31.91.61 -s 4420, 得到块设备后, 格式化即可使用, 如: mkfs.ext4 -F -O mmp /dev/nvme1n1
在设计方面,此 bdev 是一个名为 bdev 本身的文件,位于 DAOS POSIX 容器中,每个 io 通道使用 daos 事件队列。 每个 io 通道都有一个事件队列来支撑最佳 IO 吞吐量。 该实现使用每个设备通道的独立池和容器连接以获得最佳 IO 吞吐量
关键函数
bdev_daos_create
bdev_get_daos_engine 初始化daos引擎
bdev_daos_io_channel_create_cb 用创建通道的方式检测容器连通性, 如果在通道创建过程中,由于参数不正确而发生错误,例如: 池/容器名称错误,或其他一些内部 DAOS 错误(如达到 CART 上下文限制),bdev_daos_io_channel_create_cb() 会发出有关此类错误的信号,但是,spdk_io_device_register() 不会将它们考虑在内。 设备创建成功,返回成功的 RPC 响应并将 bdev 留在 bdev 列表中,但它完全无法使用且不可修改, 尝试在创建通道的时候连接到DAOS容器,所以在这里模拟创建一个通道,这样我们就可以在创建DAOS bdev的时候返回一个失败,而不是等到第一个通道创建的时候才发现,留下不可用的bdev注册
spdk_io_device_register 将不透明的 io_device 上下文注册为 I/O 设备。 I/O设备注册后,可以使用spdk_get_io_channel()函数返回I/O通道
spdk_bdev_register 注册一个新的 bdev。 必须从 SPDK APP线程调用此函数
|
|
关键数据结构
struct bdev_daos *daos;
struct bdev_daos_io_channel ch = {};
注意点
默认容器类型为: OC_SX (oclass SX 保证IOPS优先, 该参数用于数据冗余和保护)
思考
- daos bdev优点, 支持rdma和全闪nvme介质, 将daos后端存储能力通过通用的块暴露给应用
- 编程思想: 用最少的成本, 尽快返回RPC错误并退出; 分层解耦思想; 独立通道(优先级通道); 用户层尽量开箱即用,复用原来的接口, 降低学习成本
参考
https://github.com/ssbandjl/spdk/commit/2e283fcb67a8ee1d9b4f470f17bec57bbe3adad5
https://docs.daos.io/v2.3/user/blockdev/
https://www.cnblogs.com/whl320124/articles/10064186.html
https://rootw.github.io/2018/05/SPDK-subsys-bdev/
Author 晓兵
首发链接: https://blog.csdn.net/ssbandjl
博客: https://logread.cn | https://blog.csdn.net/ssbandjl
weixin: ssbandjl
公众号: 云原生云
- 原文作者:晓兵
- 原文链接:https://logread.cn/post/daos/daos_spdk_bdev/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。