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

怎甘沉沦 提交于 2020-02-15 06:55:53

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

还有三种哈希算法的应用:负载均衡、数据分片、分布式存储

应用五:负载均衡

负载均衡的算法有很多,比如轮询、随机、加权轮询等,如何实现一个会话粘滞的负载均衡算法呢?即在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上

方法是:维护一张映射关系表,表中内容是客户端IP地址或者会话ID与服务器编号的映射关系,客户端发出的每次请求都需要先在映射表中查找应该路由到的服务器编号,再请求编号对应的服务器

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

应用六:数据分片

1.统计“搜索关键词”出现的次数

假如有1T日志文件,记录了用户的搜索关键词,需要快速统计出每个关键词被搜索的次数,怎么做?

两个难点:一是搜索日志很大,没有办法放到一台机器内存中去,二是如果只用一台机器处理的话花费时间很长

先对数据进行分片,然后采用多台机器处理的方法,来提高速度,思路是:用n台机器并行处理,从搜索记录的日志文件中依次读出每个搜索关键词,并通过哈希函数计算哈希值,再跟n取模,最终得到的值就是应该被分配到的机器编号,这样哈希值相同的搜索关键词就被分配到同一机器上,也就是同一个搜索关键词被分配到同一个机器上,每个机器会分别计算关键词出现的次数,最后合并就是最终的结果

2.快速判断图片是否在图库中

用唯一标识的话需要构建散列表,但是若有一亿张图片,显然在单台机器上构建散列表是行不通的,内存有限,一亿张图片构建散列表远远超过了单台机器的内存上限

准备N台机器让每台机器只维护某一部分图片对应的散列表,每次从图库中读取一个图片,计算唯一标识,然后与机器个数n取模,得到的值就是对应要分配的机器编号,然后将这个图片的唯一标识和路径发往对应的机器构建散列表

判断是否在图库中的时候,通过相同的哈希算法,计算唯一标识,与机器个数n求余取模,估算一亿张图片构建散列表大约需要多少台机器?散列表中每个数据单元包含两个信息,哈希值和路径,如果通过MD5来计算哈希值,长度就是128比特,就是16字节,路径上限是256字节,平均长度128字节,如果用链表法解决冲突,还需要指针,8字节,所以每个数据单元需要152字节,一台机器内存如果为2GB,装载因子是0.75,一台机器可以给大约1000W图片构建散列表,如果对一亿张图片构建索引,需要十几台机器

应用七:分布式存储

互联网面对的是海量的数据,海量的用户,为了提高数据的读取和写入能力,采用分布式方式存储数据,比如分布式缓存,因为海量的数据需要缓存,所以将数据分布在多台机器上

如何将哪个数据放到哪个机器上?通过哈希算法对数据取哈希值,对机器个数取模,这个最终值就是应该存储的缓存机器编号

如果数据增多,10台机器无法承受了,这时候所有的数据都需要重新计算哈希值了,然后重新搬移到正确的机器上,缓存中的数据一下子都失效了,这时候就需要一种方法,使得新加入一个机器后,不需要做大量的数据搬移,一致性哈希算法就登场了

我们有K个机器,数据的哈希值范围是[0,MAX],将范围划分成M个小区间(m远大于K),每个机器负责m/k个小区间,当有新机器加入的时候,将某几个小区间的数据从原来的机器中搬移到新的机器中,这样,既不用全部重新哈希、搬移数据,也保持了各个机器上数据数量的均衡

一致性哈希算法:https://www.jianshu.com/p/570dc8913c20

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!