2019独角兽企业重金招聘Python工程师标准>>>

总结一下,理解算法时的几个问题,搞懂这些基本上就算理解Swift rebalnce的算法了。

Swift如何保证文件的随机存储和保持系统中的平衡性?

例如有4台dev(编号 0,1,  2,  3)2的18次幂262144虚节点,我们都知道builder和ring中存储了一个数据结构_replica2part2dev,它表明了partition到replica到dev的映射关系,即某个文件的某个副本存储到哪个dev上,如下图

系统要做的是根据策略来生成随机的分布,让一个文件的三个副本可以存储到3个不同的dev上去。

builder文件到底存的什么?

其实builder文件里存储了一个字典型的数据结构,其中包含了整个系统所有的重要的数据。

                'part_power': self.part_power,'replicas': self.replicas,'min_part_hours': self.min_part_hours,'parts': self.parts,'devs': self.devs,'devs_changed': self.devs_changed,'version': self.version,'_replica2part2dev': self._replica2part2dev,'_last_part_moves_epoch': self._last_part_moves_epoch,'_last_part_moves': self._last_part_moves,'_last_part_gather_start': self._last_part_gather_start,'_remove_devs': self._remove_devs

ring文件里到底存了什么?

ring文件只存储记录part分布的数据

def serialize_v1(self, file_obj):# Write out new-style serialization magic and version:file_obj.write(struct.pack('!4sH', 'R1NG', 1))ring = self.to_dict()json_text = json.dumps({'devs': ring['devs'], 'part_shift': ring['part_shift'],'replica_count': len(ring['replica2part2dev_id'])})json_len = len(json_text)file_obj.write(struct.pack('!I', json_len))file_obj.write(json_text)for part2dev_id in ring['replica2part2dev_id']:file_obj.write(part2dev_id.tostring())

文件对应的part如何生成

一个上传文件的请求,proxy会来决定哪个node(dev)来存储这个文件和它的副本。然后向选好的dev发送请求。

例如 admin账户,向test容器中,上传一个名字为update.c的文件。会根据/admin/test/update.c + 设置的HASH_PATH_SUFFIX 生成一个md5 的值 然后解析成一个数字 例如35564 这个就是part,然后在_replica2part2dev 中查找它的三个replica所在的dev  ,然后向这三个dev发送请求。

def get_nodes(self, account, container=None, obj=None):key = hash_path(account, container, obj, raw_digest=True)#md5(/account/contianer/obj + HASH_PATH_SUFFIX).digest()if time() > self._rtime:self._reload()part = struct.unpack_from('>I', key)[0] >> self._part_shiftseen_ids = set()return part, [self._devs[r[part]] for r in self._replica2part2dev_idif not (r[part] in seen_ids or seen_ids.add(r[part]))]

sort_key

dev对应的sort_key影响它分配的方式,系统生成一个字符串,它分成三段,进行排序,第一段为dev_want,第二段随机数,第三段dev_id,系统根据这个三段排序,然后查找最想want的dev

def _sort_key_for(self, dev):# The maximum value of self.parts is 2^32, which is 9 hex# digits wide (0x100000000). Using a width of 16 here gives us# plenty of breathing room; you'd need more than 2^28 replicas# to overflow it.# Since the sort key is a string and therefore an ascii sort applies,# the maximum_parts_wanted + parts_wanted is used so negative# parts_wanted end up sorted above positive parts_wanted.return '%016x.%04x.%04x' % ((self.parts * self.replicas) + dev['parts_wanted'],randint(0, 0xffff),dev['id'])

parts_wanted = (sum_part/sum_weight )*dev_weith-dev_pars

系统设置的part减去已经分配的part 生成想要得到的part

转载于:https://my.oschina.net/zhouxingxing/blog/83749

Swift中的一致性哈希算法(补充)相关推荐

  1. redis实现轮询算法_白话分布式系统中的一致性哈希算法

    本文首发于:白话分布式系统中的一致性哈希算法 微信公众号:后端技术指南针 持续输出干货 欢迎关注! 通过本文将了解到以下内容:分布式系统的概念和作用 分布式系统常用负责均衡策略 普通哈希取模策略优缺点 ...

  2. 一文搞懂负载均衡中的一致性哈希算法

    一致性哈希算法在很多领域有应用,例如分布式缓存领域的 MemCache,Redis,负载均衡领域的 Nginx,各类 RPC 框架.不同领域场景不同,需要顾及的因素也有所差异,本文主要讨论在负载均衡中 ...

  3. java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性

    实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...

  4. bootstracp实现树形列表_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性...

    实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...

  5. 哈希分布与一致性哈希算法—在swift中看到这个有意思的算法

    在研究swift的基本原理时,看到了这个算法,不怎么明白,找了几个帖子来学习.感谢@博客园一条辉的博客(liunx.cnblogs.com) @sparkliang 前言 在我们的日常web应用开发当 ...

  6. 一致性哈希算法及其在分布式系统中的应用

    摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个 ...

  7. 一致性哈希算法在分布式缓存中的应用

    一.应用场景 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Redis作为缓存机制.现在我们一共有三台机器可以作为Redis服务器,如 ...

  8. 分布式系统中一致性哈希算法

    1业务场景 近年来B2C.O2O等商业概念的提出和移动端的发展,使得分布式系统流行了起来.分布式系统相对于单系统,解决了流量大.系统高可用和高容错等问题.功能强大也意味着实现起来需要更多技术的支持.例 ...

  9. 算法高级(24)-一致性哈希算法在分布式系统中的使用场景

    本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用. 一.一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人 ...

最新文章

  1. 【C++】 18_对象的构造 (中)
  2. hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
  3. 利用iptables来配置linux禁止所有端口登陆和开放指定端口
  4. HTML marquee标签详解
  5. OpenYurt入门-在树莓派上玩转OpenYurt
  6. JS map和set
  7. Android应用程序结构解析
  8. 视觉SLAM笔记(23) 图像
  9. python随机数据库_关于Python的随机数模块,你必须要掌握!-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...
  10. 十一、JUC包中的锁
  11. 【转】Element-UI中上传的action地址相对问题
  12. ASP.NET WEB API简介
  13. [C#] 控制系统音量-第一章
  14. 如何使用ARCHART XGantt表示无工作日的日历
  15. SaaS的优势和劣势
  16. 两向量点乘坐标运算_向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读...
  17. Apache ShenYu源码阅读系列-基于WebSocket的数据同步
  18. 未能联接game center服务器,win10系统GameCenter无法连接服务器的处理步骤
  19. 【重磅推荐】哥大开源“FinRL”: 一个用于量化金融自动交易的深度强化学习库
  20. 三星root后进入android system recovery后,三星手机在用刷机大师刷机之后,Android system recoverylt;3egt;,找......

热门文章

  1. java-运算符以及简单运用
  2. Nignx平滑升级(1.8.0-1.8.1)
  3. MySQL字符串函数
  4. 03-C语言的注释与转义字符
  5. NSIS 打包 win7 中无法删除快捷方式
  6. arduino定时器函数如何使用_【Arduino101教程】定时器的使用
  7. 如何删除VS2015中的OpenCV的配置
  8. 获取request header的值
  9. BZOJ4563[Haoi2016]放棋子
  10. 预备作业02 20162320刘先润