OpenStack之Swift:环(Ring)工具解析
2012-10-28 16:34
330 查看
Builder工具为ring管理工具,今天主要解析其常用的几个操作(以account为例):
swift-ring-builderaccount.builder create 18 3 1
swift-ring-builderaccount.builder add z1-127.0.0.1:6012/sdb1 1
swift-ring-builderaccount.builder
swift-ring-builderaccount.builder rebalance
建立通过这样的命令:
swift-ring-builderaccount.builder create 18 3 1
其中:18,代表account 总的分区数目是2**18=262144,3代表分区副本的数量
从上图我们可以看到,模拟的4台机器,每台的分区数目为196608,且由于分区数有3个副本,所有可算出创建的分区数为
196608*4/3 = 262144,跟创建时的分区数是一样的。
对命令中的参数进行分割,验证其合法性
通过分割获得的参数,验证设备是否已经在系统中存在了
设备添加:
要添加设备的属性有:id,zone,ip,port,devicename,weight,meta,如:
builder.add_dev({'id': next_dev_id, 'zone':zone, 'ip': ip, 'port': port, 'device': device_name, 'weight': weight,'meta':meta})
在add_dev方法中,主要做了3件事情:
设备id检查,看是否同样的id已经存在了
设置设备的一些属性,并且将该设备加入设备列表
对builder的属性进行更新
如果某一个设备被删除了,所分配给它的分区被回收加入一个列表,以后再对这些分区重新分配到相应的设备上去,使用的分配方式跟之前一样,添加了设备之后,并不会立即就有分区分配到该设备,而是在下次重新平衡之后,才会根据权重,为该设备分配相应的分区。
4.将下面的添加设备的字典信息序列化到文件account.builder中去:
{'part_power':self.part_power,
'replicas': self.replicas,
'min_part_hours':self.min_part_hours,
'parts': self.parts,
'devs': self.devs,
'devs_changed':self.devs_changed,
'version': self.version,
'_replica2part2dev':self._replica2part2dev,
'_last_part_moves_epoch':self._last_part_moves_epoch,
'_last_part_moves':self._last_part_moves,
'_last_part_gather_start':self._last_part_gather_start,
'_remove_devs':self._remove_devs}
平衡环中的分区大致要经历如下步骤:
通过调用builder.py文件获得:
devs_changed:该值记录了设备信息是否改变,包括设备的添加,删除,改变;
last_balance(get_balance()):就是上次执行命令rebalance命令的时候获得的平衡值;
parts, balance:执行rebalance操作时涉及到的分区数目,和涉及到的平衡值。
进行参数判断,确认是否执行rebalance操作。
通过调用builder.validate(),验证分区是否被正确地分配到设备,和区域上面去了等。
通过pickle将环数据,和builder数据序列持久化到相应的文件上,具体如下:
通过将最近没用被重新分配的分区进行重新分配来对ring进行平衡。
权重分区=分区数*副本数/所有设备的权重和,如:
262144*3/4=196608
设备平衡值=设备分区*100/(设备权重*权重分区)-100,如:
100*196608/1*196608-100=0
通过副本获得分区,通过分区获得设备
通过对builder对象调用相应的参数和函数,将相应的数据显示给用户,结果如下:
上图为分区的数目
上图为副本的数目
计算某个对象应该存储的分区号:
账户,容器,对象分别为:account,container,object
计算/account/container/object的hash
由上图可以看到,该分区号分别位于设备0,1,2上
环文件内如何为设备分配分区号
swift-ring-builderaccount.builder create 18 3 1
swift-ring-builderaccount.builder add z1-127.0.0.1:6012/sdb1 1
swift-ring-builderaccount.builder
swift-ring-builderaccount.builder rebalance
5.1创建环
(swift-ring-builder account.builder create18 3 1)建立通过这样的命令:
swift-ring-builderaccount.builder create 18 3 1
其中:18,代表account 总的分区数目是2**18=262144,3代表分区副本的数量
从上图我们可以看到,模拟的4台机器,每台的分区数目为196608,且由于分区数有3个副本,所有可算出创建的分区数为
196608*4/3 = 262144,跟创建时的分区数是一样的。
5.2设备添加
(swift-ring-builderaccount.builder add z1-127.0.0.1:6012/sdb1 1)对命令中的参数进行分割,验证其合法性
通过分割获得的参数,验证设备是否已经在系统中存在了
设备添加:
要添加设备的属性有:id,zone,ip,port,devicename,weight,meta,如:
builder.add_dev({'id': next_dev_id, 'zone':zone, 'ip': ip, 'port': port, 'device': device_name, 'weight': weight,'meta':meta})
在add_dev方法中,主要做了3件事情:
设备id检查,看是否同样的id已经存在了
设置设备的一些属性,并且将该设备加入设备列表
对builder的属性进行更新
如果某一个设备被删除了,所分配给它的分区被回收加入一个列表,以后再对这些分区重新分配到相应的设备上去,使用的分配方式跟之前一样,添加了设备之后,并不会立即就有分区分配到该设备,而是在下次重新平衡之后,才会根据权重,为该设备分配相应的分区。
4.将下面的添加设备的字典信息序列化到文件account.builder中去:
{'part_power':self.part_power,
'replicas': self.replicas,
'min_part_hours':self.min_part_hours,
'parts': self.parts,
'devs': self.devs,
'devs_changed':self.devs_changed,
'version': self.version,
'_replica2part2dev':self._replica2part2dev,
'_last_part_moves_epoch':self._last_part_moves_epoch,
'_last_part_moves':self._last_part_moves,
'_last_part_gather_start':self._last_part_gather_start,
'_remove_devs':self._remove_devs}
5.4.重新分配分区
(swift-ring-builder account.builderrebalance)平衡环中的分区大致要经历如下步骤:
通过调用builder.py文件获得:
devs_changed:该值记录了设备信息是否改变,包括设备的添加,删除,改变;
last_balance(get_balance()):就是上次执行命令rebalance命令的时候获得的平衡值;
parts, balance:执行rebalance操作时涉及到的分区数目,和涉及到的平衡值。
进行参数判断,确认是否执行rebalance操作。
通过调用builder.validate(),验证分区是否被正确地分配到设备,和区域上面去了等。
通过pickle将环数据,和builder数据序列持久化到相应的文件上,具体如下:
通过将最近没用被重新分配的分区进行重新分配来对ring进行平衡。
权重分区=分区数*副本数/所有设备的权重和,如:
262144*3/4=196608
设备平衡值=设备分区*100/(设备权重*权重分区)-100,如:
100*196608/1*196608-100=0
通过副本获得分区,通过分区获得设备
5.5.显示环与设备相应信息
(swift-ring-builder account.builder)通过对builder对象调用相应的参数和函数,将相应的数据显示给用户,结果如下:
5.6.设置权重
5.7.信息设置
5.8删除设备
5.9再次重新平衡
5.10环验证
5.11设置最小分区时间
上图为分区的数目
上图为副本的数目
计算某个对象应该存储的分区号:
账户,容器,对象分别为:account,container,object
计算/account/container/object的hash
由上图可以看到,该分区号分别位于设备0,1,2上
环文件内如何为设备分配分区号
相关文章推荐
- OpenStack Swift源码分析(5)----swift-ring-builder源代码解析之二
- openstack swift ring文件解析
- OpenStack之Swift:环(Ring)源码分析
- Openstack Swift开源云存储技术解析
- Swift源码解析之创建Ring文件
- Swift源码解析之添加设备到Ring
- openstack-Swift中ring的通俗理解
- Openstack Swift监控工具Tulsi部署手册
- OpenStack_Swift源码分析——创建Ring及添加设备源码算法详细分析
- OpenStack Swift源码分析(4)----swift-ring-builder源代码解析之一
- OpenStack_Swift源代码分析——创建Ring及加入�设备源代码算法具体分析
- OpenStack_Swift源码分析——Ring的rebalance算法源代码详细分析
- OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法
- OpenStack_Swift源码分析——Ring基本原理及一致性Hash算法
- 【原创】OpenStack Swift源码分析(二)ring文件的生成
- OpenStack_Swift源码分析——Ring代码的组织架构
- CentOS6.2下一步一步源代码安装OpenStack(九)Swift存储节点安装、配置及运行
- php 解析dom,可用作抓取工具
- 自动解析IP地址工具
- Python 边做边学 8.4 工具类--HTML解析工具(HtmlSoupUtil)