对consistencygroup的一些研究和实践

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
时间: 2024-10-11 16:27:35

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

在“软件工程:研究与实践”研讨会上关于UML Use-Case的开放空间讨论

2014年12月20日我有幸参加了复旦大学承办的"软件工程:研究与实践"研讨会.在下午的开放空间活动中,我推荐了UML Use-Case作为6个话题之一,成为了这个话题的主持人.就这个话题与多位老师和业界专家进行了探讨.最后我作为此话题的代表向大家汇报了话题讨论.本文试图来整理记录下当时的讨论. 1,在产业界UML和Use Case并没有得到很广泛的使用,能够用Use Case表达出原来SRS表达的内容,已经算是不错了.难以充分利用OOSE的好处.推测的原因有1,基于功能分解的结构化过

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

提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OSS(https://www.aliyun.com/product/oss) 4.HTTPS(http://baike.baidu.com/view/14121.htm) 阅读目录结构 引: 一.准备工作 二.整体功能结构 三.具体实现步骤 四.关键点和问题处理 五.延伸与扩展 六.总结与思考 引:

TensorFlow中国研发负责人李双峰演讲实录:TensorFlow从研究到实践

5 月 23 日周三晚,TensorFlow 中国研发负责人.Google 搜索架构技术总监李双峰受邀参与北京大学"人工智能前沿与产业趋势"系列座谈会,分享了深度学习的发展与应用.TensorFlow 从研究到实践的相关内容. 感谢作为北京大学"人工智能前沿与产业趋势"系列座谈会合作媒体的量子位旗下公众号"吃瓜社"俞晶翔.张康对活动的记录,演讲嘉宾李双峰也参与本文的联合撰写和修改. 主讲嘉宾:李双峰,TensorFlow 中国研发负责人.Goog

基于原生的移动跨平台研究和实践

基于原生主要是针对基于webview+h5比较来说的,基于H5的我不想再讨论了,我想尝试的是从UI到功能都是原生,而不是用H5模拟的所谓原生体验. 背景 我们从开发角度来考虑,但凡想从事长远的开发工作,都有自己的技术积累,最简单的就是一些UI组件和功能组件的封装. 举例,我在一个App里实现了一个点击一下能自动切换背景颜色的Button,包括点击的动画效果,我肯定会考虑封装成一个类,比如叫MyButton,在Android下它继承Button类, 在ios下它继承UIButton类.做下一个Ap

solr入门之solr安全控制的研究和实践(二)

Permission Attributes(权限属性) 每个用户又一个或者几个权限组成,每个权限由几个定义过可以做哪些事的属性组成. 下面有一些不能被修改的预定义权限: Pre-defined Permissions 有一些预定义的权限.这些固定的默认值,不能修改,无法添加新属性.要使用这些属性,只需定义一个角色,包括这个权限, 然后给一个用户分配角色. security-edit: 该许可允许编辑安全配置,这意味着任何更新的操作修改security.json 通过api将被允许. securi

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

文章初衷 为了应对将来在线(特别是无线端)业务量的成倍增长,后端服务的分布式化程度需要不断提高,对于服务的延迟和容错管理将面临更大挑战,公司框架和开源团队选择内部推广Netflix的Hystrix,一是为了推进各部门的服务使用覆盖率,二是为了增加C Sharp语言版本的参与度(目前公司至少三成服务由.NET编写).该博文属于个人对Hystrix研究和实践经验. 什么是Hystrix? Hystrix是世界最大在线影片租赁服务商Netflix开源,针对分布式系统的延迟和容错库.该库由Java写成,

Hook android系统调用的实践

本文博客地址:http://blog.csdn.net/qq1084283172/article/details/71037182 一.环境条件 Ubuntukylin 14.04.5 x64bit Android 4.4.4 Nexus 5 二.Android内核源码的下载 执行下面的命令,获取 Nexus 5手机 设备使用的芯片即获取Nexus 5手机设备内核源码的版本信息. $ adb shell # 查看移动设备使用的芯片信息 $ ls /dev/block/platform 执行的结果

ASP.NET跨平台最佳实践

前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java更优秀(并非C#天生丽质,而是它站在了巨人的肩膀上). 本文并非为.NET正名而来,而仅仅是分享作者近几年在ASP.NET跨平台方面的研究与实践经验,算是对八年的.NET之路作一个阶段性的总结. .NET技术自诞生以来,便一直因其跨平台能力差而广受诟病.这里面有微软有意为之,也有别有用心之人在混淆视

对Google C++编程规范的理解和实践

1. #define保护 所有头文件都应该使用#define 防止头文件被多重包含(multiple  inclusion),命名格式为: <PROJECT>_<PATH>_<FILE>_H_ 为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径.例如,项目foo 中的头文件 foo/src/bar/baz.h按如下方式保护: #ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif // FOO_BAR_B