一直以为对swift的ring文件充满好奇,这段时间重新研究swift,正好借此机会好好研究下。


ring文件时一个Gzip的压缩文件,可以通过相关python库直接读取这个文件,代码如下:

gz_file =GzipFile('/etc/swift/object.ring.gz','rb')


这里的gz_file其实就是一个文件句柄,通过read我们可以读取数据进行分析。

1、 前4个字节 ‘RING‘

2、 第5和6个字节版本信息 1

3、 接下来的四个字节是一个字典(设备信息、part-shift、replica_count)的长度信息

4、 接下来就该字典的内容,如下:

{u'devs':[{u'replication_port': 6000,u'zone': 1,u'weight': 1.0,u'ip': u'192.168.246.6',u'region': 1,u'port':6000,u'replication_ip': u'192.168.246.6',u'Meta': u'',u'device':u'vdb',u'id': 0},{u'replication_port': 6000,u'zone': 2,u'ip': u'192.168.246.7',u'port': 6000,u'replication_ip': u'192.168.246.7',u'device': u'vdb',u'id': 1},u'zone': 3,u'ip': u'192.168.246.8',u'replication_ip': u'192.168.246.8',u'id':2},u'ip':u'192.168.246.9',u'replication_ip':u'192.168.246.9',u'id': 3}],

u'part_shift': 14,

u'replica_count': 2}

其中:

devs 指的是这个ring中包含哪些设备,就是通过swift-ring-builder add这个操作加进来的设备;

part_shift: 32-partition_power;

replica_count 指的是副本数;

5、 接下来是replica_count*(2*partition_count)个字节的信息,这部分内容不可直接打印,但load ring文件的时候这部分会转 换成array,作为ring_dict['replica2part2dev_id']的列表项(partition_count = 1 << (32 - ring_dict['part_shift'])),详细 说明如下:ring_dict['replica2part2dev_id']是一个列表,其项目的数目等于replica_count,每一项都是一个array,其形式为 array.array ('H',gz_file.read(2 * partition_count)),array可以打印出来,形式上就是一个数组,每个array包含了partition 个项,每一项的内容就是device的id。

6、至此ring文件就读完了

重点说下ring_dict['replica2part2dev_id']的value的含义。顾名思义,其实就是副本—partition—设备id的映射关系。顶层是 array,每个array对应一个副本;array的大小与partition数目一致;array中每一项对应一个partition;array[partition-num] 得到的就是这个partition的设备id。比如要查询partition=X的设备,方法如下:


Devid=[]

For replica in ring_dict['replica2part2dev_id']:

Devip.append(replica[X])

ring_dict['replica2part2dev_id']其实就是如下的一个二维数组:


在分析的过程中对swift的概念也有所理解:

创建ring时,通过指定的参数即可计算出partition的数据,partition相关的内容也是存放在ring文件中。在对运行中的程序,partition对应于array,array的数量就是备份的次数。我们可以认为每个partition在每个array中对应一个备份。我们可以查询给定partition的位置(备份几次,就会有几个位置)。

由account/container/object可以查询到对应的part,再由part可以查询到对应的node。

openstack swift ring文件解析的更多相关文章

  1. 深入云存储系统Swift核心组件:Ring实现原理剖析

    它的目的是用于托管Rackspace的CloudFilesservice,原始项目代号是swift,所以沿用至今。Ring是Swift中最重要的组件,用于记录存储对象与物理位置间映射关系。先来看一下Swift文档中关于Ring的描述:Ring用来确定数据驻留在集群中的位置。有单独对应于Account数据库、container数据库和单个object的ring。Ring使用zone的概念来保证数据的隔离。每个partition的replica都确保放在了不同的zone中。本文逐步深入探讨了Swift如何通过

  2. openstack swift ring文件解析

    一直以为对swift的ring文件充满好奇,这段时间重新研究swift,正好借此机会好好研究下。

  3. KeyStone安装部署笔记

    KeyStone客户端:OpenStack身份服务API的命令行接口。OpenStack出于扩展性的考虑也支持多个region。下面的命令在regionOne创建了keystone的三种端点:为admin租户和用户申请令牌:最后验证admin租户和用户:输出结果验证了身份服务工作正常,Keystone安装部署成功。

  4. OpenStack对象存储――Swift

    Swift前身是RackspaceCloudFiles项目,随着Rackspace加入到OpenStack社区,于2010年7月贡献给OpenStack,作为该开源项目的一部分。Swift目前的最新版本是OpenStackEssex1.5.1。Swift特性在OpenStack官网中,列举了Swift的20多个特性,其中最引人关注的是以下几点。在OpenStack中还可以与镜像服务Glance结合,为其存储镜像文件。Auth认证服务目前已从Swift中剥离出来,使用OpenStack的认证服务Keysto

  5. OpenStack之swift安装笔记

    安装过程依然参考的是OpenStack的官方安装手册,但补充了一些细节。OpenStack的对象存储是一个多租户的、高可扩展的对象存储系统,通过RESTfulHTTPAPI管理着大量的非结构化数据,在部署对象存储之前必须至少安装了身份服务。首先在KeyStone中创建Swift的用户、服务及endpoint,具体命令及结果如下:然后安装proxy-server,swift客户端、memcached等:yuminstallopenstack-swift-proxypython-swiftclientpyth

  6. OpenStack入门到实战视频教程全集下载罗勇老师经典教程系列

    全网最经典的openstack视频教程,现在免费了!罗老师讲得实在是太好了,目前绝对是全网最好的openstack入门视频,而且讲得特别细,非常适合初学者学习,收集了好久终于齐了,现在贡献给大家。

  7. OpenStack Swift 存储策略

    OpenStackSwift对象存储及其存储策略简介Swift2.0于2014年7月8日发布,其中最重要的新特性是存储策略,该特性改变了以往存储系统中存储策略由设计与实施方决定的做法,让用户能够以Container为粒度,为不同需求的数据指定不同的副本数量、不同参数的纠删码、不同性能的存储介质、不同地理位置、不同的后端存储设备。本文只是对存储策略做了一个简要的介绍,让读者体会存储策略的用途,进一步深入探索可以查看参考资料了解有关OpenStackSwift的更多相关信息。

  8. OpenStack Swift源码导读:业务整体架构和Proxy进程

    OpenStack的源码分析在网上已经非常多了,针对各个部分的解读亦是非常详尽。其中proxy是前端的业务接入进程。account、container和object目录分别是账户、容器和对象的业务处理逻辑进程。各个业务进程或模块之间的逻辑关系可以参考《OpenstackSwift简介》文中的架构图。在《OpenstackSwift简介》从理论上面介绍了具体的节点寻找过程。

  9. cinder swift的区别

    [原]OpenStack入门以及一些资料之2014-4-29阅读1144评论0注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明。它拥有自己的文件系统,通过网络文件系统NFS或通用文件系统CIFS对外提供文件访问服务。Raid,不同的raid等级在增加数据可靠性以及增加存储器(群)读写性能间取得平衡。卷组描述区域,和磁盘将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷的VGDA中。

  10. 《转》OpenStack对象存储——Swift

    Swift前身是RackspaceCloudFiles项目,随着Rackspace加入到OpenStack社区,于2010年7月贡献给OpenStack,作为该开源项目的一部分。Swift目前的最新版本是OpenStackEssex1.5.1。Swift特性在OpenStack官网中,列举了Swift的20多个特性,其中最引人关注的是以下几点。在OpenStack中还可以与镜像服务Glance结合,为其存储镜像文件。Auth认证服务目前已从Swift中剥离出来,使用OpenStack的认证服务Keysto

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部