• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

深入云存储系统Swift核心组件:Ring实现原理剖析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

 

 

简介

OpenStack是一个美国国家航空航天局和Rackspace合作研发的开源云计算项目,并成为Apache下的一个重要开源项目,目前已经发展到了180家公司参与其中。

OpenStack Object StorageSwiftOpenStack开源云计算项目的子项目之一。Swift的目的是使用普通硬件来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。OpenStack Object Storage 最初由 Rackspace 采用Python语言开发,并于 2010 7 月贡献给 OpenStack ,作为该开源项目的一部分。它的目的是用于托管 Rackspace Cloud Files service ,原始项目代号是 swift,所以沿用至今。

在分布式对象存储中的一个关键问题是数据该如何存放。RingSwift中最重要的组件,用于记录存储对象与物理位置间映射关系。在涉及查询accountcontainerobject信息时就需要查询集群的ring信息。

 

先来看一下Swift文档中关于Ring的描述:

       Ring用来确定数据驻留在集群中的位置。有单独对应于Account数据库、container数据库和单个objectring

       Ring中每个partition在集群中都(默认)3replica。每个partition的位置由ring来维护,并存储在映射中。

       Ring使用zone的概念来保证数据的隔离。每个partitionreplica都确保放在了不同的zone中。一个zone可以是一个硬盘,一个服务器,一个机架,一个交换机,甚至是一个数据中心............

.......

 

在上述Ring的特性描述中提到了Ring使用zonedevicepartitionreplica等等来维护数据和磁盘间的映射信息。那么在Ring的背后采用什么算法,使用了什么机制来保证数据的安全、高效和可扩展呢?这些概念对于数据存储带来了什么好处?本文逐步深入探讨了Swift如何通过Ring组件来实现冗余的、可扩展的目的。

 

 

1.      普通Hash算法与场景分析

 

 

先来看一个简单的例子假设我们手里有N台存储服务器(以下简称node),打算用于图片文件存储,为了使服务器的负载均衡,需要把对象均匀地映射到每台服务器上,通常会使用哈希算法来实现,计算步骤如下:

 

1.计算objecthashKey

2.计算Key mod N

      

N个存储节点,将KeyN得到的余数就是该Key对应的值需要存放的节点。比如,N2,那么值为01234Key需要分别存放在01010号节点上。如果哈希算法是均匀的,数据就会被平均分配到两个节点中。如果每个数据的访问量比较平均,负载也会被平均分配到两个节点上。

但是,当数据量和访问量进一步增加,两个节点无法满足需求的时候,需要增加一个节点来服务客户端的请求。这时,N变成了3,映射关系变成了Key mod (N+1),因此,上述哈希值为234的数据需要重新分配(2->server 23 -> server 04 -> server 1)。如果数据量很大的话,那么数据量的迁移工作将会非常大。当N已经很大,从N加入一个节点变成N+1个节点的过程,会导致整个哈希环的重新分配,这个过程几乎是无法容忍的,几乎全部的数据都要重新移动一遍。

       我们举例说明,假设有100node的集群,将107项数据使用md5 hash算法分配到每个node中,Python代码如下:

from hashlib import md5
from struct import unpack_from

NODE_COUNT =
100

DATA_ID_COUNT =
10000000

node_counts = [
0] * NODE_COUNT
for
data_id in xrange(DATA_ID_COUNT):
    data_id = str(data_id)
   
# This just pulls part of the hash out as an integer

    hsh = unpack_from(
'>I', md5(data_id).digest())[0]
    node_id = hsh % NODE_COUNT
    node_counts[node_id] +=
1

desired_count = DATA_ID_COUNT / NODE_COUNT
print '%d: Desired data ids per node' % desired_count
max_count = max(node_counts)
over =
100.0
* (max_count - desired_count) / desired_count
print '%d: Most data ids on one node, %.02f%% over'
% \
    (max_count, over)
min_count = min(node_counts)
under =
100.0
* (desired_count - min_count) / desired_count
print '%d: Least data ids on one node, %.02f%% under'
% \
    (min_count, under)


100000
: Desired data ids per node
100695: Most data ids on one node, 0.69
% over
99073: Least data ids on one node, 0.93
% under

      

分布结果如下所示:

    

名称

数据项数量


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Swift语法发布时间:2022-07-14
下一篇:
[Swift]LeetCode149.直线上最多的点数|MaxPointsonaLine发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap