Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程
1 初始加入设备后、上传Object的详细流程
前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令:
swift-ring-builder object.builder rebalance
上面几条命令语句中,黑色的为初始创建Ring。绿色部分为向Ring中加入设备,四个设备分别位于不同的Zone中。且权重是一样的。加入完设备后须要对Ring进行平衡,以便得到replica2part2dev_id。当中关于create add rebalance方法的详细实现过程请參考OpenStack_Swift源代码分析——Ring的rebalance算法源代码详细分析和OpenStack_Swift源代码分析——创建Ring及加入设备源代码算法详细分析两篇文章。
平衡后得到的replica2part2dev_id 例如以下图所看到的:
图1 初始平衡Ring后 replica2part2dev_id的映射
上图中第一行为分配编号(在create时输入的power为5。故为32个分区)。三个list分别代表了三个备份。上图中一个设备又同一时候相应多个不同的分区,例如以下图所看到的:
图 2 设备反映射分区
结合图1和图2。一个设备相应读个分区,这些在存储数据时,能更好的解决平衡性问题。
在得到了replica2part2dev_id 后,如今我们向集群中存入一个对象。其步骤例如以下所看到的:
图3 存入一个对象
向集群中存入对象的流程例如以下图所看到的:
图4 存入对象的流程
存入对象时,首先依据对象的名称(account/container/object),计算其hash值。的到hash值后,取hash值的前四字节,且向右移动32-power位得到当前object相应的分区号。如15,得到分区号后。利用分区号到replica2part2dev_id中找到此分区相应的三个设备的Id,如图1所看到的的设备ID为3 1 4 。依据这三个设备的ID,到devs中找到详细的设备,依据设备的IP。port已经存储文件的磁盘所挂载的目录,如sdb1。
将数据存如设备中。数据存入设备中的目录结构为srv/node/sdb1/objects/15/hash值后位/hash/.data文件。当中15为分区号,所以文件右移动得到的分区号为15的在该设备中都存入此目录下。
2 添加设备
假如系统执行了一段时间后。因须要存储很多其它的对象,现须要对系统进行扩展,例如以下。我们如今添加一个设备:
swift-ring-builder object.builder add z1-127.0.0.1:6050/sdb5 100
在zone1里面右添加了一个设备,其权重仍为100。加入设备后,每个设备的part_wanted值会变化,之前被分配的设备。会因新加入设备后其会超出其先须要的part_wanted故须要把他们收集回来,分配给新添加的设备,收集的详细算法实现请參见我前几篇博客,里面有详细的介绍。加入设备后,又一次对Ring进行平衡,平衡后replica2part2dev_id例如以下图所看到的:
图5 加入设备后映射的变化
如上图(图中红线上部分为加入设备后的新映射,红线下部分为没加入设备前的映射)所看到的,再加入了设备后。被收集的分区是从第一个备份(第一行)先開始收集。假设第一个备份都被收集完,则再从第二个备份開始收集。如今仅仅加入了一个设备。不会收集到第二个备份的分区,故如绿框中所看到的后两个分区中分区所相应的设备ID都没有变化。图中小红框和小绿框中所看到的的,第一次平衡和新加入一个设备后平衡的分区15所相应的设备Id 当中一个由3变为5。
这样的变化,数据的一致性是怎样保证的呢?为保证因又一次移动平衡而带来的分区和设备映射的变动,Replicator在保证数据的一致性方面起到至关关键的数据。
由于Replicator这个守护进程在每个server上都有执行。故对于设备3
。它首先依据分区目录的名字获得分区号然后利用Ring类对外通过的方法。得到此分区相应的设备,此时它发现新的replica2part2dev_id中没有了其本身。这时它会把目录名为15及其下的全部文件都删除。而对于分区15所相应是新设备5,它是怎样得到这些文件的呢?我们知道,Swift数据的同步是基于推送模式的。也就是4和3 会把其目录下的文件推送给设备5。比方设备4,其Replicator,在获得分区15所相应的设备后,和3对照,发现没有文件不同,故不推送数据,而发现5下没有分区15所相应的内容,故其须要将自己分区15所相应的文件推送给它,设备3也是相同的原理。
3 删除设备
集群又执行了一些时间。当中有些设备。由于执行时间较长。设备老化,现须要将其从集群删掉,Swift设备的删除,不是直接的物理删除,先将其weight设置为0,当其weight变为0后,其它的设备的part_wanted就好变大,故在rebalnace时须要先把设备1(加入删除设备1)所相应的分区都收回,然后再又一次分配给其它分区。
这个过程中replica2part2dev_id变化例如以下:
图6 删除设备后replica2part2dev_id的变化
如图6所看到的(绿线上方为删除设备后的新映射,绿线和和蓝线之间为没有删除设备前加入设备后的分区映射。最底下为起初的映射)设备1所相应的全部分区都被收集了。而每个分区所相应的新的设备都会经过其它两个设备,来将他们文件下的对象推送给新映射的设备。
Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程的更多相关文章
- Nouveau源代码分析(三):NVIDIA设备初始化之nouveau_drm_probe
Nouveau源代码分析(三) 向DRM注冊了Nouveau驱动之后,内核中的PCI模块就会扫描全部没有相应驱动的设备,然后和nouveau_drm_pci_table对比. 对于匹配的设备,PCI模 ...
- 【E2LSH源代码分析】p稳定分布LSH算法初探
上一节,我们分析了LSH算法的通用框架,主要是建立索引结构和查询近似近期邻.这一小节,我们从p稳定分布LSH(p-Stable LSH)入手,逐渐深入学习LSH的精髓,进而灵活应用到解决大规模数据的检 ...
- 源代码分析:LayoutParams的wrap_content, match_parent, 而详细的价值观
问题: 慢慢地熟悉android 的过程中.发现view 要么layout初始化,建或者生产活动是很清楚.被添加到父控制,然后开始了相应的生命周期.但父控件的整个界面.还是第一个系统view. 怎么来 ...
- 协议的注冊与维护——ndpi源代码分析
在前面的文章中,我们对ndpi中的example做了源代码分析.这一次我们将尽可能深入的了解ndpi内部的结构和运作.我们将带着以下三个目的(问题)去阅读ndpi的源代码. 1.ndpi内部是怎么样注 ...
- 如何添加删除子网卡eth0:1(linux案例)
这种方法实现了单网卡多IP,我的系统是centos7的,如何添加删除子网卡IP详细请看下面操作例子 添加子网卡IP:ifconfig ens3:1 192.168.0.100/24 ...
- 【VS开发】【Live555-rtsp】RTSP服务器实例live555源代码分析
原文地址:RTSP服务器实例live555源代码分析作者:mozheer 1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClient ...
- 源代码分析:onAttach, onMeasure, onLayout, onDraw 的顺序。
从前文<源代码解析:dialog, popupwindow, 和activity 的第一个view是怎么来的?>中知道了activity第一个view或者说根view或者说mDecorVi ...
- OpenStack_Swift源代码分析——创建Ring及加入�设备源代码算法具体分析
1 创建Ring 代码具体分析 在OpenStack_Swift--Ring组织架构中我们具体分析了Ring的具体工作过程,以下就Ring中添加�设备,删除设备,已经又一次平衡的实现过程作具体的介绍. ...
- STL源代码分析——STL算法remove删除算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...
随机推荐
- BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化
我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...
- 使用C++日志库log4cplus
用vs2015编译log4cplus,新建工程使用该库的时候出现连接错误,错误原因如下所述: 编译unicode版,可以正常使用了.
- 【踩坑】nextSibling 和nextElementSibling的区别
DOM 使用nextSibling属性返回指定节点之后的下一个兄弟节点,(即:相同节点树层中的下一个节点). nextSibling属性与nextElementSibling属性的差别: nextSi ...
- PHP的垃圾回收机制(开启垃圾回收机制后的优缺点是什么)
PHP的垃圾回收机制(开启垃圾回收机制后的优缺点是什么) 一.总结 一句话总结: 拿时间换空间:针对内存泄露的情况,可以节省大量的内存空间,但是由于垃圾回收算法运行耗费时间,开启垃圾回收算法会增加脚本 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
- PAT甲级——A1012 The Best Rank
To evaluate the performance of our first year CS majored students, we consider their grades of three ...
- Ajax的简单基础
什么是 AJAX ? AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...
- JSP-案例-商品增删改
商品的增删改查 1显示 部分代码 Dao public List<Product> findAllProduct() throws SQLException { QueryRunner r ...
- Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...
- Leetcode485.Max Consecutive Ones最大连续1的个数
给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组 ...