对consistencygroup的一些研究和实践,consistencygroup


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

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

    根据当前J版本代码的实现,修改点有:

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

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

     备份功能可以结合当前快照的实现来做,而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等,待后续再关注。

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

    所以,如果后续有存储厂商想实现自己的一致性组,在开发过程中注意上述问题。

    参考:

        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


 

    


社会实践可以研究什

比如学校里的勤工俭学处的相关活动。
也可以做家教,我就兼职一份家教,感觉挺好的。呵呵。
打一些零工。比如帮别人看店铺,做业务,推销什么的……
这些都可以挣一些伙食费啦,挺好的。
如果对金钱不是特别需求,那就可以选择做一些义工,支教,这不仅锻炼了能力,又给社会增添了一份和谐,奉献自己的一份微薄之力,特有意义。
也有在企事业单位搞实习,可以针对本专业或是非本专业,依你的兴趣爱好而定啦。比如会计,出纳,营销人员等。
学校有时也会组织活动。比如三下乡,做志愿者等等。
社会实践的意义就在于,它是课堂教育的外拓。学生不能光靠课本,人毕竟是社会动物,要依赖群体生活,所以社会实践就给我们提供了很好的途径去让我们适应社会。拓宽了我们的知识面。同时,巩固了所学的知识,接纳新知识,提高了自身素养,更充分地发挥了主观能动性,培养了社会责任感,缩小了理论与实践之间不可逾越的鸿沟。
希望我的回答对你有帮助。
 

哈工大研究生社会实践怎做

一般情况下,这个社会实践是没有人真正按照上面的要求完成的。

但是,因为需要盖章,所以一般都是班级集体组织去参加一些什么工厂的实习工作,或者去参加一些社区服务工作,如春蕾计划等等。

另外,最麻烦的就是写上面的一些日志之类的,那就需要自己最后几天突击一下,有针对性的写一些内容了。这个也要看你自己最后找的是哪个章,然后就写相关的内容。

这里所规定的社会实践,还不如学生自己去找一些实习岗位去真正实践一下呢,但是,因为哈工大的硕士实践相对较短,根本没有时间去自己实践或实习,两年时间里一般都是学习,干活,自己准备毕业,匆匆就过去了,所以这个社会实践也就只能应付了事了,没办法。

最后的最后,这个社会实践总归是能在班级内部消化掉的,这需要依靠你们的班长,给力一些就可以了。有些找学校学院,都能盖上章,或者是博物馆,或者是学校其他岗位,社区,等等,都能盖章的。
 

相关内容