暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Curve 块存储应用实践 -- NBD

OpenCurve 2022-12-14
530

前言

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。

为了让大家更容易使用以及了解 Curve,我们期望接下来通过系列应用实践文章,以专题的形式向大家展示 Curve。

本篇文章是Curve块存储应用实践的第三篇,该系列文章包括:


什么是 NBD

NBD (Network Block Device) 是一种网络块设备,它允许用户将远程块设备映射到本地块设备,从而实现对远程块设备的访问。

Curve 块存储支持 NBD 协议,通过 NBD 技术可以把 Curve 块设备映射到本地,直接提供本地裸设备的形式进行使用。
映射到本地的 Curve 块设备以裸盘的形式存在,映射到 dev 目录下格式为 dev/nbdxxx,如 dev/nbd0。

可以直接使用 dev/nbdxxx,或者把 dev/nbdxxx 设备格式化为文件系统,挂载到目录上使用。

比如: k8s 场景中,Curve nbd 可以作为 k8s 的本地存储,提供给 k8s 的 pod 使用。

在 Curve 文件存储支持 AI 训练的使用场景中,使用格式化为 fs 的 Curve nbd 设备,作为作为的 Curve 文件系统的缓存盘。在训练节点上,同时挂载一个 Curve 文件系统和一个 Curve 块设备。

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-nbd的架构

整体架构如下图:

Curve nbd 通过内核 nbd 模块在本地映射一个块设备;同时在用户态进程会起一个进程,通过 socketpair 和 nbd 内核进行数据传输。
Curve nbd 负责从 nbd 的内核缓存中获取用户的操作请求,并转发到 Curve 进行处理;处理完成以后,再将处理结果写回到 nbd 的内核缓存,由 nbd 返回给用户。

把 Curve 的块设备映射到本机后,/dev 目录下就会增加一个以 nbd 开头的设备,比如 dev/nbd0。对这个 dev/nbd0 就可以像操作本地的块设备一样操作。对这个 dev/nbd0 的操作,会交给内核的 nbd 模块进行处理。然后 Curve nbd 接收来自内核中 nbd 的请求,然后调用 Curve sdk 向 Curve 块存储集群发送请求。

Curve-nbd的热升级

Curve-nbd 使用 Curve client 向 Curve 块存储集群发送请求,Curve client 是以链接库的形式提供给 Curve-nbd 使用的,在 Curve client 需要升级的时候,需要对 Curve-nbd 进行重启。Curve-nbd 重启会影响到使用该 nbd 设备的上层业务。

为了减少 Curve 升级对上层业务的一影响,我们对上层应用与 Curve Client 的耦合关系进行拆分,在两者之间加入了热升级模块NEBD

NEBD采用client/server的架构:
  • NEBD Client:即part1,对应上层业务,包括Qemu/Curve-NBD;通过Unix Domain Socket的方式连接到指定的NEBD Server。
  • NEBD Server:即part2,负责接收part1的请求,并调用Curve Client进行相应处理;part2可以接收多个不同NEBD Client的请求。

part1取代了 Curve Client 直接与上层业务对接。这种情况下,part1的升级也会影响上层业务,所以在设计中,尽量减少了part1的处理逻辑,只进行请求转发,以及有限的重试逻辑。这样part1的处理逻辑尽可能简单,尽量做到不需要升级part1。
NEBD 的详细内容,可参考文档 Curve github 下的 Curve NEBD介绍
虽然 NEBD 可以减少 Curve 升级对上层业务的影响,但是毕竟是增加了一层转发,延长了 IO 路径,所以在性能上会有一定的损耗。当前 Curve 的版本还在快速迭代中,将来等到 Curve 稳定之后,可以考虑去掉 NEBD,直接使用 Client SDK 与上层业务对接。

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




            ------ END. ------
            🔥 推荐阅读:
            Curve 块存储应用实践 -- iSCSI 
            创云融达:基于 Curve 块存储的超融合场景实践 



            关于 Curve 

            Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。

            Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。

            • GitHub:https://github.com/opencurve/curve
            • 官网https://opencurve.io/
            • 用户论坛:https://ask.opencurve.io/
              微信群:搜索群助手微信号 OpenCurve_bot

            文章转载自OpenCurve,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论