您的位置 首页 golang

Golang 一致性hash consistent库应用

日常开发中涉及到一致性hash的使用很多, 一致性哈希 是为了解决在分布式系统中,数据存取时选择哪一个具体节点的问题。

比如,系统中有五个节点,大量用户信息分别存在不同的节点上,具体到某一个用户,其信息应该确定的存在一个节点上,不能两次请求,分别去不同的节点上取数据。

一致性hash算法应该满足以下几个方面:

平衡性(Balance)

平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

单调性(Monotonicity)

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。简单的哈希算法往往不能满足单调性的要求,如最简单的线性哈希:x = (ax+b)mod(P),在上式中,P表示全部缓冲的大小。不难看出,当缓冲大小发生变化时(从P1到P2),原来所有的哈希结果均会发生变化,从而不满足单调性的要求。哈希结果的变化意味着当缓冲空间发生变化时,所有的映射关系需要在系统内全部更新。而在 P2P 系统内,缓冲的变化等价于Peer加入或退出系统,这一情况在P2P系统中会频繁发生,因此会带来极大计算和传输负荷。单调性就是要求哈希算法能够应对这种情况。

分散性( Spread )

在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

负载(Load)

负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

平滑性(Smoothness)

平滑性是指 缓存服务器 的数目平滑改变和缓存对象的平滑改变是一致的。

下面介绍consistent库的使用

package main

import (

“fmt”

“stathat.com/c/ cons istent”

)

func main() {

cons := consistent.New()

cons.Add(“cacheA”)

cons.Add(“cacheB”)

cons.Add(“cacheC”)

server1, err := cons.Get(“user_1”)

server2, err := cons.Get(“user_2”)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(“server1:”, server1) //输出 server1: cacheC

fmt.Println(“server2:”, server2) //输出 server2: cacheA

fmt.Println()

//user_1在cacheA上,把cacheA删掉后看下效果

cons.Remove(“cacheA”)

server1, err = cons.Get(“user_1”)

server2, err = cons.Get(“user_2”)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(“server1:”, server1) //输出 server1: cacheC,和删除之前一样,在同一个server上

fmt.Println(“server2:”, server2) //输出 server2: cacheB,换到另一个server了

}

输出结果:

server1: cacheC

server2: cacheA

server1: cacheC

server2: cacheB

可以看到删除chcheA以后,user_2对应的server由cacheA换到cacheB了,而server1没有改变。

更多内容请关注每日编程,每天进步一点。

文章来源:智云一二三科技

文章标题:Golang 一致性hash consistent库应用

文章地址:https://www.zhihuclub.com/97910.shtml

关于作者: 智云科技

热门文章

网站地图