Ceph开发每周谈 Vol 105 | 简化 RBD 克隆流程

2018年01月 · 麦子迈

这是Ceph开发每周谈的第一百零五篇文章,记录从181月2号到181月07号的社区开发情况。

  •  一句话消息

圣诞到元旦大部分开发者都已经休假了

  • 简化 RBD 克隆流程

在最近的 CDM 讨论了 rbd 克隆流程的简化,为了能够避免 protect 和 unprotect 流程。目前的 rbd 克隆流程如下:

  1) 创建快照 (rbd snap create <image>@<snap>)
  2) 保护快照 (rbd snap protect <image>@><snap>)
  3) 从保护快照中克隆出 (rbd clone <image>@<snap> <clone>)
目前的 “snap protect” 步骤主要是用于支持从一个 read only 的池子中克隆出卷,并通过两步方式:
  Clone Operation
  1) 验证快照已经被保护
  2) 增加对在 <clone pool>/rbd_children 对象中对克隆卷的保护
  3) 重新验证快照已经被保护,否则回滚
  Unprotect Operation
  1) 设置快照状态为 UNPROTECTING
  2) 扫描所有 rbd_children 对象,确认没有 image 被引用,否则回滚
  3) 设置快照状态为 UNPROTECTED

简化方案

通过兼容老的模式,来实现对于新的方法来避免保护和未保护的要求,主要是未来支持从一个只读的池中克隆出,需要给 OSD cap 增加一个 cls 方法:
 “allow class rbd clone_add object_prefix rbd_header.”
新的克隆可以只需要调用 “rbd.clone_add” 来原子性注册和避免快照被删除,调用 “rbd.remove_snap” 来解决原子性删除的问题。
同时会增加一个 RBD_FEATURE_OPERATION 标记来显示是否支持,如果是显示有这个标记,意味着用户可以去掉 protect 和 unprotect 过程。