OpenStack之Swift:环(Ring)工具解析

来源:互联网 发布:mac app store无法登录 编辑:程序博客网 时间:2024/06/03 16:59

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

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上

环文件内如何为设备分配分区号



原创粉丝点击