深入云存储系统Swift核心组件Ring数据结构及构建、重平衡操作.docxVIP

深入云存储系统Swift核心组件Ring数据结构及构建、重平衡操作.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入云存储系统Swift核心组件Ring数据结构及构建、重平衡操作

深入云存储系统Swift核心组件:Ring数据结构及构建、重平衡操作  在上一篇深入云存储系统Swift核心组件:Ring实现原理剖析中,我们分析了Ring的设计原理,深入探讨了Swift如何通过Ring组件来实现冗余的、可扩展的目的。本文旨在分析在实际swift的运行中,如何来构建Ring文件。Ring数据结构  Ring?的数据结构由三个顶层域构成,其中:List of Devices,表示集群中设备的列表;Partition Assignment List,表示partition到device的指派;Partition Shift Value,表示计算数据hash的移位量。1.List of Devices  设备列表在Ring类内部被称为devs。在设备列表中的每一项是带有以下键的字典:                       ? ? ? ? ? ? ? ? ? ?表1:Devs键值说明idinteger在device列表中的索引zoneinteger设备所在的zoneweightfloatdevice与其他device的相对权重。这常常直接与device和其它device的磁盘空间数量的比有关ipstringdevice的服务器IP地址portint服务器进程所使用的TCP端口用来提供该设备的服务请求devicestring?服务器上device的磁盘名称。例如:sdb1metastring存储设备额外信息的通用字段。该信息并不直接被服务器进程使用,但是在调试时会派上用场。例如,安装的日期和时间和硬件生产商可以存储在这。?2.Partition Assignment List  用于存放每个replica与device间映射关系。在Ring类内部被称为_replica2part2dev_id,列表中含有replica数量(3)的array(‘I’),array(‘I’)的长度等于ring的partition数量,在array(‘I’)中的每个值为List of Devices中的索引id。3.Partition Shift Value  Partition Shift Value在Ring类内部称为_part_shift。该值用于转换一个MD5?hash值来计算对于该哈希值的数据所在的partition。使用hash值的前4个字节用于计算。例如,为了计算路径/account/container/object的虚节点,Python代码如下:partition = unpack_from(I,md5(/account/container/object).digest())[0] self._part_shift?  其中表示big-endian?byte order,I表示长度为4 byte?unsigned int?  举例:我们以SAIO安装下的ring文件为例,使用python读取/etc/swift/object.ring.gz存放的数据,获得的是以devs、?part_shift、?replica2part2dev_id?为key的dict类数据,其中:?devs=[{device: sdb1,? id: 0,? ip: 127.0.0.1,? meta: ,? port: 6010,? weight: 1.0,? zone: 1},{device: sdb2,? id: 1,? ip: 127.0.0.1,? meta: ,? port: 6020,? weight: 1.0,? zone: 2},{device: sdb3,? id: 2,? ip: 127.0.0.1,? meta: ,? port: 6030,? weight: 1.0,? zone: 3},{device: sdb4,? id: 3,? ip: 127.0.0.1,? meta: ,? port: 6040,? weight: 1.0,? zone: 4}]?part_shift=4replica2part2dev_id=[array(‘I’,?[3, 2...]) array(‘I’,?[0,?1...]), array(‘I’,?[1,?3...])]?构建Ring文件?  假设我们配置了一个4个node组成的集群,分别为node0、node1、node2、node3,在这个集群中,我们为4个存储节点配置了2^18个partition,平均每个存储节点分配65536个partition。  需要使用swift-ring-bulider命令来构建ring文件,关于swift-ring-builder命令的详细用法,在shell下直接敲该命令即可获得提示。这里只涉及构建新Ring文件的方法,需要用到两个相关选项:构建相关的bui

文档评论(0)

junjun37473 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档