注意
本文档适用于 Ceph 开发版本。
CephFS回收接口
简介
NFS 服务器通常不在稳定存储上跟踪临时状态。如果 NFS 服务器重新启动,它将没有临时状态,并且预期 NFS 客户端将发送请求以回收他们在宽限期期间持有的状态。
为了支持此用例,libcephfs 增加了几个函数,允许已停止并重新启动的客户机销毁或回收先前实例持有的状态。这允许客户机重新获取其先前实例持有的状态,并避免在释放先前持有的状态之前长时间等待旧会话超时。
一旦运行在 cephfs 上的 NFS 服务器关闭,它就在与它的 MDS 会话超时竞赛。如果 Ceph 会话在 NFS 宽限期开始之前超时,则另一个客户机可能会获取冲突状态。此机制还允许我们增加这些客户的超时时间,以确保服务器有足够的时间重新启动。
设置 UUID
为了正确重置或回收旧会话,我们需要一种方法来识别旧会话。这是通过在会话上使用 ceph_set_uuid() 设置一个唯一的不可见值来完成的。ceph_set_uuid(). uuid 值可以是任何字符串,并由客户端视为不可见。
直接设置 uuid 只能在新会话上执行,在挂载之前。当执行回收时,当前会话将继承旧会话的 uuid。
开始回收
在对结果 struct ceph_mount_info 调用 ceph_create 和 ceph_init 之后,客户端应发出 ceph_start_reclaim,传入先前客户机实例的 uuid 以及任何标志。
- CEPH_RECLAIM_RESET
此标志表示我们无意针对给定的 uuid 指示的旧会话执行任何回收,它应该只是被丢弃。先前客户机持有的任何状态应立即释放。
完成回收
在 Ceph 客户机完成所有回收操作后,客户端应发出 ceph_finish_reclaim 来指示回收现在已完成。
设置会话超时(可选)
当客户机死亡并重新启动,并且我们需要保留其状态时,我们实际上在与会话过期时钟竞赛。在这种情况下,我们通常需要一个更长的超时,因为我们预期最终会手动杀死旧会话。
示例 1:重置旧会话
此示例只是销毁先前实例持有的 MDS 会话。NFS 服务器可以开始宽限期,然后要求 MDS 拆卸旧会话。这允许客户机立即开始回收。
(注意:为清晰起见,省略了错误处理)
struct ceph_mount_info *cmount;
const char *uuid = "foobarbaz";
/* Set up a new cephfs session, but don't mount it yet. */
rc = ceph_create(&cmount);
rc = ceph_init(&cmount);
/*
* Set the timeout to 5 minutes to lengthen the window of time for
* the server to restart, should it crash.
*/
ceph_set_session_timeout(cmount, 300);
/*
* Start reclaim vs. session with old uuid. Before calling this,
* all NFS servers that could acquire conflicting state _must_ be
* enforcing their grace period locally.
*/
rc = ceph_start_reclaim(cmount, uuid, CEPH_RECLAIM_RESET);
/* Declare reclaim complete */
rc = ceph_finish_reclaim(cmount);
/* Set uuid held by new session */
ceph_set_uuid(cmount, nodeid);
/*
* Now mount up the file system and do normal open/lock operations to
* satisfy reclaim requests.
*/
ceph_mount(cmount, rootpath);
...
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.