Foundry
안정 해시 설계
중급
핵심

해시 링과 이동량

서버 수를 규칙에서 빼면 된다

앞 단계에서 나머지 연산이 무너진 이유는 하나였습니다. 나누는 수가 규칙의 일부라서 서버 수가 바뀌면 모든 계산 결과가 함께 바뀌는 것입니다.

그러면 규칙에서 서버 수를 빼면 됩니다.

키와 서버를 같은 공간에 놓는다

해시 링에서 새 서버가 들어오면 바로 앞 구간만 새 서버로 넘어간다 서버 1 새 서버 서버 2 서버 3 서버 4 담당을 정하는 규칙 키를 서버와 같은 공간에 놓는다 키에서 시계 방향 첫 서버가 담당 서버가 늘면 링의 한 지점에 들어간다 그 앞 구간만 넘어간다 다른 경계는 건드리지 않는다 100대에서 101대면 약 1퍼센트 나머지 연산은 99퍼센트였다

해시 값의 범위를 끝과 시작이 이어진 하나의 원으로 봅니다. 키도 서버도 같은 해시 함수로 그 원 위의 한 점이 됩니다. 그리고 규칙은 이렇습니다.

키의 담당 = 그 키에서 시계 방향으로 처음 만나는 서버

이 규칙에 서버 수가 들어 있지 않습니다. 서버가 몇 대든 계산 방법이 같습니다.

서버가 늘 때 이동량

새 서버는 원 위의 한 점으로 들어옵니다. 그 지점 때문에 경계가 하나 생기고, 바로 앞 구간의 키들만 담당이 바뀝니다. 원래 그 키들을 맡던 다음 서버에서 새 서버로 넘어갑니다.

상황담당이 바뀌는 키
나머지 연산에서 한 대 추가약 99퍼센트
링에서 한 대 추가약 1퍼센트

다른 경계는 건드리지 않는 것이 핵심입니다. 서버 100대 중 한 대를 더하면 새 서버가 가져가는 몫만 움직이므로 평균적으로 전체의 100분의 1입니다.

요구사항과 대조한다

앞에서 계산한 방식을 그대로 씁니다. 이동한 키가 1퍼센트면 그 키에 대한 조회만 미스가 되므로,

평소 미스: 조회 50만 x 5퍼센트 = 2.5만
추가 미스: 조회 50만 x 1퍼센트 = 0.5만
합계 3만. 평소의 1.2배

99퍼센트 이동일 때 20배였던 것이 1.2배가 됩니다. 적중률 95퍼센트 유지라는 요구사항 안에 들어옵니다.

서버가 빠질 때

그 서버의 점이 원에서 사라지고, 그 서버가 맡던 구간은 시계 방향 다음 서버로 합쳐집니다. 이동량은 그 서버가 갖고 있던 몫이므로 이번에도 전체의 100분의 1 수준입니다.

다만 그 몫이 한 서버에 전부 갑니다. 빠진 서버의 부하를 다음 한 대가 다 받는 것이라, 이미 바쁜 서버였다면 연달아 무너질 수 있습니다. 이 문제는 다음 단계에서 함께 해결됩니다.

무엇을 얻고 무엇을 잃었나

항목나머지 연산
담당 계산연산 두 번정렬된 목록에서 찾기
들고 있을 상태서버 수 하나서버 목록과 각자의 위치
한 대 추가 시 이동약 99퍼센트약 1퍼센트

공짜가 아닙니다. 서버 목록과 위치를 모든 클라이언트가 들고 있어야 하고, 그 목록이 서로 다르면 같은 키가 다른 서버로 갑니다. 담당 계산도 나눗셈 하나보다는 무겁습니다. 이 두 대가는 뒤에서 각각 다룹니다.

면접에서 이렇게 나옵니다

Q.해시 링으로 담당을 정하는 규칙을 설명해 주세요

해시 값의 범위를 원으로 보고, 키에서 시계 방향으로 처음 만나는 서버가 담당합니다.

키도 서버도 같은 해시 함수로 원 위의 한 점이 된다
키의 담당 = 그 키에서 시계 방향 첫 서버

이 규칙에 서버 수가 들어 있지 않은 것이 핵심입니다. 나머지 연산이 무너진 이유가 나누는 수가 규칙의 일부였기 때문이므로, 그것을 규칙에서 빼면 서버 수가 바뀌어도 다른 키의 계산이 변하지 않습니다.

흔한 실수: "해시를 원 위에 배치한다" 까지만 말하고 넘어가는 것. 왜 그것이 이동량을 줄이는지가 답의 핵심입니다. 서버 수를 규칙에서 뺐다는 한 문장이 있으면 이 설계를 이해했다는 신호가 됩니다.

Q.링에서 서버를 한 대 추가하면 얼마나 이동하나요

평균적으로 전체의 100분의 1입니다. 서버가 100대 이므로 새 서버가 가져가는 몫만 움직입니다.

새 서버는 원 위의 한 점으로 들어와 경계 하나를 만듭니다. 그 지점 바로 앞 구간의 키들만 담당이 바뀌고, 원래 그 키를 맡던 다음 서버에서 새 서버로 넘어갑니다.

방식한 대 추가 시 이동
나머지 연산약 99퍼센트
약 1퍼센트

미스로 환산하면 평소 2.5만에 0.5만이 더해져 3만입니다. 20배였던 것이 1.2배가 됩니다.

흔한 실수: 이동량을 정확히 100분의 1이라고 단정하는 것. 위치가 무작위라 구간 크기가 고르지 않으므로 운에 따라 몇 배 차이가 납니다. 평균이 100분의 1이라고 말하고, 편차 문제를 다음 이야기로 잇는 것이 정확합니다.

Q.서버가 빠질 때는 어떻게 되나요

그 서버의 점이 사라지고 맡던 구간이 시계 방향 다음 서버로 합쳐집니다.

이동량은 빠진 서버가 갖고 있던 몫이므로 이번에도 전체의 100분의 1 수준입니다. 나머지 규칙은 그대로입니다.

문제는 그 몫이 한 서버에 전부 간다는 것입니다.

빠진 서버의 부하와 데이터를 다음 한 대가 다 받는다
그 서버가 이미 바빴다면 연달아 무너질 수 있다

장애는 보통 부하가 높을 때 일어나므로, 하필 여유가 없는 순간에 한 대에 두 배가 실립니다.

흔한 실수: 이동량이 적으니 괜찮다고 답하는 것. 총량이 적은 것과 한 곳에 몰리는 것은 다른 문제입니다. 이동량은 이미 충분히 작지만 쏠림은 그대로 남아 있고, 가상 노드가 그 쏠림까지 함께 해결합니다.

Q.링 방식의 대가는 무엇인가요

들고 있어야 할 상태가 늘고, 담당 계산이 무거워집니다.

항목나머지 연산
담당 계산연산 두 번정렬된 목록에서 찾기
들고 있을 상태서버 수 하나서버 목록과 각자의 위치

특히 목록이 서로 다르면 같은 키가 다른 서버로 갑니다. 나머지 연산에서는 서버 수 하나만 맞으면 됐는데, 링에서는 목록 전체가 모든 클라이언트에서 같아야 합니다.

그래서 이 방식을 고르면 구성원 목록을 공유하는 일이 새 과제로 따라옵니다.

흔한 실수: 링을 도입하면서 목록 공유를 언급하지 않는 것. 면접에서 "모든 클라이언트가 같은 링을 보는 것은 어떻게 보장하나요" 라는 질문이 곧바로 이어집니다. 얻은 것과 함께 새로 생긴 문제를 말하는 것이 설계를 이해했다는 신호입니다.

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

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

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