前言
Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。
为了让大家更容易使用以及了解 Curve,我们期望接下来通过系列应用实践文章,以专题的形式向大家展示 Curve。
本篇文章是Curve块存储应用实践的第三篇,该系列文章包括:
Curve块存储应用实践一部曲之iSCSI Curve块存储应用实践二部曲之NBD Curve块存储应用实践三部曲之云主机 Curve块存储应用实践四部曲之云原生数据库 Curve块存储应用实践五部曲之性能调优
什么是 NBD
NBD (Network Block Device) 是一种网络块设备,它允许用户将远程块设备映射到本地块设备,从而实现对远程块设备的访问。

可以直接使用 dev/nbdxxx,或者把 dev/nbdxxx 设备格式化为文件系统,挂载到目录上使用。
比如:在 k8s 场景中,Curve nbd 可以作为 k8s 的本地存储,提供给 k8s 的 pod 使用。
Curve 块设备使用 nbd 的方式挂载到训练机器上,然后把 nbd 格式化为 ext4 文件系统,mount 到指定的路径。Curve 文件系统在挂载的时候,指定这个路径作为的缓存盘路径。在 AI 训练机器不能增加一个物理设备作为缓存盘的时候,就可以利用这种方式,对 Curve 文件系统进行加速。

Curve 块存储 NBD 的实现
Curve 块存储的 nbd 模块,由于 license 不兼容的原因,Curve nbd 的代码和 curve 的代码拆分到了两个库。
Curve nbd 采用 GPL license,代码在
https://github.com/opencurve/curve-nbd
Curve 采用 Apache-2.0 license,代码在
https://github.com/opencurve/curve
整体架构如下图:

把 Curve 的块设备映射到本机后,/dev 目录下就会增加一个以 nbd 开头的设备,比如 dev/nbd0。对这个 dev/nbd0 就可以像操作本地的块设备一样操作。对这个 dev/nbd0 的操作,会交给内核的 nbd 模块进行处理。然后 Curve nbd 接收来自内核中 nbd 的请求,然后调用 Curve sdk 向 Curve 块存储集群发送请求。
Curve-nbd 使用 Curve client 向 Curve 块存储集群发送请求,Curve client 是以链接库的形式提供给 Curve-nbd 使用的,在 Curve client 需要升级的时候,需要对 Curve-nbd 进行重启。Curve-nbd 重启会影响到使用该 nbd 设备的上层业务。
为了减少 Curve 升级对上层业务的一影响,我们对上层应用与 Curve Client 的耦合关系进行拆分,在两者之间加入了热升级模块NEBD。
NEBD Client:即part1,对应上层业务,包括Qemu/Curve-NBD;通过Unix Domain Socket的方式连接到指定的NEBD Server。 NEBD Server:即part2,负责接收part1的请求,并调用Curve Client进行相应处理;part2可以接收多个不同NEBD Client的请求。
Curve 块存储 NBD 的使用
Curve-nbd 的使用集成到了 CurveAdm 工具中,CurveAdm 工具的使用可参考文档 CurveAdm 使用文档。
CurveAdm 工具提供了 Curve-nbd 的挂载、卸载、查看功能。
Curve 块存储的部署参考文档 Curve 块存储部署文档。
做好前期准备工作之后,使用 CurveAdm 挂载 Curve nbd 设备。
以下操作都在 CurveAdm 中控机上进行。可以挂载、卸载 Curve nbd 设备到指定的 host,也可查询集群中所有的 nbd 设备。
映射 Curve nbd 设备到指定的 host
curveadm map <volume-user>:<volume-name> --host <host> -c client.yaml --create --size 10GB
参数说明:
<volume-user>: 该卷所属用户名,用户可自行定义 <volume-name>: 卷名,用户可自行定义 --host: 将卷挂载到指定主机,用户可自行选择,请确保该主机已被导入 --create:当卷不存在时,则自行创建 --size: 指定创建卷的大小,默认为 10GB -c: 指定客户端配置文件
当用户映射卷成功后,在相应的 host 上即能看到 CurveBS 卷对应的 nbd 设备:
lsblk | grep nbd
使用注意事项:
用户名中不能带有下划线_ 卷名必须以 为起始,如 test、/volume,并且只能有单级目录 目前卷大小只支持以 10GB 为最小单位,即创建的卷大小只能是 10GB、20GB、30GB...,依此类推 我们以 <用户名>:<卷名> 作为键来存储卷的相关信息,请勿挂载相同的卷
卸载Curve nbd设备
curveadm unmap <user>:<volume-name> --host <host>
查询Curve nbd设备
curveadm client status
Get Client Status: [OK]Id Kind Host Container Id Status Aux Info-- ---- ---- ------------ ------ --------362d538778ad curvebs client-host1 cfa00fd01ae8 Up 36 hours {"user":"curve","volume":"/test1"}b0d56cfaad14 curvebs client-host2 c0301eff2af0 Up 36 hours {"user":"curve","volume":"/test2"}c700e1f6acab curvebs client-host3 52554173a54f Up 36 hours {"user":"curve","volume":"/test3"}
<原创作者:陈威,CurveBS Maintainer>
参考[1]:
https://github.com/fujita/tgt
参考[2]:
https://github.com/opencurve/curveadm/wiki/curve-tgt-deployment#%E7%AC%AC-4-%E6%AD%A5%E5%90%AF%E5%8A%A8-tgtd-%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B


关于 Curve
Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。
GitHub:https://github.com/opencurve/curve 官网:https://opencurve.io/ 用户论坛:https://ask.opencurve.io/ 微信群:搜索群助手微信号 OpenCurve_bot




