天天看点

OpenStack_Swift源码分析——创建Ring及添加设备源码详细分析1 创建Ring 代码详细分析2 为Ring添加设备

在中我们详细分析了Ring的具体工作过程,下面就Ring中增加设备,删除设备,已经重新平衡的实现过程作详细的介绍。

首先看RingBuilder类

其中devs里面没一个dev含有的属性为:  dev  =  {‘weight‘: 100.0, ‘zone‘: 0, ‘ip‘: ‘127.0.0.1‘, ‘region‘: 0, ‘parts‘: 0, ‘id‘: 0, ‘meta‘: ‘some meta data‘, ‘device‘: ‘sda1‘, ‘parts_wanted‘: 96, ‘port‘: 6000}

其中part_wanted 是在添加设备后设备需要的虚拟节点数,parts为设备已经被分配的虚拟节点。

在swift-ring-builder object.builder create 18 3 1 

会调用Command类的create方法,具体看此方法:

在第一次创建时,首先会判断/etc/swift下是否有object.builder文件,没有需要创建此文件,并根据命令中个的 18 3 1 来实例化RingBuilder,最后将builder序列化。

创建了.builder文件后,就需要添加设备,下面为添加一个设备的命令:swift-ring-builder object.builder add z2-127.0.0.1:6020/sdb2 100  

其中 add 指明为添加设备 z2 为zone2,127.0.0.1:6020/sdb2为设备ip地址,绑定的端口以及设备中存储文件的磁盘,100为设备的权重

下面看添加设备的具体实现:

这个方法在main方法中药判断/etc/swift下是否有object.builder文件,在第一步create中我们已经创建了此文件,现在只需要将他反序列化回来并用存的数据来实例化RingBuilder类,然后调用Commands类的add方法:

将新添加的设备会加入到devs[]中,其中会调用add_dev,下面看此方法的具体实现

此方法主要是获得weight,并为设备dev中的id赋值,以及part_wanted赋值。其中part_wanted值的计算为:

((self.parts * self.replicas / sum(d[‘weight‘] for d in self._iter_devs())) * dev[‘weight‘]) - dev[‘parts‘]

parts=2**power(此处在create方法中的18) replicas为备份数,此处为3

即part_wanted=((虚拟节点数*备份数/所有已添加的节点的weight和)*当前设备的weight)-已被分配给此设备的虚拟节点数

至此 创建Ring和为Ring添加设备讲解完毕,再完成这两个步骤后,就需要平衡环,并为replica2part2dev(备份到分区到设备的映射)赋值,平衡算法是Ring 的核心算法,在下一篇文章中具体讲解。

由于本人水平有限,文中难免出现理解错误,敬请指正、交流,谢谢!

继续阅读