Ceph Distributed File System

本文档翻译自ceph.rst,翻译时文件的最新提交是93a2221c9c1ae32643df67c482dc4c4c591b7514 doc: ceph: update userspace command to get CephFS metadata。大部分借助于ChatGPT翻译,仅作为我个人的参考,如果你想查阅,建议看英文文档,因为我不确定我记录的中文翻译是否完整和正确。

Ceph 是一个分布式网络文件系统,设计目的是提供良好的性能、可靠性和可扩展性。

基本特性包括:

此外,

与 GFS、OCFS2 和 GPFS 等集群文件系统依赖所有客户端对共享块设备的对称访问不同,Ceph 将数据和元数据管理分离为独立的服务器集群,类似于 Lustre。然而,不同于 Lustre,元数据和存储节点完全作为用户空间守护进程运行。文件数据以大块的方式分布在存储节点上,以分配负载并促进高吞吐量。当存储节点发生故障时,数据通过存储节点自身在分布式环境下重新复制(通过集群监视器进行一些最小的协调),使系统极其高效和可扩展。

元数据服务器实际上形成了一个巨大的、一致的、分布式的内存缓存,在文件命名空间之上,具有极高的可扩展性,能够根据工作负载变化动态重新分配元数据,并且可以容忍任意(非拜占庭式)节点故障。元数据服务器采用了一种较为非传统的元数据存储方式,以显著提升常见工作负载的性能。特别地,只有一个链接的 inode 被嵌入到目录中,从而允许整个目录的目录项和 inode 通过一次 I/O 操作加载到其缓存中。极大的目录内容可以被分段并由独立的元数据服务器管理,允许可扩展的并发访问。

该系统在从仅有少数节点的小型集群扩展到数百个节点时提供了自动数据重新平衡/迁移,而不需要管理员将数据集划分为静态卷,也不需要经历将数据在服务器之间迁移的繁琐过程。当文件系统接近满载时,可以轻松添加新节点,一切将“正常工作”。

Ceph 包含灵活的快照机制,允许用户在系统中的任意子目录(及其嵌套内容)上创建快照。快照创建和删除操作简单如 mkdir .snap/foormdir .snap/foo

快照名称有两个限制:

Ceph 还提供了一些对嵌套文件和字节的递归统计。可以运行以下命令:

getfattr -n ceph.dir.rfiles /some/dir
getfattr -n ceph.dir.rbytes /some/dir

来分别获取嵌套文件的总数及其合计大小。这使得识别大磁盘空间消耗者相对快捷,不需要 du 或类似的文件系统递归扫描。

最后,Ceph 还允许在系统中的任何目录上设置配额。配额可以限制在该目录层次结构下存储的字节数或文件数。可以使用扩展属性 ceph.quota.max_filesceph.quota.max_bytes 设置配额,例如:

setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir
getfattr -n ceph.quota.max_bytes /some/dir

当前配额实现的一个限制是,它依赖于挂载文件系统的客户端在达到限制时停止写入。无法阻止被修改或恶意的客户端根据需要写入任意多的数据。

1 挂载语法

基本挂载语法为:

# mount -t ceph user@fsid.fs_name=/[subdir] mnt -o mon_addr=monip1[:port][/monip2[:port]]

仅需指定一个监视器,因为客户端连接时会获取完整列表。(不过,如果您指定的监视器恰好不可用,挂载将不会成功。)如果监视器使用默认端口,可以省略该端口。因此,如果监视器位于 1.2.3.4:

# mount -t ceph cephuser@07fe3187-00d9-42a3-814b-72a4d5e7d5be.cephfs=/ /mnt/ceph -o mon_addr=1.2.3.4

已安装 /sbin/mount.ceph 时,可以使用主机名替代 IP 地址,并省略集群 FSID(挂载助手将通过读取 ceph 配置文件填充):

# mount -t ceph cephuser@cephfs=/ /mnt/ceph -o mon_addr=mon-addr

多个监视器地址可以用斜杠 (/) 分隔传递:

# mount -t ceph cephuser@cephfs=/ /mnt/ceph -o mon_addr=192.168.1.100/192.168.1.101

使用挂载助手时,如果 ceph 配置文件可用,则监视器地址可以从配置文件中读取。注意,集群 FSID(作为设备字符串的一部分传递)通过与监视器报告的 FSID 对比来验证。

2 挂载选项

mon_addr=ip_address[:port][/ip_address[:port]]

集群的监视器地址。这用于引导与集群的连接。一旦连接建立,将跟随监视器映射中的监视器地址。

fsid=cluster-id

集群的 FSID(来自 ceph fsid 命令)。

ip=A.B.C.D[:N]

指定客户端在本地绑定的 IP 和/或端口。通常没有必要这样做。如果未指定 IP,则通过客户端与监视器的连接源地址确定客户端的 IP 地址。

wsize=X

指定最大写入大小(字节)。默认:64 MB。

rsize=X

指定最大读取大小(字节)。默认:64 MB。

rasize=X

指定最大预读取大小(字节)。默认:8 MB。

mount_timeout=X

指定挂载的超时时间(秒),在 Ceph 文件系统无响应的情况下。默认是 60 秒。

caps_max=X

指定保持的最大 caps 数量。当 caps 数量超过限制时,释放未使用的 caps。默认是 0(无限制)。

rbytes

当对目录调用 stat() 时,将 st_size 设置为 'rbytes',即该目录下所有嵌套文件的大小总和。这是默认值。

norbytes

当对目录调用 stat() 时,将 st_size 设置为该目录中的条目数。

nocrc

禁用数据写入的 CRC32C 计算。如果设置,存储节点必须依赖于 TCP 的错误校正来检测数据有效负载中的数据损坏。

dcache

使用 dcache 内容在客户端完全缓存目录内容时执行负查找和 readdir 操作。(这不会改变正确性;客户端仅在租约或能力确保缓存元数据有效时使用。)

nodcache

如上所述,不使用 dcache。这避免了大量复杂代码,在不影响正确性的情况下牺牲了性能,并有助于调试。

noasyncreaddir

不使用如上所述的 dcache 执行 readdir 操作。

noquotadf

在 statfs 中报告整体文件系统使用情况,而不是使用根目录配额。

nocopyfrom

不使用 RADOS 的 'copy-from' 操作执行远程对象复制。目前,它仅在 copy_file_range 中使用,如果使用该选项,将恢复为默认的 VFS 实现。

recover_session=<no|clean>

在客户端被列入黑名单的情况下设置自动重新连接模式。可用模式为 “no” 和 “clean”。默认是 “no”。

  • no:在客户端检测到被列入黑名单后不尝试重新连接。操作通常会在被列入黑名单后失败。
  • clean:当客户端检测到被列入黑名单后会自动重新连接到 ceph 集群。在重新连接过程中,客户端丢弃脏数据/元数据,失效页缓存和可写文件句柄。重新连接后,文件锁将变为失效状态,因为 MDS 无法追踪它们。如果 inode 包含任何失效的文件锁,则在应用程序释放所有失效文件锁之前不允许在该 inode 上进行读/写操作。

3 更多信息

有关 Ceph 的更多信息,请参阅主页

https://ceph.com/

Linux 内核客户端源代码树位于
完整系统的源代码位于

https://github.com/ceph/ceph.git