Ceph and KRBD discard

本文由 Ceph中国社区-半天河翻译,Thomas校稿 。

英文出处:Sébastien Han 欢迎加入 翻译小组

内核RBD模块的空间回收机制,对运维人员至关重要,因为这能缓解你的容量规划(压力)。RBD镜像是稀疏的,因此创建后大小等于0 MB。稀疏镜像的主要问题在于(逐渐)增长到整个镜像的大小。然而Ceph对于发生在块层之上、尤其是文件系统上的事情一无所知。你可以很容易地向文件系统写入数据,然后删除一切,但是Ceph仍然认为这些块被使用着并(保持块位图不变)。得益于,块设备对discard特性的支持,文件系统可以发送 discard flush 命令给块。最终,存储系统会释放那些上层应用数据已经删除的块。

这个特性自3.18版本的内核开始引入。

我们新建一个 RBD 镜像(并检查其大小)

将它映射到一个节点并在其上构建一个文件系统:

至此所有的设置都已经完成,现在写入一些数据:

然后我们再次检查这个镜像的大小:

现在里面有128MB的用户数据以及大约 ~14,406MB的文件系统的数据/元数据。可以看到这个设备的 discard 属性已经启用:

现在让我们来看看,不支持 discard 时的默认行为,我们删除前面创建的128MB 文件,这样就能释放一些文件系统空间。不幸的是Ceph什么也没检测到,仍然认为这 128MB 的数据仍然存在。

现在让我们在挂载的文件系统上运行 fstrim 命令通知块设备释放未使用的空间:

注意,使用 discard 挂载选项会严重影响性能。所以,通常你可以通过启动一个每天执行的 cron 任务来触发 fstrim 命令。

译者补充:

我的实际线上环境是:ubuntu12.04 + Ceph 0.67.9

对于使用 KRBD 深有感触,要保障业务不间断,进行升级是相当麻烦的,但是这个存储系统已经稳定运行两年。

Ceph检测到已用空间到了70%,但是实际业务系统层面统计还不到50%,因此执行 fstrim 势在必行。

经过本文作者的提示,我们的方案是在这个集群上使用kvm新建一个 ubuntu14.04.4 的虚拟机,依次将所有 RBD 在该虚拟机上映射后挂载到某一个目录,然后在这个目录上执行 fstrim 命令,达到清理的目的。

这个方案有以下两个特点:

  1. 这里实际同一个 RBD 在两个不同节点映射并挂载,但是经过测试,执行 fstrim 命令不会造成业务的中断(使用死循环调dd进行写模拟业务),执行过程中是不是有性能影响没有监测;

  2. 如果该 RBD 在执行 fstrim 命令的时候仍然有写操作,会影响 fstrim 的效果,具体表现就是耗时显著增加、空间清理并没有预期的多。

Leave a Comment

电子邮件地址不会被公开。