天天看點

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 的核心算法,在下一篇文章中具體講解。

由于本人水準有限,文中難免出現了解錯誤,敬請指正、交流,謝謝!

繼續閱讀