【Swift】Ring文件
来源:互联网 发布:周传雄 知乎 编辑:程序博客网 时间:2024/06/03 17:11
Swift作为分布式对象存储,为了解决分布式带来的一系列热点问题,引入了一致性哈希算法。Ring,顾名思义就是环形空间,用于记录存储对象到物理设备之间的映射关系。
Swift通过'Account/Container/Object'来标识一个存储对象,针对Account、Container和Object各有一个Ring,这些Ring默认是存放在各个节点的/etc/swift下,分别是account.ring.gz、container.ring.gz、object.ring.gz,这些都是2进制文件并使用gzip进行压缩。下面学习下这些文件的格式:
首先,使用gzip打开其中一个ring文件:
>>> from gzip import GzipFile>>> from io import BufferedReader>>> ring_file = '/etc/swift/object.ring.gz'>>> gz_file = GzipFile(ring_file)>>> gz_file = BufferedReader(gz_file)前4个字节是magic字符串“R1NG”
>>> gz_file.read(4)'R1NG'接着2个字节是一个以大端模式存放的无符号短整数,代表版本,如下版本为1
>>> import struct>>> struct.unpack('!H', gz_file.read(2))(1,)接着4个字节是一个以大端模式存放的无符号整数,代表后面存放的json字节长度,如下长度为226
>>> struct.unpack('!I', gz_file.read(4))(226,)由上面可知接下来226个字节存放的是一个json格式字符串,读取并解析如下。里面的devs字段存放的是整个系统的物理存储设备信息,replica_count表示副本个数(与创建ring时的第二个参数对应),part_shift是用于移位的(如果之前创建ring时的第1个参数为n,那么这里就是(32-n))
>>> import json
>>> ring_dict = json.loads(gz_file.read(226))>>> ring_dict{u'devs': [{u'replication_port': 6000, u'zone': 1, u'weight': 100.0, u'ip': u'10.93.192.13', u'region': 1, u'port': 6000, u'replication_ip': u'10.93.192.13', u'meta': u'', u'device': u'vdb1', u'id': 0}], u'part_shift': 14, u'replica_count': 3}由于part_shift为14,说明partition或者虚拟节点的个数为2的(32-14)次方,那么接下来的2*2^18个字节就存放的是2^18个无符号短整数,每个无符号短整数代表物理设备id,然后这些整数构成的列表就代表着partition到物理设备之间的映射关系,由于副本数为3,那么以上这种映射关系有3份
>>> ring_dict['replica2part2dev_id'] = []>>> partition_count = 1 << (32 - ring_dict['part_shift'])>>> for x in xrange(ring_dict['replica_count']):... ring_dict['replica2part2dev_id'].append(array.array('H', gz_file.read(2 * partition_count)))
阅读全文
0 0
- 【Swift】Ring文件
- openstack swift ring文件解析
- OpenStack Swift源码分析(二)ring文件的生成
- SWIFT Ring原理
- Ring
- ring
- OpenStack之Swift:环(Ring)源码分析
- OpenStack之Swift:环(Ring)工具解析
- 深入云存储系统Swift核心组件:Ring实现原理剖析
- 深入云存储系统Swift核心组件:Ring实现原理剖析
- 深入云存储系统Swift核心组件:Ring实现原理剖析
- 深入云存储系统Swift核心组件:Ring实现原理剖析
- 深入云存储系统Swift核心组件:Ring实现原理剖析
- OpenStack Swift源码分析(4)----swift-ring-builder源代码解析之一
- OpenStack Swift源码分析(5)----swift-ring-builder源代码解析之二
- 深入云存储系统Swift核心组件:Ring数据结构及构建、重平衡操作
- 深入云存储系统Swift核心组件:Ring数据结构及构建、重平衡操作
- Swift build(.build)和ring(.gz)的数据结构和文件的持久化机制
- POJ 1469 COURSES
- Linux Redis的安装已经问题解决方案
- 滤波算法(2)(最大值、最小值、低通、巴特沃斯、Robinson_Guard)
- 测测你的Python水平的能力(可以作为Python面试题)
- js:jquery插件jquery.form.js API简介
- 【Swift】Ring文件
- 第16篇:angular字符串转换为变量名
- js实现视频上传截取缩略图
- Web 前端大婶
- 网页中的 <body> 和 <html> 元素及其样式
- PAT (Advanced Level) Practise 1069 The Black Hole of Numbers (20)
- 详解OTT与IPTV的不同之处
- Android camera相机开发拍照功能
- boost log库