哈希算法下——哈希算法在分布式系统中有哪些应用?

1. 应用五:负载均衡

负载均衡算法有很多,比如论询、随机、加权轮询等。那如何才能实现一个会话粘滞(session sticky)的负载均衡算法呢?也就是说,我们需要在同一个客户端上,把在一次会话中的所有请求都路由到同一个服务器上。

最直接的方法就是,维护一张映射关系表,这张表的内容是客户端 IP 地址或者会话 ID 与服务器编号的映射关系。客户端每次发出请求时,就从映射表中查找到对应的服务器编号,然后再请求该编号的服务器。这种方法简单直观,但也有几个弊端:

  • 客户端很多的话映射表就会很大,比较浪费内存;
  • 客户端上线下线,服务器扩容缩容都会导致映射失效,维护成本高。

如果借助哈希算法,我们可以对客户端 IP 地址或者会话 ID 计算哈希值,将得到的哈希值与服务器列表的大小进行取模运算,得到的值就是应该被路由到的服务器。这样,我们就把同一个 IP 过来的所有请求,都路由到同一个后端服务器上。

2. 应用六:数据分片

2.1. 如何统计 “搜索关键词” 出现的次数?

如果我们要处理 1T 的日志文件,来统计用户的搜索关键词特性。显然,一台机器不仅内存不够,而且处理速度也会很慢。因此,我们可以先对数据进行分片,然后采用多台数据处理的方法,来提高处理速度

我们对读出的每个搜索关键词用哈希函数来计算哈希值,然后再和机器总数 N 取模,最终得到的值,就是该关键词应该被分配到的机器编号。这样,同一个关键词就会被分配到同一个机器上,每个机器会分别统计关键词出现的次数,最后再把结果合并起来。

2.2. 如何快速判断图片是否在图库中?

哈希算法上 中,我们介绍了如何应用哈希算法构建散列表来判断图片是否在图库中。但如果图片数量非常多的话,我们就无法在一台机器上建立散列表。

这时候,我们就可以仿照上面的思路,将数据进行分片,然后采用多机处理。我们对图库中的每张图片计算唯一标识,再和机器总数 N 取模,得到的值就是应该被分配到的机器编号,然后我们把唯一标识和图片路径发往对应的机器构建散列表。

当我们要判断一张图片是否在图库中的时候,我们通过同样的哈希算法,计算这个图片的唯一标识,再和机器总数 N 取模,然后就到对应的机器中去查找。

3. 应用七:分布式存储

现在互联网面对的都是海量的数据、海量的用户,为了提高对数据的读取、写入能力,一般都采用分布式的方式来存储数据,比如分布式缓存,我们需要将数据分布在多台机器上。

该如何决定某个数据该放到哪台机器上呢?我们可以借用前面数据分片的思想,即通过哈希算法对数据取哈希值,然后对机器个数取模,然后作为该数据应该存储的缓存机器编号。

但是,如果数据增多,原来的 10 个机器已经无法承受了,我们就需要进行扩容,比如扩充到 11 台机器。这时候,麻烦就来了,原来的数据是通过 10 来取模的,现在需要按照 11 来取模,同样的数据就会被分配到不同的机器上去了。

因此,所有的数据都需要重新计算哈希值,然后搬移到正确的机器上。这样就相当于缓存中的数据一下子就都失效了。所有的数据都会穿透缓存,直接去请求数据库。这样就可能发生雪崩效应,压跨数据库。因此,我们需要一种方法,使得在新加入一个机器后,并不需要做大量的数据搬移。

一致性哈希算法。假设我们有 K 个机器,数据的哈希值的范围为 [0, MAX]。我们将整个范围划分为 m 个小区间(m 远大于 K),每个机器负责 m/K 个小区间。当有新机器加入的时候,我们就将某几个小区间的数据搬移到新机器上去。这样,既不用全部重新计算哈希值,搬移数据,也保持了各个机器上数据数量的均衡。

参考资料-极客时间专栏《数据结构与算法之美》

获取更多精彩,请关注「seniusen」!

原文地址:https://www.cnblogs.com/seniusen/p/9936812.html

时间: 2024-11-04 21:51:45

哈希算法下——哈希算法在分布式系统中有哪些应用?的相关文章

查找算法系列之复杂算法:哈希查找

眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/details/46635325 http://blog.csdn.net/u010025211/article/details/46635183 今天这篇博文将介绍哈希查找. 1.为什么要用哈希查找 之前所讲的查找方法都是须要比較待查找元素与线性表或者树中的元素才干实现. 这种时间复杂度为O(n)或者O(log n),那么有没有可能当给

python数据结构与算法 29-1 哈希查找

前面的章节中,我们利用数据集中元素的相对位置信息来提高查找算法的性能. 比方知道列表是有序的,能够使用二分查找.本节我们走得更远一些,创建一个数据结构,使得查找性能提高到O(1).称为哈希查找. 要做到这种性能,我们要知道元素的可能位置.假设每一个元素就在他应该在的位置上,那么要查找的时候仅仅须要一次比較得到有没有的答案,但以下将会看到.不是这么回事. 哈希表是这样一种数据集合,元素的保存的时候就存在easy找到位置上.哈希表表中每个位置,一般称为槽位,每个槽位都能保存一个数据元素并以一个整数命

算法 --- 一致性哈希算法

简介 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性hash时采用如下

《Java数据结构和算法》- 哈希表

Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计算机内存都可以满足. 为了尽可能地存取每个员工的记录,使用工号从1(公司创业者)到1000(最近雇佣的工人).将工号作为关键字(事实上,用其他作为关键字完全没有必要).即使员工离职不在公司,他们的记录也是要保存在数据库中以供参考,在这种情况下需要使用什么数据结构呢? A: 一种可能使用数组,每个员工

算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀分布,哈希函数的离散性,打乱输入规律 public class Code_01_HashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.p

散列算法和哈希表结构

散列算法和哈希表结构 算法概述 Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 哈希表 数组的特点是:寻址容易,插入和删除困难:

数据结构与算法—一致性哈希

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. Hash算法 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法

数据结构与算法实例(哈希表实现)

数据结构与算法(哈希表) 哈希函数:在记录的关键字与记录的存储地址之间建立的一 种对应关系叫哈希函数. 哈希函数是一种映象,是从关键字空间到存储地址空间的一 种映象.可写成:addressi=H(keyi) ,其中i是表中某 个元素. 哈希表:应用哈希函数,由记录的关键字确定记录在表中的 地址,并将记录放入此地址,这样构成的表叫哈希 ★哈希表的特点就是数据与其在表中的位置存在相关性,也就是有关系的,通过数据应该可以计算其位置,哈希表最大的特点是是可以快速实现查找,插入和删除.因为它独有的特点,H

Java数据结构和算法之哈希表

五.哈希表 一般的线性表.树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较.这一类查找方法建立在"比较"的基础上,查找的效率与比较次数密切相关.理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应.因而查找时,只需根据这个对应关系f找到给定值K的像f(K).若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需