Ceph 分布式文件系统¶
Ceph 是一个分布式网络文件系统,旨在提供良好的性能、可靠性和可扩展性。
基本功能包括
POSIX 语义
从 1 个节点到数千个节点的无缝扩展
高可用性和可靠性。没有单点故障。
跨存储节点的数据 N 路复制
从节点故障中快速恢复
添加/删除节点时自动重新平衡数据
易于部署:大多数 FS 组件是用户空间守护进程
此外,
灵活的快照(在任何目录上)
递归记账(嵌套文件、目录、字节)
与 GFS、OCFS2 和 GPFS 等依赖所有客户端对称访问共享块设备的集群文件系统相比,Ceph 将数据和元数据管理分离到独立的服务器集群中,类似于 Lustre。然而,与 Lustre 不同的是,元数据和存储节点完全作为用户空间守护进程运行。文件数据以大块形式条带化分布在存储节点上,以分散工作负载并促进高吞吐量。当存储节点发生故障时,数据由存储节点本身以分布式方式重新复制(在集群监控器的少量协调下),使系统极其高效且可扩展。
元数据服务器有效地在文件命名空间之上形成一个大型、一致的分布式内存缓存,该缓存具有极高的可扩展性,可以动态地重新分配元数据以响应工作负载的变化,并且可以容忍任意(好吧,非拜占庭)节点故障。元数据服务器采用一种有点非常规的元数据存储方法,以显著提高常见工作负载的性能。特别是,只有一个链接的 inode 会嵌入到目录中,允许整个目录的目录项和 inode 通过一次 I/O 操作加载到其缓存中。超大目录的内容可以被分割并由独立的元数据服务器管理,从而实现可扩展的并发访问。
该系统在从几个节点的集群扩展到数百个节点时,提供自动数据重新平衡/迁移,而无需管理员将数据集划分为静态卷或经历在服务器之间迁移数据的繁琐过程。当文件系统接近满时,可以轻松添加新节点,并且一切都会“正常工作”。
Ceph 包括灵活的快照机制,允许用户在系统中任何子目录(及其嵌套内容)上创建快照。快照的创建和删除就像 ‘mkdir .snap/foo’ 和 ‘rmdir .snap/foo’ 一样简单。
快照名称有两个限制
它们不能以下划线 (‘_’) 开头,因为这些名称保留供 MDS 内部使用。
它们的大小不能超过 240 个字符。这是因为 MDS 在内部使用长快照名称,其格式为: _<快照名称>_<inode-编号>。由于文件名通常不能超过 255 个字符,并且 <节点 ID> 占用 13 个字符,因此长快照名称最多可以占用 255 - 1 - 1 - 13 = 240 个字符。
Ceph 还为嵌套文件和字节提供了一些目录上的递归记账功能。您可以运行以下命令
getfattr -n ceph.dir.rfiles /some/dir
getfattr -n ceph.dir.rbytes /some/dir
分别获取嵌套文件的总数及其总大小。这使得识别大型磁盘空间消耗者相对较快,因为不需要 ‘du’ 或类似的文件系统递归扫描。
最后,Ceph 还允许在系统中的任何目录上设置配额。配额可以限制该目录层次结构下存储的字节数或文件数。可以使用扩展属性 ‘ceph.quota.max_files’ 和 ‘ceph.quota.max_bytes’ 设置配额,例如
setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir
getfattr -n ceph.quota.max_bytes /some/dir
当前配额实施的一个限制是,它依赖于挂载文件系统的客户端的合作,以便在达到限制时停止写入操作。一个经过修改的或敌对的客户端无法阻止写入其所需的数据量。
挂载语法¶
基本挂载语法是
# mount -t ceph [email protected]_name=/[subdir] mnt -o mon_addr=monip1[:port][/monip2[:port]]
您只需要指定一个监视器,因为客户端在连接时将获得完整的列表。(但是,如果您指定的监视器恰好关闭,则挂载将不会成功。)如果监视器使用默认端口,则可以省略端口。因此,如果监视器位于 1.2.3.4,
# mount -t ceph [email protected]=/ /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 进行检查来验证。
挂载选项¶
- 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
指定要保留的最大容量数。当容量数超过限制时,将释放未使用的容量。默认值为 0(无限制)
- rbytes
当在目录上调用 stat() 时,将 st_size 设置为 ‘rbytes’,即该目录下所有嵌套文件大小的总和。这是默认值。
- norbytes
当在目录上调用 stat() 时,将 st_size 设置为该目录中的条目数。
- nocrc
禁用数据写入的 CRC32C 计算。如果设置此项,存储节点必须依赖 TCP 的错误纠正来检测数据负载中的数据损坏。
- dcache
当客户端在其缓存中拥有整个目录内容时,使用 dcache 内容执行负查找和 readdir。(这不会改变正确性;客户端仅在租约或容量确保其有效时才使用缓存的元数据。)
- nodcache
不要像上面那样使用 dcache。这避免了大量复杂的代码,牺牲了性能而不影响正确性,并且对于追踪错误很有用。
- noasyncreaddir
不要像上面那样对 readdir 使用 dcache。
- noquotadf
在 statfs 中报告整体文件系统使用情况,而不是使用根目录配额。
- nocopyfrom
不要使用 RADOS ‘copy-from’ 操作来执行远程对象复制。目前,它仅在 copy_file_range 中使用,如果使用此选项,它将恢复为默认 VFS 实现。
- recover_session=<no|clean>
在客户端被列入黑名单的情况下设置自动重新连接模式。可用模式为“no”和“clean”。默认值为“no”。
no:当客户端检测到它已被列入黑名单时,永远不要尝试重新连接。列入黑名单后,操作通常会失败。
clean:当客户端检测到它已被列入黑名单时,它会自动重新连接到 ceph 集群。在重新连接期间,客户端会删除脏数据/元数据,使页面缓存和可写文件句柄失效。重新连接后,文件锁会变得过时,因为 MDS 会失去对它们的跟踪。如果一个 inode 包含任何过时的文件锁,则不允许在 inode 上进行读/写操作,直到应用程序释放所有过时的文件锁。
更多信息¶
- 有关 Ceph 的更多信息,请参阅主页:
- Linux 内核客户端源代码树位于:
- 完整系统的源代码位于: