meloncha / study

0 stars 0 forks source link

[대규모 시스템 설계 기초] 5장 안정 해시 설계 #5

Open meloncha opened 2 years ago

meloncha commented 2 years ago

해시 키 재배치(rehash) 문제

안정 해시

해시 공간과 해시 링

해시 서버

해시 키

서버 조회

서버 추가

서버 제거

기본 구현법의 두 가지 문제

안정 해시 알고리즘

문제점

가상 노드

-> 시스템 요구사항에 맞추는 의미? best practice는 무엇일까?

재배치할 키 결정

안정 해시의 이점

meloncha commented 2 years ago

고민 Point

안정 해시가 최고의 해답일까?

https://dgryski.medium.com/consistent-hashing-algorithmic-tradeoffs-ef6b8e2fcae8

https://itnext.io/introducing-consistent-hashing-9a289769052e

Rendezvous Hashing

type RendezVous struct {
    nodes []Node
}

type Node struct {
    id string
}

func (r *RendezVous) Get(key string) (*Node, error) {
    length := uint32(len(r.nodes))
    var maxHashValue = hash(key, r.nodes[0].id, length)
    result := 0

    for index, node := range r.nodes[1:] {
        currentHashValue := hash(key, node.id, length)
        if currentHashValue > maxHashValue {
            maxHashValue = currentHashValue
            result = index
        }
    }
    return &r.nodes[result], nil
}

Jump Consistent Hashing

int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) { 
  int64_t b = ­1, j = 0;
  while (j < num_buckets) { 
    b=j;
    key = key * 2862933555777941757ULL + 1; // Did you say magic number?
    j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1));
  }
  return b;
}

image

장점