相比传统的分布式文件系统,CurveFS 具备如下几个特色:
3. 支持将文件数据存储到对象存储和 CurveBS 块存储上,可以做到冷热数据分层存储和生命周期管理(roadmap),数据容量可无限扩展。
2023 Roadmap 解读
报名并转发会议链接的前十名同学
公众号回复截图领取社区精美周边
背景
相比传统的分布式文件系统,CurveFS 具备如下几个特色:
3. 支持将文件数据存储到对象存储和 CurveBS 块存储上,可以做到冷热数据分层存储和生命周期管理(roadmap),数据容量可无限扩展。
Samba 介绍
Homepage: https://www.samba.org/
Samba 是目前最流行的文件和打印机共享软件之一。得益于它良好的兼容性,可以轻松地跨平台(Windows/Linux/MacOS),以及灵活的可定制性和可配置性,受到了各个系统的广泛支持。
如何配置 Samba 使用 CurveFS
1、部署CurveFS
通过 CurveAdm 进行 CurveFS 的挂载,参考以下文档[3],如果 FS 不存在的话,会自动进行创建。
3、安装配置 Samba 服务
sudo yum update -y
sudo yum install samba -y
[global]
workgroup = SAMBA
log level = 0
max log size = 0
security = user
passdb backend = tdbsam
create mask = 0700
directory mask = 0700
writable = yes
public = no
guest ok = no
[curvefs]
path = /mnt/curvefs # 需要确保samba用户有访问这个目录的权限
sudo smbpasswd -a root
sudo systemctl enable --now smb
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 常见类型
如果你想避免中间 system call 的调用,只需要开发一个直接对接 Ceph sdk 的 module,来当作 stackable 调用链的最末端,替代 default 的实现即可。就可以实现不挂载 CephFS,直接将 CephFS 通过 Samba 协议分享出去的效果[6]。对于别的 FS 比如 GlusterFS,也可以使用这样的方式来对接[7]。
开发你的第一个 Samba VFS Module
一个 module 包含什么?
改动source3/wscript b/source3/wscript和source3/modules/wscript_build增加构建配置
// vfs_demo.c
// initialzation
NTSTATUS 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
}
*/
// context
struct demo_ctx {
uint64_t whoami;
}
// connect
static 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;
}
// disconnect
static 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));
}
C 是一个历史久远的底层语言,基于 C 的开发经常会遇到缺少一些数据结构、一些方便的软件库的情况。基于更现代的语言的开发往往更具有便利性,比如 go、rust 等等。为了结合两者的优点,我们可以使用在代码里 include 对应头文件和链接对应的 so 的方式进行开发。(需要注意的问题:Samba 的 client connect 默认采用的是 fork 一个新的 smbd 进程来处理后续的动作,对于 go 语言来说这可能会造成问题,参见 golang/go#14767)。
./configure
make
sudo make install
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]:
关于 Curve
Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。
- GitHub:https://github.com/opencurve/curve- 官网:https://opencurve.io/- 用户论坛:https://ask.opencurve.io/- 微信群:搜索群助手微信号 OpenCurve_bot