1、Ring的基本概念

Ring是swfit中最重要的组件。用于记录存储对象与物理位置之间的映射关系,当用户须要对Account、Container、Object操作时,就须要查询相应的Ring文件(Account、Container、Object都有自己相应的Ring),Ring 使用Region(近期几个版本号中新增加的)、Zone、Device、Partition和Replica来维护这些信息,对于每个对象,依据你在部署swift设置的Replica数量,集群中会存有Replica个对象。部署完毕后,相应的Ring文件也创建,如我上篇博客中部署演示样例,在/etc/swift中会存有Ring文件。

2、Ring基本原理及一致性Hash算法

2、1一致性Hash算法

Swift利用一致性Hash算法构建了一个冗余扩展的分布式对象存储集群、Swift採用一致性哈希的主要目的是在改变集群的device数量时。可以尽可能少地改变已存在Key和device的映射关系。本文将对一致性Hash算法进行一些理解性的介绍,关于一致性Hash算法其它參考资料做详细的理解。

swift中一致性hash算法的详细代码实现,我将在下边几篇博客中详细介绍。

2、2、1 Ring环形空间

图1 环形Ring

如图所看到的的。hash算法将value映射成一个0—2**32-1的数值空间。

2.1.2 对象映射到Ring

如果有四个对象、通过hash函数计算每个对象相应的hash值在环上的分布例如以下。

swift中利用了MD5哈希算法,依据对象的名字进行hash的:

hash(object1)=key1;

...........

hash(object4)=key4

图2 object的key值映射到Ring

2.1.3 存储设备映射到Ring

相应存储设备,利用相同的Hash算法。将value映射到环上。假如有三个设备device1。device2。device3。他们相应的hash值为dev1,dev2,dev3,其在Ring上的分布例如以下图所看到的。

图3 设备映射到Ring

2.1.4 对象和设备的映射

如今设备和对象通过hash算法都映射到了Ring上。那么怎样将对象映射到将要存储的设备上呐,在这个环。每个对象从自己在环上的位置開始,按顺时针方向移动,直到遇到一个设备,则把对象存入到此设备上,如上图所看到的。则key1会映射到dev2。key4映射到dev3,key3,key2映射到dev1。假设添加一个设备device4,若其hash值为dev5。其在Ring上的映射为

图4 新增设备后的Ring

对于新增的设备device4。环中须要变动的对象仅仅有key3所相应的对象。它在按顺时针找设备时找到的是device4而不是device1,其它的数据存储不变。这样降低了数据的迁移。

2.1.5虚拟节点

平衡性是hash算法的一个重要指标,平衡性是指对于存储的全部对象,尽可能均匀的分不到全部的设备上去。如上图所看到的,若是hash算法所算出的对象hash值大多数落在顺时针方向的key4到key2之间时。还是按如上方法对象映射设备,device2就得到非常少的对象存储。以至于其它三个设备承受了比較大的压力。显然这样设计是不符合实际需求的。引入虚拟节点能非常好的解决此问题。

虚拟节点实际上是实际节点在空间中的复制品,一个实际的节点相应若干个虚拟的节点,增加虚拟节点后,对象的存储从对象—设备的映射转换为对象——虚拟节点——设备的映射,虚拟节点在空间中按hash值排列。

假如虚拟节点为20个,他们均匀的分布在Ring中。每个设备对一个的虚拟节点为5个。对象映射设备时变为如图所看到的的过程:

图5 对象—虚拟节点—设备映射过程

2.2 Ring 基本原理

2.2.1Replica

假设数据在整个集群中仅仅有一份,一旦发生问题就可能会造成数据的永久性丢失。因此。须要有冗余的副本来保证数据安全。Swift中引入了Replica的概念,其默认值为3,在部署时可也指定详细的本分树。理论根据主要来源于NWR策略(也叫Quorum协议)。

NWR是一种在分布式存储系统中用于控制一致性级别的策略。在Amazon的Dynamo云存储系统中,使用了NWR来控制一致性。

当中。N代表同一份数据的Replica的份数,W是更新一个数据对象时须要确保成功更新的份数。R代表读取一个数据须要读取的Replica的份数。 公式W+R>N,保证某个数据不被两个不同的事务同一时候读和写。公式W>N/2保证两个事务不能并发写某一个数据。

在分布式系统中,数据的单点是不同意存在的。即线上正常存在的Replica数量为1的情况是很危急的,由于一旦这个Replica再次出错,就可能发生数据的永久性错误。

假如我们把N设置成为2,那么仅仅要有一个存储节点发生损坏,就会有单点的存在。所以N必须大于2。N越高。系统的维护成本和总体成本就越高。

工业界通常把N设置为3。

2.2.2 Zone

假设全部的设备都在一个机架或一个机房中。那么一旦发生断电、网络故障等。都将造成用户无法訪问。因此须要一种机制对机器的物理位置进行隔离,以满足分区容忍性(CAP理论中的P)。因此。Ring中引入了Zone的概念,把集群的device分配到每一个Zone中。

在swift 中当中同一个Partition的Replica不能在同一个Zone内,也就是说全部的数据备份应该分布在不同的zone中。在近期版本号的swift 中又引入了比Zone更大的概念Region。

2.2.3  Weight

在Ring每个设备引入了weight概念。weight 的作用就是,假如一个集群中有的设备容量为1T。有的为2T、3T,对于不共同的设备,在存储数据时,我们肯定希望容量的更大的设备有很多其它的被选择的机会。存储很多其它的对象,通过设置weight。存储容量多的设备有更大的权重。它也就有了更大的part_wants,那么就会有很多其它的虚拟节点和它映射,有很多其它的虚拟节点映射后,对象就有更大的可能落在它所相应的虚拟节点上,这样就会有很多其它的机会得到对象。

2.2.4 数据迁移时间

在部署swift 时能够设定数据的 最小迁移时间如我上篇博客swift部署中指示的为1个小时

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

3 一致性Hash算法在Ring中的应用

上两节介绍了Ring的基本原理以及一致性hash算法的原理,如今解说Ring是怎样使用一致性hash算法的。

在Ring 中有一个replica2part2dev(备份到分区到设备的映射),replica2part2dev是含有replica(replica为正整数时。)个子list的list,,每个子list含有2**power个元素。当replica为>1的float值时会有int[replica]+1个子list,当中最后一个list长度为(replica-int[replica])*2**power。比方在2.2.4中部署时指示的power为18 。replica为3,而每个元素中存放的是设备的id。

例如以下所看到的power为8。replica为3。3个设备且在三个zone中,经过reassign_parts后得到的replica2part2dev,0,1,2即为设备的ID。

[ [2, 2, 0, 0, 2, 0, 0, 2, 1, 0, 0, 0, 2, 0, 1, 2, 2, 0, 1, 0, 0, 0, 1, 2, 1, 1, 1, 2, 0, 2, 2, 0, 1, 0, 2, 1, 1, 0, 2, 0, 2, 1, 0, 1, 1, 0, 1, 1, 0, 2, 0, 1, 1, 1, 2, 2, 0, 2, 1, 1, 2, 2, 2, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, 1, 1, 1, 2, 0, 0, 0, 1, 0, 2, 0, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 0, 2, 1, 2, 0, 1, 1, 2, 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, 0, 2, 1, 0, 2, 0, 2, 2, 0, 1, 0, 2, 0, 1, 1, 1, 0, 2, 2, 1, 1, 0, 0, 1, 1, 0, 1, 2, 0, 0, 0, 0, 0, 1, 2, 2, 2, 0, 2, 2, 2, 0, 0, 1, 0, 0, 0, 0, 2, 2, 2, 2, 0, 1, 0, 1, 2, 2, 1, 1, 1, 1, 0, 2, 2, 1, 0, 1, 0, 2, 2, 1, 2, 1, 2, 0, 2, 2, 0, 2, 0, 1, 0, 1, 2, 1, 1, 2, 2, 1, 0, 2, 1, 2, 2, 0, 0, 0, 1, 2, 2, 0, 0, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 0, 1, 1, 0, 1, 2, 2, 2, 0, 2, 2, 0, 1, 2, 1, 2, 0, 0, 2, 0, 0, 1, 1, 0, 2, 2, 2, 0, 1],
 [1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 1, 2, 1, 1, 0, 1, 1, 2, 0, 2, 1, 2, 0, 1, 2, 0, 0, 0, 1, 0, 1, 1, 2, 2, 1, 0, 2, 2, 0, 2, 1, 2, 1, 0, 0, 1, 2, 2, 2, 0, 2, 2, 0, 0, 1, 0, 2, 1, 2, 2, 1, 1, 0, 0, 0, 2, 1, 0, 2, 2, 2, 1, 1, 1, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 1, 1, 0, 1, 2, 0, 2, 1, 1, 1, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 0, 1, 1, 0, 1, 0, 2, 0, 0, 2, 2, 1, 0, 0, 2, 1, 1, 2, 0, 2, 0, 1, 2, 2, 1, 2, 1, 0, 1, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 0, 0, 1, 2, 0, 1, 2, 1, 1, 2, 0, 2, 0, 1, 1, 1, 2, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 1, 1, 0, 2, 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 1, 2, 1, 2, 0, 0, 0, 2, 0, 1, 2, 2, 2, 2, 0, 1, 0, 0, 2, 1, 1, 1, 2, 1, 0, 0, 2, 1, 0, 2, 2, 0, 2, 2, 1, 1, 1, 1, 2],
[0, 0, 2, 2, 0, 2, 2, 1, 0, 1, 2, 1, 0, 2, 2, 0, 0, 1, 2, 1, 2, 1, 2, 0, 0, 2, 2, 1, 2, 1, 0, 2, 0, 1, 0, 2, 0, 1, 1, 1, 0, 0, 2, 2, 2, 2, 0, 0, 1, 1, 1, 0, 2, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0, 2, 1, 0, 0, 1, 0, 2, 2, 2, 2, 0, 1, 1, 1, 1, 2, 1, 1, 1, 0, 2, 2, 2, 1, 0, 0, 0, 1, 2, 1, 2, 0, 2, 0, 1, 2, 0, 0, 0, 2, 1, 2, 1, 1, 2, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 2, 2, 2, 1, 1, 2, 2, 0, 1, 0, 1, 2, 0, 2, 2, 0, 2, 1, 2, 0, 1, 1, 2, 1, 2, 2, 0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 2, 2, 1, 1, 0, 1, 1, 0, 1, 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 1, 2, 0, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 0, 2, 2, 2, 0, 1, 0, 1, 0, 0, 1, 2, 0, 1, 1, 1, 0, 0, 2, 0, 0, 2, 1, 1, 2, 1, 1, 1, 2, 0, 1, 0, 0, 0, 2, 0]]

在得到replica2part2dev后,当对象须要存放时,首先 依据对象的名字account/container/object。计算出其相应的hash值。取hash值的前4个字节(32位)。将其右移32-power位。得到值即为partion的值,从partion中取出replica个相应设备的id,依据设备的id得到设备的其它属性返回,设备的其它属性中包括了设备的ip地址。port等信息,通过http请求,和三个设备建立链接,由于三个设备中执行了object-server,他们接收这些请求,将数据存入到设备中。 如图所看到的环的执行机制

图6 环的执行机制

參考资料:

1、http://www.ibm.com/developerworks/cn/cloud/library/1310_zhanghua_openstackswift/

2、http://blog.csdn.net/sparkliang/article/details/5279393?reload

OpenStack_Swift源代码分析——Ring基本原理及一致性Hash算法相关推荐

  1. 什么是一致性Hash算法?

    原文链接:https://blog.csdn.net/bntX2jSQfEHy7/article/details/7954936 最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因 ...

  2. 什么是一致性Hash算法? 1

    最近有小伙伴跑过来问什么是Hash一致性算法,说面试的时候被问到了,因为不了解,所以就没有回答上,问我有没有相应的学习资料推荐,当时上班,没时间回复,晚上回去了就忘了这件事,今天突然看到这个,加班为大 ...

  3. 一致性 Hash 算法原理总结

    一致性 Hash 算法是解决分布式缓存等问题的一种算法,本文介绍了一致性 Hash 算法的原理,并给出了一种实现和实际运用的案例: 一致性 Hash 算法背景 考虑这么一种场景: 我们有三台缓存服务器 ...

  4. 一致性 Hash 算法学习(分布式或均衡算法)

    简介: 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的 ...

  5. Hash魔法:一致性 hash 算法

    consistent hashing 一致性 hash 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用 ...

  6. 分布式算法(一致性Hash算法)

    转载:https://www.cnblogs.com/moonandstar08/p/5405991.html 一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法( ...

  7. 一致性 hash 算法

    一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and rando ...

  8. 一致性 hash 算法(consistent hashing)

    一致性 hash 算法(consistent hashing) consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random tre ...

  9. 一致性 Hash 算法的实际应用

    前言 记得一年前分享过一篇<一致性 Hash 算法分析>,当时只是分析了这个算法的实现原理.解决了什么问题等. 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的 ...

最新文章

  1. 怎么修改网页服务器数据库连接,如何修改网页服务器数据库连接
  2. 教会你Linux Shell自动交互的三种方法
  3. eval函数 php_PHP的一句话木马代码和函数eval的简介
  4. React - S1
  5. 2d游戏中关于碰撞以及渲染层级关系
  6. oracle优先顺序取值,oracle取值函数
  7. 数据存储与容灾(第2版)主编 鲁先志 武春岭综合训练答案
  8. 【MDT】iPhone XS 系列屏幕素质报告
  9. java word 分段符,Word2013文档中插入分隔符(分节符)的方法
  10. Hive性能调优实战 总结一
  11. Vue项目首页---开发周末游组件
  12. 【获奖案例巡展】信创先锋之星——云上贵州信创工程中心大数据中台
  13. android列表倒计时,RecyclerView实现列表倒计时
  14. python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)
  15. The alias ‘TaskType‘ is already mapped to the value ‘com.xxx.entity.Tasktype‘.
  16. PL0功能扩充(浮点数,数组,数组加减乘除等)
  17. STW(Stop The World)
  18. 盛大陈天桥:最好的商业模式要深谙“人性”
  19. 宜人贷 PaaS 数据服务平台Genie 简介(一)
  20. Oracle-分析函数之sum(...) over(...)

热门文章

  1. IIS和tomcat共用80端口
  2. 天坑-安装salt-api安装的正确姿势
  3. SGU 274 Spam-filter
  4. spring this.logger.isDebugEnabled()
  5. 三层交换的测试1:级联的傻HUB
  6. VS2008 调试Web网站,出现找不到Microsoft Internet Explorer的解决方法
  7. Lcs客户端配置和测试
  8. 《『若水新闻』客户端开发教程》——07.升级新闻内容UI
  9. 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量...
  10. JavaScript中this指针指向的彻底理解