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

支持 POSIX 和 S3 统一命名空间—— Curve 文件系统 S3 网关部署实践

OpenCurve 2023-05-10
255

需求背景

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。
AI 训练业务场景下,业务希望通过 S3 接口上传训练所用到的数据集,实际训练过程中则想要使用 CurveFS 共享文件系统来实现多节点共享访问训练数据集,以及存储训练过程中产生的临时文件,并利用 CurveFS 为 AI 业务专门开发的文件/目录预热、内存缓存、本地盘缓存、分布式 KV 缓存特性,最终在低存储成本前提下的训练加速

简单来说就是想要实现 S3 协议和 Posix 协议的统一命名空间能力,两种协议上传/写入的文件可以互相访问。本文简述相关部署过程,供社区小伙伴们参考。


部署前提

1.已经部署了一套 CurveFS 共享文件存储系统;

2.已经挂载了一个 CurveFS 文件系统到服务器的 /mnt/minio-data目录上;

3.已安装 docker 运行环境;

部署 CurveFS 和挂载文件系统的操作步骤可以参考 Curve 官方部署工具 CurveAdm 的用户手册:

https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment
https://github.com/opencurve/curveadm/wiki/curvefs-client-deployment

部署步骤

这里使用 minio-s3-gateway 服务作为 S3 网关,并用 docker 进行部署,相关参考资料:

https://github.com/minio/minio/blob/RELEASE.2022-04-26T01-20-24Z/docs/gateway/nas.md

    $ docker run --privileged -p 9000:9000 \
    --name curvefs-minio-s3-gateway \
    -v mnt/minio-data:/data \
    -e "MINIO_ROOT_USER=minio-access-key" \
    -e "MINIO_ROOT_PASSWORD=minio-secret-key" \
    -e "MINIO_REGION=us-east-1" \
    --console-address ":9001" \
    docker.io/minio/minio:RELEASE.2022-04-26T01-20-24Z \
    gateway nas data
    执行上述命令就可以启动一个 CurveFS 的 minio-s3-gateway 服务,非常的简单方便。
    如果部署成功,会在屏幕上打印如下内容:
      API: http://10.88.0.18:9000 http://127.0.0.1:9000


      Console: http://10.88.0.18:9001 http://127.0.0.1:9001


      Documentation: https://docs.min.io
      Finished loading IAM sub-system (took 0.0s of 0.0s to load data).
      ...... // 以下内容省略
      Console 地址就是 web 控制台地址,可以在浏览器里直接打开访问,用户名密码是上面 docker 命令行里配置的环境变量 MINIO_ROOT_USER和 MINIO_ROOT_PASSWORD 对应的值。

      参考资料:https://min.io/docs/minio/linux/administration/minio-console.html


      功能验证

      接下来我们部署一个 minio 的客户端,来验证 S3 网关的可用性,以及 S3 网关与 CurveFS 文件系统挂载点是否可以做到统一命名空间下互相访问文件。

      部署 minio 客户端

      minio 客户端我们也是用 docker 来部署:
        $ docker run -it --entrypoint=/bin/sh minio/mc:RELEASE.2022-04-26T18-00-22Z
        执行上述命令就可以启动一个 minio 命令行工具 mc 的运行环境了。
        修改 mc 命令行的配置文件,默认是 /root/.mc/config.json (如果容器内缺少编辑器不方便修改可以在本地修改好之后用 docker cp 命令复制进去):
          { "version": "10", "aliases": { "curvefs": { "url": "http://10.88.0.18:9000", "accessKey": "minio-access-key", "secretKey": "minio-secret-key", "api": "S3v4", "path": "auto" } }}
          其中 url 就是部署 minio-s3-gateway 服务时屏幕打印的 API 地址,accessKey就是启动minio-s3-gateway容器的MINIO_ROOT_USERsecretKey就是MINIO_ROOT_PASSWORD,其他两个保持默认即可。curvefs 是 minio 集群的别名,下面会用到。
          统一命名空间功能验证
          目标1:使用 S3 创建桶并上传文件,在 CurveFS 挂载点对应目录下访问
          使用 mc 命令行工具分别进行创建桶、上传文件、列出桶内文件操作:
            $ mc mb curvefs/bucket1Bucket created successfully `curvefs/bucket1`.$ mc cp anaconda-ks.cfg curvefs/bucket1//root/anaconda-ks.cfg: 7.53 KiB 7.53 KiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 777.03 KiB/s 0s$ mc ls curvefs/bucket1/[2023-04-25 09:16:37 UTC] 7.5KiB STANDARD anaconda-ks.cfg
            在 CurveFS 的挂载点目录下列出目录和文件,并校验文件 md5 值(校验 md5 步骤省略,已确认一致):
              $ ls mnt/minio-data/
              bucket1
              $ ls mnt/minio-data/bucket1/
              anaconda-ks.cfg
              目标2:使用 S3 上传包含子目录的文件到桶内,在 CurveFS 挂载点对应目录下访问
                $ mc cp curvefs/bucket1/dir1/bigfile.500M
                ...t1/dir1/bigfile.500M: 500.00 MiB 500.00 MiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 628.02 MiB/s 0s
                在 CurveFS 的挂载点目录下列出目录和文件,并校验文件 md5 值(校验 md5 步骤省略,已确认一致):
                  $ ls mnt/minio-data/bucket1/dir1bigfile.500M
                  目标3:在 CurveFS 挂载点创建根目录及目录下的文件,使用 S3 查看桶及桶内文件
                  首先使用 dd 命令在 CurveFS 挂载点的 bucket1 目录下创建一个 10M 的文件:
                    $ cd mnt/minio-data/bucket1/dir1$ dd if=/dev/zero of=./newbigfile.10M bs=1M count=10
                    之后用 mc 命令查看桶内文件并下载后校验 md5 值(校验 md5 步骤省略,已确认一致):
                      $ mc ls curvefs/bucket1/dir1[2023-04-25 09:29:33 UTC] 10MiB STANDARD newbigfile.10M$ mc cp curvefs/bucket1/dir1/newbigfile.10M ./root/newbigfile.10M: 10.00 MiB / 10.00 MiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 76.14 MiB/s 0s

                      补充说明

                      高可用及单节点性能问题

                      这里的操作步骤均是单节点模式,如果要做到 
                      S3
                       
                      网关的高可用及防止性能瓶颈,可以在多台服务器上重复上述步骤,并给 S3 网关服务部署负载均衡服务(如 Nginx 或 haproxy 等),只需要 CurveFS 挂载的是同一个文件系统即可。
                       

                      CurveAdm 部署工具集成问题

                      本次实践是一次功能验证,后续 Curve 社区将把相关功能集成到 CurveAdm 部署工具中,方便用户使用维护。

                      minio gateway 的废弃问题

                      minio 的 S3 gateway 服务已经于 2020 年初开始逐步废弃了,但老版本的仍然可以继续使用,只需要指定版本号即可正常部署。如果有特殊需求,也可以 fork minio 的代码仓库自行定制修改。

                      参考资料:
                      https://blog.min.io/deprecation-of-the-minio-gateway/


                      ------ END. ------
                      🔥 火爆报名中:
                      2023 Curve 开发者活动来了!
                      2023 开源之夏 | Curve 邀你与中国存储软件共成长,赢万元奖金
                      Curve丨Google 编程之夏 2023 招募中
                      🔥 推荐用户案例:
                      Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
                      扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践
                      创云融达:基于 Curve 块存储的超融合场景实践 
                      🔥 推荐硬核技术解析:
                      ChunkServer 优化使用 bthread 的思考
                      通过 Samba 来使用 CurveFS 
                      Curve 块存储 IO 链路零拷贝





                      关于 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论