架构师训练营 0 期第五周
发布于: 2020 年 07 月 09 日
作业
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
package mainimport ( "fmt" "hash/crc32" "math" "sort" "strconv" "sync")type Hash func(key string) uint32type Node struct { host string data map[int]int}func NewNode(h string) *Node { return &Node{ host: h, data: make(map[int]int), }}func (n *Node) Set(k int, v int) { n.data[k] = v}func (n *Node) Count() int { return len(n.data)}func (n *Node) Print() { fmt.Printf("Node:%s,Count:%d\n", n.host, n.Count())}type Map struct { hash Hash replicas int keys []int hashMap map[int]*Node Nodes []*Node sync.RWMutex}func NewMap(replicas int) *Map { return &Map{ hash: func(key string) uint32 { return crc32.ChecksumIEEE([]byte(key)) }, replicas: replicas, hashMap: make(map[int]*Node), }}func (m *Map) AddNode(h string) { m.Lock() defer m.Unlock() rNode := NewNode(h) for i := 0; i < m.replicas; i++ { node := NewNode(h + strconv.Itoa(i)) hash := int(m.hash(node.host)) m.keys = append(m.keys, hash) m.hashMap[hash] = rNode } m.Nodes = append(m.Nodes, rNode) sort.Ints(m.keys)}func (m *Map) GetNode(k string) *Node { hash := int(m.hash(k)) idx := sort.Search(len(m.keys), func(i int) bool { return m.keys[i] >= hash }) return m.hashMap[m.keys[idx%len(m.keys)]]}func main() { m := NewMap(200) for i := 1; i <= 10; i++ { m.AddNode("server-" + strconv.Itoa(i)) } for i := 1; i <= 1000000; i++ { m.GetNode(strconv.Itoa(i)).Set(i, i) } for i := range m.Nodes { m.Nodes[i].Print() } var variance float64 for i := range m.Nodes { variance += math.Pow(float64(m.Nodes[i].Count())-100000, 2) } fmt.Println("σ:", math.Sqrt(variance/float64(10)))}
Node:server-1,Count:101717Node:server-2,Count:100221Node:server-3,Count:104626Node:server-4,Count:99440Node:server-5,Count:112020Node:server-6,Count:124128Node:server-7,Count:97952Node:server-8,Count:110756Node:server-9,Count:88892Node:server-10,Count:60248σ: 16046.327299416524
总结
(待完善)
缓存
消息队列
负载均衡
分布式数据库
划线
评论
复制
发布于: 2020 年 07 月 09 日阅读数: 46
Blink
关注
还未添加个人签名 2017.02.09 加入
还未添加个人简介
评论