注意
本文档适用于 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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.