查看原文
其他

通过 Samba 来使用 CurveFS

小马哥 OpenCurve 2023-05-17
⏰ 活动预告:Curve 社区双周会

2023 Roadmap 解读

报名并转发会议链接的前十名同学

公众号回复截图领取社区精美周边


背景

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。
Curve 共享文件存储(简称CurveFS)是 Curve 开源社区的新一代分布式共享文件存储系统,在网易已有 PB 级规模应用,其核心架构可以参考设计文档[1]:

相比传统的分布式文件系统,CurveFS 具备如下几个特色:

1. 针对 AI 训练/机器学习场景、elasticsearch/clickhouse 等大数据场景做了专门优化,支持内存缓存、本地磁盘缓存、分布式内存缓存(基于 memcached 或其他 kv 存储)等多级缓存,可对文件读写进行缓存加速并保持数据写入可靠性,支持数据预热到缓存中加速读取过程,大数据场景下使用 CurveFS+对象存储相比本地副本存储方案具备更高的性价比优势以及易用性优势
2. 基于 multi-raft 支持元数据的分区存储,具备无限扩展性,性能可随节点数线性扩展,不存在性能热点问题

3. 支持将文件数据存储到对象存储和 CurveBS 块存储上,可以做到冷热数据分层存储和生命周期管理(roadmap),数据容量可无限扩展。


Samba 介绍

Homepage: https://www.samba.org/

Samba 是目前最流行的文件和打印机共享软件之一。得益于它良好的兼容性,可以轻松地跨平台(Windows/Linux/MacOS),以及灵活的可定制性和可配置性,受到了各个系统的广泛支持。

Samba 的特性非常多,其中对于第三方开发者来说比较重要的就是 Samba VFS Module 特性。其让开发者可以自由地实现一些功能,接下来我们的话题会围绕着 Samba 的基础设定以及如何为 Samba 添加新的 VFS Module。
本文使用的 Samba 版本为 4.10.16,系统为 CentOS 7。

如何配置 Samba 使用 CurveFS

1、部署CurveFS

通过 CurveAdm 进行 CurveFS 后端服务的部署,参考以下文档[2]。
2、创建一个FS并挂载

通过 CurveAdm 进行 CurveFS 的挂载,参考以下文档[3],如果 FS 不存在的话,会自动进行创建。

3、安装配置 Samba 服务

sudo yum update -ysudo yum install samba -y
修改 /etc/samba/smb.conf,以下是一个 example:
(更多的配置请参阅 man smb.conf)
[global]workgroup = SAMBAlog level = 0max log size = 0security = userpassdb backend = tdbsamcreate mask = 0700directory mask = 0700writable = yespublic = noguest ok = no
[curvefs]path = /mnt/curvefs # 需要确保samba用户有访问这个目录的权限
配置 user 的密码,user 需要是本地已有的 linux 用户,这里以 root 举例:
sudo smbpasswd -a root
启动 samba server 服务:
sudo systemctl enable --now smb
然后就可以通过 samba 的 client(windows/linux/macos) 来连接访问。


Samba VFS Module 介绍

参考文档[4],Samba VFS Module 是 Samba VFS 提供的一种功能扩展机制,就像 Extention 之于 Chomre,非常重要。

  • Samba VFS 提供了一系列的接口定义, 具体可查看结构体 struct vfs_fn_pointers[5],也是使用了 C 语言比较常见的函数指针的方式来实现调用 module 的实现.

  • 每一个 module 都是一个 Shared Library (.so),它包含了对上面定义的部分或全部接口的实现,通过修改配置文件指定 module 来进行调用,Samba 会在 client 连接的时候加载 so。

  • 多个 VFS module 可以 stackable 使用,也就是如果多个 module 的实现不冲突,可以修改配置,按照顺序依次调用多个 module 的实现。

 Module 常见类型

Module 用于支持新的后端 FS,默认的 Samba VFS 最终会调用 vfs system call 来对接文件系统。比如说你想要对接 CephFS,那么可能是需要先把 cephfs 挂载到本机上,然后再通过 vfs system call 来对接 Samba,相当于多了一层中间 system call 的开销。


如果你想避免中间 system call 的调用,只需要开发一个直接对接 Ceph sdk 的 module,来当作 stackable 调用链的最末端,替代 default 的实现即可。就可以实现不挂载 CephFS,直接将 CephFS 通过 Samba 协议分享出去的效果[6]。对于别的 FS 比如 GlusterFS,也可以使用这样的方式来对接[7]。

Module 用于扩充已有 FS 的功能集

在已存在一个 FS 后端实现的情况下,(默认的是调用 vfs system call),对部分接口进行功能的增强。
module 作为 stackable 调用链的中间一环,完成本身 module 的功能后可以继续往后调用。比如说 fruit 模块就提供了对 Apple SMB clients 更好的兼容性支持[8]。

开发你的第一个 Samba VFS Module

一个 module 包含什么?

现有的 module 都位于此目录[9]下,一个 module 由代码实现和对应的 wscript 构建配置组成,Samba 使用 WAF 来构建。我们将以一个名为 demo 的 vfs module 举例,我们会有如下变动:
  • 代码实现:source3/wscript b/source3/wscript/vfs_demo.c
  • 改动source3/wscript b/source3/wscript和source3/modules/wscript_build增加构建配置

module代码实现

模块的初始化以及生命周期,包括几个部分

  • 模块的注册:名称
  • connect 接口:响应启用了此 module 的 client 的连接请求,模块的初始化应该在此处完成,包括自定义的 context 的构造等;
  • disconnect 接口:响应启用了此 module 的 client 的 disconnect 请求,模块的退出清理应该在此处完成;
  • 如果connect和disconnect有改动的需求, 那么实现自己自定义的方法即可。
从 connect 到 disconnect 为一个 module 的生命周期。下面的代码是一个简单的范例:
// vfs_demo.c
// initialzationNTSTATUS vfs_demo_init(TALLOC_CTX *ctx) { return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "demo", &vfs_demo_fns); // vfs_demo_fns是接口实现函数指针的struct}
/*static struct vfs_fn_pointers vfs_cloudnas_quota_fns = { .connect_fn = demo_connect, .disconnect_fn = demo_disconnect, ... 还有别的fn}*/
// contextstruct demo_ctx { uint64_t whoami;}
// connectstatic int demo_connect(vfs_handle_struct *handle, const char *service, const char *user) { int res = 0; struct demo_ctx *ctx = NULL; /* * Allow the next module to handle connections first * If we get an error, don't do any of our initialization. */ res = SMB_VFS_NEXT_CONNECT(handle, service, user); if (res) { return res; }
ctx = talloc_zero(handle, struct demo_ctx); if (!ctx) { DEBUG(1, ("talloc_zero() failed\n")); errno = ENOMEM; return -1; } ctx->whoami = lp_parm_ulonglong(SNUM(handle->conn), "demo", "whoami", 0); SMB_VFS_HANDLE_SET_DATA(handle, ctx, NULL, struct demo_ctx, return -1); return res;}
// disconnectstatic void demo_disconnect(vfs_handle_struct *handle) { struct demo_ctx *ctx; SMB_VFS_NEXT_DISCONNECT(handle); SMB_VFS_HANDLE_GET_DATA(handle, ctx, struct demo_ctx, return -1); DEBUG(1, ("%llu disconnect...", ctx->whoami));}
编码需要了解的常用知识
  • 如果你的代码不是整条stackable调用链上的最末端,记得使用SMB_VFS_NEXT_XXX系列函数来维持调用链,比如说SMB_VFS_NEXT_CONNECT 和 SMB_VFS_NEXT_DISCONNECT
  • conf 中的模块自定义参数可以通过 lp_parm_xxx 系列函数来进行解析
  • 自定义的ctx结构体可以通过SMB_VFS_HANDLE_SET_DATA和 SMB_VFS_HANDLE_GET_DATA 设定与解析
  • share 的路径存储在 handle->conn->connectpath 中

使用C ABI兼容的代码

C 是一个历史久远的底层语言,基于 C 的开发经常会遇到缺少一些数据结构、一些方便的软件库的情况。基于更现代的语言的开发往往更具有便利性,比如 go、rust 等等。为了结合两者的优点,我们可以使用在代码里 include 对应头文件和链接对应的 so 的方式进行开发。(需要注意的问题:Samba 的 client connect 默认采用的是 fork 一个新的 smbd 进程来处理后续的动作,对于 go 语言来说这可能会造成问题,参见 golang/go#14767)。

编译与安装

参考[10],简而言之:

./configuremakesudo make install
<原作者:小马哥,Curve Maintainer>


参考[1]:
https://github.com/opencurve/curve/blob/master/docs/cn/curvefs_architecture.md
参考[2]:
https://github.com/opencurve/curveadm/wiki/curvefs-cluster-deployment
参考[3]:
https://github.com/opencurve/curveadm/wiki/curvefs-client-deployment
参考[4]:
https://wiki.samba.org/index.php/Writing_a_Samba_VFS_Module
参考[5]:
https://github.com/samba-team/samba/blob/samba-4.10.16/source3/include/vfs.h#L618
参考[6]:

https://www.samba.org/samba/docs/current/man-html/vfs_ceph.8.html

参考[7]:

https://www.samba.org/samba/docs/current/man-html/vfs_glusterfs.8.html

参考[8]:

https://www.samba.org/samba/docs/current/man-html/vfs_fruit.8.html

参考[9]:

https://github.com/samba-team/samba/tree/samba-4.10.16/source3/modules

参考[10]:

https://wiki.samba.org/index.php/Build_Samba_from_Source




------ END. ------
🔥 推荐阅读:
Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践
创云融达:基于 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


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存