Foundry
안정 해시 설계
심화
핵심

가상 노드와 고르기

한 서버를 여러 번 올린다

링은 이동량 문제를 풀었지만 두 가지를 남겼습니다. 구간 크기가 고르지 않고, 서버가 빠질 때 그 몫이 한 서버에 전부 갑니다. 두 문제가 같은 방법으로 풀립니다.

무작위 위치는 고르지 않다

서버를 링에 한 번만 올리면 담당 양이 크게 어긋나고 여러 번 올리면 고르게 된다 한 번씩만 올렸을 때 담당 비율 40 15 30 15 최대가 평균의 네 배가 된다 한 서버를 여러 번 올렸을 때 26 25 24 25 고르게 모인다 큰 수의 법칙 사양이 두 배인 서버에는 두 배로 올린다

서버 위치는 해시 값이라 무작위입니다. 무작위로 찍은 점들은 고르게 퍼지지 않습니다. 어떤 구간은 크고 어떤 구간은 작습니다. 서버 100대에서 가장 큰 구간은 평균의 네 배를 넘기 쉽습니다.

담당 양이 네 배면 그 서버의 메모리와 조회 부하도 네 배입니다. 서버 사양은 같은데 부하가 네 배라면 그 한 대가 먼저 무너집니다.

한 서버를 여러 번 올린다

서버 하나를 링에 여러 지점으로 올립니다. 이름에 번호를 붙여 다른 해시 값을 얻습니다.

서버1-0, 서버1-1, 서버1-2, ... 각각 다른 위치
어느 지점에 걸리든 담당은 서버1

구간이 잘게 쪼개져 여러 곳에 흩어지면 합계가 평균으로 모입니다. 한 서버가 큰 구간 하나에 당첨될 확률은 그대로지만, 작은 구간 150개의 합은 평균에서 크게 벗어나기 어렵습니다.

서버당 지점 수담당 양의 편차
1개크다. 최대가 평균의 네 배
150개작다. 몇 퍼센트 안

사양 차이를 여기서 쓴다

요구사항에 서버 사양이 최대 2배 차이라고 적혀 있습니다. 지점 수를 다르게 주면 담당 양이 그 비율로 달라집니다.

평범한 서버: 150개 지점
메모리가 두 배인 서버: 300개 지점

균등하게 나누는 것이 오히려 불균형이 되는 경우입니다. 사양이 두 배인 서버에 같은 양을 주면 그 서버의 메모리가 절반 남고, 작은 서버는 꽉 찹니다.

빠질 때의 쏠림도 함께 풀린다

지점이 흩어져 있으므로 한 서버가 빠지면 그 지점들의 뒤를 여러 서버가 나눠 받습니다.

지점 수서버 한 대가 빠지면
1개다음 한 대가 전부 받는다
150개여러 대가 조금씩 나눠 받는다

앞 단계에서 남겨 둔 연쇄 실패 위험이 이것으로 줄어듭니다. 하나의 장치가 두 문제를 푸는 것이 이 설계의 좋은 점입니다.

대가는 링의 크기다

지점 수를 늘리면 링의 항목이 늘어납니다.

서버 100대 x 150개 = 링 항목 15,000개

메모리는 크지 않지만 담당을 찾는 비용이 항목 수에 따라 늘어납니다. 정렬해 두고 반씩 좁혀 찾으면 15,000개에서 14단계면 되므로 0.1ms 예산 안입니다. 다음 단계에서 이 찾기를 다룹니다.

지점 수는 편차와 비용의 균형점입니다. 무조건 크게 잡으면 링 갱신과 탐색이 무거워지고, 작게 잡으면 편차가 남습니다.

면접에서 이렇게 나옵니다

Q.가상 노드가 필요한 이유가 무엇인가요

무작위로 찍은 점은 고르게 퍼지지 않기 때문입니다.

서버 위치는 해시 값이라 무작위입니다. 서버 100대에서 가장 큰 구간은 평균의 네 배를 넘기 쉽고, 담당 양이 네 배면 그 서버의 메모리와 부하도 네 배입니다.

서버 하나를 링에 여러 지점으로 올리면 구간이 잘게 쪼개져 흩어지고, 작은 구간 여러 개의 합은 평균으로 모입니다.

서버당 지점 수담당 양의 편차
1개최대가 평균의 네 배
150개몇 퍼센트 안

흔한 실수: 해시 함수를 더 좋은 것으로 바꾸면 고르게 된다고 답하는 것. 좋은 해시는 값을 고르게 흩뿌리지만 100개의 무작위 점 사이 간격이 고르다는 뜻은 아닙니다. 편차는 해시 품질 문제가 아니라 점의 개수 문제입니다.

Q.서버 사양이 2배 차이 나면 어떻게 다루나요

지점 수를 그 비율로 다르게 줍니다.

평범한 서버: 150개 지점
메모리가 두 배인 서버: 300개 지점

담당 양이 지점 수에 비례하므로 두 배 지점을 가진 서버가 두 배를 맡습니다. 별도의 가중치 장치를 만들 필요가 없습니다.

균등하게 나누는 것이 오히려 불균형이 되는 경우입니다. 사양이 두 배인 서버에 같은 양을 주면 그 서버의 메모리가 절반 남고 작은 서버는 꽉 찹니다.

흔한 실수: 사양 차이를 무시하고 균등 분배를 목표로 삼는 것. 요구사항에 사양 차이가 적혀 있으면 그것을 반영하라는 뜻입니다. 균등은 목적이 아니고, 목적은 어느 서버도 먼저 꽉 차지 않게 만드는 것입니다.

Q.가상 노드가 장애 상황에도 도움이 되나요

네. 빠진 서버의 몫이 한 곳에 몰리지 않게 됩니다.

지점 수서버 한 대가 빠지면
1개다음 한 대가 전부 받는다
150개여러 대가 조금씩 나눠 받는다

지점 하나만 있으면 시계 방향 다음 서버가 그 몫을 다 받습니다. 장애는 보통 부하가 높을 때 일어나므로 하필 여유가 없는 순간에 한 대에 두 배가 실리고, 그 서버도 무너질 수 있습니다.

지점이 흩어져 있으면 그 뒤를 여러 서버가 나눠 받으므로 연쇄 실패 위험이 줄어듭니다.

흔한 실수: 가상 노드를 분포 균등화 장치로만 설명하는 것. 장애 시 부하 분산이 실무에서는 더 중요할 때가 많습니다. 한 장치가 두 문제를 푼다는 것을 말하면 이해도가 드러납니다.

Q.지점 수를 얼마로 정하시겠습니까

편차와 비용의 균형점으로 정합니다. 서버당 100에서 200 사이가 흔한 선택입니다.

서버 100대 x 150개 = 링 항목 15,000개

지점을 늘리면 편차가 줄지만 링이 커집니다. 링이 커지면 담당을 찾는 비용과 구성 변경을 모두에게 알리는 비용이 함께 늡니다.

정렬해 두고 반씩 좁혀 찾으면 15,000개에서 14단계라 0.1ms 예산 안입니다. 그래서 이 규모에서는 150이 안전한 값입니다.

흔한 실수: 지점 수를 무조건 크게 잡는 것. 편차만 보면 클수록 좋아 보이지만 링 자체가 모든 클라이언트가 들고 다니는 상태입니다. 구성이 주당 3~4번 바뀌므로 그 크기가 갱신 비용에 그대로 곱해집니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

안정 해시 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.