CephFS 内部实现(三):快照

2020-03-16  本文已影响0人  宋新颖

CephFS快照几个特点:

快照实现

快照通过SnapRealm组织成树形结构,每个有快照信息的inode节点都会有对应的SnapRealm,没有快照信息的inode使用父节点路径上最近的SnapRealm,根节点默认有SnapRealm。在client端创建快照时mds会在对应的inode节点新建SnapRealm(仅首次创建时),普通文件inode中也会出现SnapRealm,但都是mds的cow机制创建的,client端无法直接操作。

snaprealm创建及组织

要解决的问题

写时复制

创建快照时只更新节点的snaprealm,并invalidate子节点的snaprealm cache,同时通知client最新的snap信息。整个过程并没有涉及元数据的备份,firstlast的修改以及对于普通文件的数据进行的备份,因为这些修改是在下次对节点进行修改时才会发生的事件,因此叫做写时复制。
举两个🌰:

  1. 创建快照后,在目录下新建文件,这时目录发生cow:通过journal_dirty_inode()将目录inode进行复制(CInode::cow_old_inode()),但并不会将目录的dentry在父目录中进行备份。
  2. 创建快照后,在目录下truncate一个已有的文件,这时文件发生cow:通过journal_dirty_inode()对文件目录进行复制(MDCache::cow_inode()),且会在目录的items中新增一个snaped的dentry,和cow_inode() new出来的inode关联。对于文件数据部分的备份则是通过RADOS层的快照机制完成(mds会将文件之前的快照号传给Filer,最终传到pg层的OSDOp中,这些快照号对应的数据将被保留)。

快照对stats的影响

由于stats信息都是根据inode统计得出的,而从client发起的请求,要么是在非快照目录下,要么是快照目录下,在非快照目录下,对于mds就是一次snapid为CEPH_NOSNAP的请求,在快照目录下发起的请求对于mds就是一个有具体snapid的请求。因此只能分开统计快照和非快照空间使用量。如果计费的话这里会有个问题,就是快照的实际使用空间是无法从client端得到的,除非根据inode去datapool中遍历对象计算出快照的实际使用空间。

上一篇 下一篇

猜你喜欢

热点阅读