Curve 存储系统中的 CurveFS

两个 CurveFS
在 Curve 存储中,有两个地方出现了 CurveFS。一个是在 Curve 块存储中,是 Curve 块存储的 mds 服务的一个模块,用来组织管理 Curve 块存储中的卷。另一个是 Curve 文件存储的名字。新接触 Curve 的人可能会有些困惑,这两个 CurveFS 是什么关系?

其实这两个没有什么关系,只是名字相同而已。而名字相同的原因是,一开始 Curve 先做了块存储,块存储管理卷的方式采用了类似于文件系统管理文件的方式,使用目录和文件的层级结构管理系统中的所有的卷,所以这个管理卷的模块就被命名为 CurveFS。后来 Curve 又有了文件存储,所以就有了两个 CurveFS。这里主要介绍的是 Curve 块存储中的 CurveFS。

Curve 块存储中的 CurveFS
下图是 GFS 的架构图,Curve 使用了类似于 GFS 一样的 namespace 管理方式。不过这里 Curve的每个 file 都是一个卷,而 GFS 的每个 file 是一个文件。

Curve 块存储操作每个卷就像操作一个文件。每个卷都是从根目录开始的一个路径,比如/test就是一个卷。Curve 块存储的卷必须是从根目录开始的路径,不能是相对路径,也不支持…和.。Curve 块存储的卷的路径是唯一的,不能有重复的路径。

为了方便管理卷,CurveFS 有一个目录树的结构,每个目录下可以有多个子目录。

Curve 块设备的目录树
Curve 块存储的卷是通过目录树的方式管理的。每个目录下可以有多个子目录,每个子目录下也可以有多个子目录,以此类推。卷属于某个目录。

目录树的根目录是/,根目录下可以有多个子目录,比如下图的/home,/tmp等等。每个子目录下也可以有多个子目录,比如下图的/home/dir1,/home/dir2等等。以此类推。

目录/home/dir1下有卷/home/dir1/filex,目录/home/dir2下有卷/home/dir2/filey,目录/home下有卷/home/filez。

Curve 不支持自动创建目录,必须先创建这个目录,然后再在这个目录下创建卷。比如要创建卷/home/dir1/filex,必须先创建目录/home/dir1,然后再在/home/dir1下创建卷/home/dir1/filex。不少用户在第一次使用 Curve 的时候,会忘记先创建目录,然后再在目录下创建卷,这样就会报错。

Curve 块设备的卷的管理
Curve 可以对一个目录进行增删改查的操作。比如创建目录,删除目录,重命名目录,查看目录下的子目录等等。

也可以对一个卷进行增删改查的操作。比如创建卷,删除卷,重命名卷,扩容卷,查看卷的信息等等。

当前有两个工具,一个是 Curve 块设备的 curve_ops_tool[1],不过这个工具只能对卷进行增删改查的操作,不能对目录树进行增删改查的操做。

另一个是 Curve 块设备的 Curve 工具[2],这个工具可以对目录进行增删改查的操作,也可以对卷进行增删改查的操作。

如果是使用 CurveAdm 工具通过 docker 方式部署的 Curve 块设备集群,由于打包 Curve 镜像的时候遗漏了 Curve 工具,所以暂时还不能创建目录,只能通过 curve_ops_tool 工具创建卷。我们正在修复这个问题。可以暂时只创建一级目录的卷来规避这个问题。

后续会把 Curve 存储系统中,块存储和文件存储的运维管理工具都统一合并到一个新的 Curve 工具[3]中。

Curve 块设备的卷的删除
Curve 块存储的卷是可以删除的。但是经常有用户问我们,删除卷了之后,为什么空间看起来并没有被释放。这是因为 Curve 块存储为了避免数据被误删,开发了一个机制,叫做回收站。删除的卷会被放到回收站中,回收站中的卷可以被恢复,也可以被彻底删除。一个卷被删除之后,只是从原路径下删除了,但是卷的数据并没有被删除,而是被放到了回收站中。只有卷从回收站中被删除了,才会真正的释放空间。

去哪可以找到回收站呢?回收站的路径是/RecycleBin。所有被删除的卷都会挪到这个目录下。

通过 curve_ops_tool list -fileName=/RecycleBin 可以查看回收站中的卷。

回收站的卷不会自动删除,需要手动清理:

通过 curve_ops_tool delete 命令带上 -forcedelete=true 来删除回收站中的卷也可以通过 clean-recycle clean-recycle 清理回收站中的所有的卷。

Curve 块设备的 CurveFS 和操作系统的 FS 的关系
之前也有用户问我们,Curve 块存储系统的卷的路径和操作系统的 FS 有什么关系呢?

其实这两个没有关系,Curve 的卷的路径只是记录在 Curve 系统中,方便 Curve系统进行管理。通过 Curve 的工具在 Curve 块设备的 CurveFS 中创建的目录和卷,并不会体现在操作系统的 FS 中。Curve 设备的 CurveFS 和操作系统的 Fs 是两个不同的文件系统。

只有当 Curve 的卷通过 nbd 的方式 map 到操作系统中,或者通过 iscsi/target 的方式挂载到操作系统上。Curve 的卷才会和操作系统的 FS 发生联系。

通过 nbd 方式挂载的Curve卷,通过 lsblk 就可以看到系统中多了一个 /dev/nbdxxx 的设备。操作文档可参考 curvebs-client-deployment[4]

通过 iscsi/target 方式挂载的 Curve 卷,通过 lsblk 就可以看到系统中多了一个 /dev/sdxxx 的设备。操作文档可参考 curve tgt deployment[5]

总结
这里介绍了 Curve 块存储的一些常见的用户在使用中问到的问题,希望能够帮助到大家。如果大家在使用中有什么问题,可以在 github 上提 issue,或者在微信群里提问。我们会尽快的回复大家~!

参考链接:
curve_ops_tool:[1]
https://github.com/opencurve/curve/blob/master/docs/cn/curve_ops_tool.md
Curve 工具:[2]
https://github.com/opencurve/curve/blob/master/docs/cn/curve%E5%B7%A5%E5%85%B7.md
Curve 工具:[3]
https://github.com/opencurve/curve/blob/master/docs/cn/curve%E5%B7%A5%E5%85%B7.md
curvebs-client-deployment:[4]
https://github.com/opencurve/curveadm/wiki/curvebs-client-deployment
curve tgt deployment:[5]
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