美文网首页
Go一致性哈希库consistent

Go一致性哈希库consistent

作者: ahubaoan | 来源:发表于2018-07-11 10:52 被阅读0次

    本文转自http://www.baiyuxiong.com/?p=1189

    stathat.com/c/consistent是一个一致性哈希库。
    一致性哈希是为了解决在分布式系统中,数据存取时选择哪一个具体节点的问题。
    比如,系统中有五个节点,大量用户信息分别存在不同的节点上,具体到某一个用户,其信息应该确定的存在一个节点上,不能两次请求,分别去不同的节点上取数据。最简单的思路,可以拿用户ID和节点数求余数,
    比如用户ID是 1、6、11、16的在第一个节点上,2、7、12、17的在第二个节点上,依此类推。

    但是,如果系统中某一个节点坏掉了,变成4个了。如果再按4求余的话,会导致大量数据需要重新初始化。比如用户6,原来在第1个节点上,坏掉一个以后6%4=2,用户数据跑到第2个节点上去了。
    如果系统中增加了新的节点,同样也会导致这个问题。

    一致性哈希就是为了解决这个冲突的。关于其介绍,可参考:
    http://blog.csdn.net/cywosp/article/details/23397179
    http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html

    下面介绍consistent库的使用
    代码:

    package main
    
    import (
        "fmt"
        "stathat.com/c/consistent"
    )
    
    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

    一致性hash和hash的区别:

    一致性hash是hash的一种应用

    一致性哈希基本解决了在P2P环境中最为关键的问题——如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量相邻节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中。所有这一切使得一致性哈希成为第一个实用的DHT算法。
      但是一致性哈希的路由算法尚有不足之处。在查询过程中,查询消息要经过O(N)步(O(N)表示与N成正比关系,N代表系统内的节点总数)才能到达被查询的节点。不难想象,当系统规模非常大时,节点数量可能超过百万,这样的查询效率显然难以满足使用的需要。换个角度来看,即使用户能够忍受漫长的时延,查询过程中产生的大量消息也会给网络带来不必要的负荷。
      英文解释
      Consistent hashing is a scheme that provides hash table functionality in a way that the addition or removal of one slot does not significantly change the mapping of keys to slots.

    相关文章

      网友评论

          本文标题:Go一致性哈希库consistent

          本文链接:https://www.haomeiwen.com/subject/zczcpftx.html