声明:

本博客欢迎转载,但请保留原作者信息!

作者:李人可

团队:华为杭州OpenStack团队

consistency group,直译是一致性组,是Juno版本号cinder新引进的一个概念。顾名思义,里面包括了两个意思。consistency(一致性)和group(组),怎样体现的呢?处于数据保护或者是容灾的考虑,把一批存在公共操作的卷,在逻辑上划成一个组。用户能够很方便的通过操作该组,不须要一个一个得去操作卷。所以针对的操作应该是做快照和做备份。

当前仅仅有E公司的后端支持该特性,该blueprint预计也是E公司提出的。但个人觉得在实际应用中还是十分实用的。属于通用的、公共的接口,能提升存储资源使用的效率

依据当前J版本号代码的实现。改动点有:

  • 添加了两张表:cgsnapshots。consistencygroups
  • 添加了consistencygroup_id属性,主要在volume表和snapshot表。
  • 添加了consistencygroups的配额;
  • 提供了consistencygroup的创建、删除、查看的API。
  • 提供了consistencygroup_snapshot的创建、删除、查看的API;

作者尚未实现对组备份的功能。在该blueprint的讨论中。作者也提到了兴许要做的工作:

  1. 在heat层面上也应该理解卷的一致性组概念,应实现对应的接口;
  2. 在对一致性组做快照前,利用QEMU guest agent暂停GuestOS对文件系统的訪问。等结束后再恢复。
  3. 支持一致性组的备份,包含在后端存储driver运行下实现对已经挂载卷的备份;

备份功能能够结合当前快照的实现来做,而heat上的尚处于八字没一撇的情况,而暂停GuestOS文件系统。则在进行中,见bp: https://wiki.openstack.org/wiki/Cinder/QuiescedSnapshotWithQemuGuestAgent

个人在J版本号环境下对这个特性做了些尝试。想法是在allinone节点中创建一个组,增加两个卷。然后做统一快照,最后删除组快照。

依照一致性预期结果看到有两个卷快照被创建最后被删除。可是环境没有对接E公司的后端。仅仅有LVM,那就对LVM的代码做简单改动,使之支持主要的组操作。

首先得创建一个一致性组。在LVM的驱动代码中,须要在data['pool']字典中增加一个属性,否则过滤器这关(主要是capibility)是过不去的。 在上报能力的接口中,实现“consistencygroup_support='True'”,能够简单返回空处理:

    def create_consistencygroup(self, context, group):
"""Creates a consistencygroup."""
#raise NotImplementedError()
return None
def delete_consistencygroup(self, context, group):
"""Deletes a consistency group."""
#raise NotImplementedError()
return None,[]

这样,一个组就建成了。show的结果(cinder的client尚未实现,仅仅能用CURL測试):

有了组后,開始创建卷,指定consistencygroup_id创建同组的两个卷。

然后准备对组做快照。再次改动LVM的代码。加入create_cgsnapshot方法。功能是在创建组快照时,对组内全部卷做快照(代码实验用,仅做參考):

    def create_cgsnapshot(self, context, cgsnapshot_ref):
snapshots = self.db.snapshot_get_all_for_cgsnapshot(context,
cgsnapshot_ref['id'])
model_update = {"status":"available"}
for sn in snapshots:
try:
self.create_snapshot(sn)
except Exception as e:
LOG.error("create snapshot %s fail."%sn)
sn['status'] = 'error'
model_update["status"] = "error" return model_update, snapshots

运行快照后,能够看到,生成了属于这个组的两个快照。并生成了一个consistencygroup_snapshot数据。show的结果:

两个快照:



    这时假设再创建一个该组的卷,会报400的错,由于当前组已经有快照无法再改动该组。

“Consistency group b37f1d21-390e-4128-8fd6-2ca4789d9fc2 still has dependent cgsnapshots.”

然后再对LVM代码加入个删除接口(代码实验用,仅做參考):

    def delete_cgsnapshot(self, context, cgsnapshot_ref):
snapshots = self.db.snapshot_get_all_for_cgsnapshot(context,
cgsnapshot_ref['id'])
model_update = {'status':'available'}
for sn in snapshots:
try:
self.delete_snapshot(sn)
except Exception as e:
LOG.error("delete snapshot %s fail"%sn)
model_update['status'] = 'error'
sn['status'] = 'error'
return model_update, snapshots

运行后。consistencygroup_snapshot对象消失。伴随着两个快照也被成功删除。

快照自己主动消失:     

至此。实现预期结果。

当然这是最简单的场景,且LVM仅仅能实现单节点存储池的场景。多节点根本搞不定。并且非常多场景没有考虑,比方反复创建快照,一个组相应多个volume_type等。待兴许再关注。

整个实验过程不算复杂,但第一次比预期要困难多了,还是有些细节须要去摸索的:

  1. 创建组的接口必须传入至少一个volume_type,也就以为着一致性组和卷类型的强相关;(这里在ethpad上的讨论有些出入,从接口看能够支持多个volume_type和组的相应关系)
  2. 后端存储在上报自己的硬件能力时,假设要支持创建一致性组,必须指定一个參数,“consistencygroup_support='True'”。且True必须为字符串;
  3. 后端存储的驱动代码必须实现相应的方法,创建相关也就是“create_consistencygroup”和"delete_consistencygroup"。快照相关就是“create_cgsnapshot”和“delete_cgsnapshot”;

所以,假设兴许有存储厂商想实现自己的一致性组。在开发过程中注意上述问题。

參考:

https://etherpad.openstack.org/p/juno-cinder-cinder-consistency-groups

https://blueprints.launchpad.net/cinder/+spec/consistency-groups

######

最后, 一些过程中使用的API列举例如以下。供參考:

Type  URL  body  RSP
 ADD consistencygroup  v2/$tenant_id/consistencygroups  { "consistencygroup": {

   "name":"my_cg",

   "description": "***",

   "volume_types": "Type1" }}
 N/A
 GET consistencygroups  v2/$tenant_id/consistencygroups/detail?

all_tenants=1

 N/A

{ "consistencygroups": [{

  "status": "available",

  "description": "***",

  "availability_zone": "nova",

  "created_at": "---",

  "id": "*",

  "name": "my_cg"}]}

 DEL consistencygroup  v2/$tenant_id/consistencygroups/$cg_id

{"consistencygroup":

{"force":"True"}}

 N/A
 ADD cg_snapshot  v2/$tenant_id/cgsnapshots  {"cgsnapshot":{

        "consistencygroup_id":"***",

"name": "my_cg_snapshot",

"description": "***"}}
 N/A
 GET cg_snapshot  v1/$tenant_id/cgsnapshots/detail?

all_tenants=1

 N/A  {"cgsnapshots": [{

  "status":"available",

  "description": "***",

  "created_at": "***",

  "consistencygroup_id": "***",

  "id": "***",

  "name":"***"}]}
 DEL cg_snapshot  v2/$tenant_id/cgsnapshots/$cgsnapshot_id  N/A  N/A

对consistencygroup的一些研究和实践的更多相关文章

  1. 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践

    提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...

  2. CSS技能汇总,研究及实践

    最近一直在研究CSS,因为发现实践中大部分时间都在写CSS,且自己感觉写的很烂,虽然以前看的很多,但却很少有去实践过,更别提研究了,现在发现根本就不是你懂你就会,很多都是你用着用着才真的会了的,于是现 ...

  3. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  4. Web动效研究与实践

    随着CSS3和HTML5的发展,越来越多狂拽炫酷叼炸天的动效在网页设计上遍地开花,根据最新的浏览器市场份额报告,IE6的份额已经降到了5.21%,这简直是一个喜大普奔的消息,做动效可以完全不care低 ...

  5. dis集群研究和实践(基于redis 3.0.5) 《转载》

    https://www.cnblogs.com/wxd0108/p/5798498.html 前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的 ...

  6. Reference SoftReference WeakReference PhantomReference Cleaner 的研究与实践

    最近在看netty的时候看到直接内存的相关概念,为了更详细的了解一下具体原理,搜到了一篇不错的文章 http://lovestblog.cn/blog/2015/05/12/direct-buffer ...

  7. 相位展开(phase unwrapping)算法研究与实践

    1. 什么是相位展开? 相位展开(Phase Unwrapping)是一个经典的信号处理问题,它指的是从值区间中恢复原始相位值(原因在于:计算相位时,运用反正切函数,则相位图中提取的相位都是包裹在一个 ...

  8. 分布式服务弹性框架“Hystrix”实践与源码研究(一)

    文章初衷 为了应对将来在线(特别是无线端)业务量的成倍增长,后端服务的分布式化程度需要不断提高,对于服务的延迟和容错管理将面临更大挑战,公司框架和开源团队选择内部推广Netflix的Hystrix,一 ...

  9. ASP.NET跨平台最佳实践

    前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...

随机推荐

  1. 把HTML5网页封装成APP,APK的方法

     phonegap appcan HBuilder的native.js     推荐你用两个东西打包 一个是ionic,一个是hbuilder,Maven,apicloud   http://mobi ...

  2. 实用Shell命令备忘

    开场白:这里简单记录一些常用的bash命令,一则备忘,二来希望可以帮助别人解决一些问题. 1.检测文件是否存在 if [ -f ./foo.txt ] then echo the file exist ...

  3. MapReduce调度与执行原理之作业初始化

    前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...

  4. dwz框架---(2)表单回调函数

    dwz中的表单回调函数大概有下面几种: /** * 普通ajax表单提交 * @param {Object} form * @param {Object} callback * @param {Str ...

  5. 『openframeworks』shader制作三角形马赛克效果

    不久前做了六边形马赛克的效果,很有意思,乘热打铁,弄了个三角形马赛克. 首先肯定是等边三角形,这样才能真正的无缝拼接.观察发现,三角形可以拼接成之前做个的六边形. 如下图: 我们可以发现6个三角形正好 ...

  6. MFC 在对话框显示图片的多种方法

      我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一 ...

  7. 参加2013中国软件开发者大会(SDCC)会,听软件开发趋势

    1.SDCC        盛大召开的会议,既然参加了,就写篇博客记一下. 2.蒋公子     首先向大会主席台走来的是csdn老大...... 额,好像不是走过来的.蒋涛采用了个特殊的上台方式呢~ ...

  8. Github Atom

    码代码新神器-Github Atom   周末闲着没事,逛论坛发现了一个新的编辑器,由github发布的Atom编辑器.瞬间被吸引了,所以就去尝试着折腾了一下,后来发现这个编辑器确实很不错,他的特点就 ...

  9. rcp(插件开发)org.eclipse.ui.decorators 使用

    org.eclipse.ui.decorators这个扩展点可以为对应的节点添加不同的图标显示. 使用方式都差不多,以下就转载一下使用方式: 1.添加扩展点 org.eclipse.ui.decora ...

  10. IOS不用AutoLayout也能实现自己主动布局的类(3)----MyRelativeLayout横空出世

    对于IOS开发人员来说,在自己主动布局出现前仅仅能通过计算和设置frame的值来处理.这样设置位置时就会出现非常多硬编码,同一时候在屏幕旋转和不同屏幕之间适配时须要编码又一次调整位置和尺寸,我们也能够 ...