注意

本文档适用于 Ceph 开发版本。

CephFS中的功能

当客户端想要对inode进行操作时,它将以各种方式查询MDS,然后MDS将授予客户端一组capabilities功能。这授予了客户端以各种方式对inode进行操作的权限。与其他网络文件系统(例如NFS或SMB)的主要区别之一是授予的功能非常细致,并且多个客户端可以在相同的inode上持有不同的功能。

功能类型

有几个“通用”的功能位。这些表示功能授予了什么类型的能力。

/* generic cap bits */
#define CEPH_CAP_GSHARED     1  /* (metadata) client can read (s) */
#define CEPH_CAP_GEXCL       2  /* (metadata) client can read and update (x) */
#define CEPH_CAP_GCACHE      4  /* (file) client can cache reads (c) */
#define CEPH_CAP_GRD         8  /* (file) client can read (r) */
#define CEPH_CAP_GWR        16  /* (file) client can write (w) */
#define CEPH_CAP_GBUFFER    32  /* (file) client can buffer writes (b) */
#define CEPH_CAP_GWREXTEND  64  /* (file) client can extend EOF (a) */
#define CEPH_CAP_GLAZYIO   128  /* (file) client can perform lazy io (l) */

然后它们被移位了一个特定的位数。这些表示功能被授予的inode数据或元数据的一部分:

/* per-lock shift */
#define CEPH_CAP_SAUTH      2 /* A */
#define CEPH_CAP_SLINK      4 /* L */
#define CEPH_CAP_SXATTR     6 /* X */
#define CEPH_CAP_SFILE      8 /* F */

然而,对于某些“移位”,只授予某些通用功能类型。特别是,只有FILE移位才有超过前两位的位。

| AUTH | LINK | XATTR | FILE
2      4      6       8

从上述内容中,我们得到一些常量,这些常量是通过将每个位值移位到正确的字位生成的:

#define CEPH_CAP_AUTH_SHARED  (CEPH_CAP_GSHARED  << CEPH_CAP_SAUTH)

这些位然后可以被或在一起,以形成一个表示一组功能的位掩码。

有一个例外:

#define CEPH_CAP_PIN  1  /* no specific capabilities beyond the pin */

“固定”只是将inode固定到内存中,而不授予任何其他功能。

图形化表示:

+---+---+---+---+---+---+---+---+
| p | _ |As   x |Ls   x |Xs   x |
+---+---+---+---+---+---+---+---+
|Fs   x   c   r   w   b   a   l |
+---+---+---+---+---+---+---+---+

第二位目前未使用。

每个功能所授予的能力

虽然功能是这样授予的(和传达的),但重要的是它们实际上允许客户端做什么:

  • PIN: 这只是将inode固定到内存中。这足以允许客户端获取inode编号,以及其他不可变的东西,如设备inode中的主号或次号,或符号链接的内容。

  • AUTH: 这授予了获取与认证相关的元数据的能力。特别是,所有者、组和模式。请注意,执行完整的权限检查可能需要获取ACL,ACL存储在xattr中。

  • LINK: inode的链接计数。

  • XATTR: 访问或操作xattr的能力。请注意,由于ACL存储在xattr中,因此在检查权限时有时也需要访问它们。

  • FILE: 这是重要的。这允许客户端访问和操作文件数据。它还涵盖了与文件数据相关的某些元数据——大小、mtime、atime和ctime,特别是。

简写

请注意,客户端登录也可以以紧凑的形式表示功能。例如:

pAsLsXsFs

‘p’表示固定。每个大写字母对应于移位值,每个移位后的小写字母表示每个移位授予的实际功能。

锁状态与功能之间的关系

在MDS中,每个inode有四个不同的锁,它们是simplelock、scatterlock、filelock和locallock。每个锁有几个不同的锁状态,MDS将根据锁状态向客户端发布功能。

在每个状态下,MDS Locker将始终尝试向允许的客户端发布所有功能,即使某些功能对客户端不是必需的或想要的,因为预先发布功能在某些情况下可以减少延迟。

如果只有一个客户端,它通常是所有inode的独占客户端。在多个客户端的情况下,MDS将尝试根据客户端(需要|想要)的功能计算每个inode的独占客户端,但通常它会失败。独占客户端将始终获得所有功能。

filelock将控制文件的部分元数据和文件内容的访问权限。元数据包括mtime, atime, size定位特定驱动器容量:, etc.

  • Fs: 一旦客户端拥有它,其他所有客户端都将被拒绝Fw.

  • Fx: 只有独占客户端才被允许此功能。一旦锁状态转换为LOCK_EXCL,独占客户端将获得此功能以及所有其他文件功能,除了Fl.

  • Fr: 一旦客户端拥有它,将Fb功能将从所有其他客户端中撤销。

    如果客户端仅请求读取文件,锁状态将直接转移到LOCK_SYNC稳定状态。所有客户端都可以获得Fscrl从认证MDS和Fscr从副本MDSes的功能。

    如果多个客户端从同一文件读取和写入,那么锁状态最终将转移到LOCK_MIX稳定状态,并且所有客户端都可能拥有Frwl从认证MDS的功能,以及Fr从副本Fcb功能,客户端将执行同步读取/写入。

  • Fw: 如果没有独占客户端,一旦客户端拥有此功能,将Fsxcb功能将不会授予其他客户端。

    如果多个客户端从同一文件读取和写入,那么锁状态最终将转移到LOCK_MIX稳定状态,并且所有客户端都可能拥有Frwl从认证MDS的功能,以及Fr从副本Fcb功能,客户端将执行同步读取/写入。

  • Fc: 此功能意味着客户端可以缓存文件读取,并且应该与Fr功能一起发布,并且只有在这种情况下才有意义。

    实际上,在某些稳定或过渡状态中,它们倾向于保持Fc允许的,即使Fr功能没有被授予,因为这样可以避免强制客户端丢弃完整缓存,例如在简单的文件大小扩展或截断用例中。

  • Fb: 此功能意味着客户端可以缓冲文件写入,并且应该与Fw功能一起发布,并且只有在这种情况下才有意义。

    实际上,在某些稳定或过渡状态中,它们倾向于保持Fc允许的,即使Fw功能没有被授予,因为这样可以避免强制客户端丢弃脏缓冲区,例如在简单的文件大小扩展或截断用例中。

  • Fl: 此功能意味着客户端可以执行懒io。懒IO放宽了POSIX语义。即使文件被多个应用程序在多个客户端上打开,也允许缓冲读取/写入。应用程序需要自己管理缓存一致性。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.