Foundry
안정 해시 설계
고급
핵심

모두가 같은 링을 보게 하기

링이 다르면 같은 키가 다른 서버로 간다

앞 단계에서 클라이언트가 직접 계산하기로 정했습니다. 그러면 링을 모든 클라이언트가 들고 있어야 하고, 그 링이 서로 같아야 합니다.

링이 다르면 무슨 일이 생기나

클라이언트가 서로 다른 링을 보면 같은 키가 다른 서버로 간다 같은 키를 찾는 두 클라이언트 클라이언트 가 링 세대 7 클라이언트 나 링 세대 8 서버 12 로 간다 서버 43 으로 간다 여기에 값이 있다 여기는 비어 있다 캐시는 미스로 끝난다. 값이 두 곳에 생길 뿐이다 저장소라면 같은 키의 최신 값이 어디인지 알 수 없다 세대 번호를 함께 보내면 어긋남을 알아챌 수 있다

같은 키를 두 클라이언트가 찾는데 링이 다르면 서로 다른 서버로 갑니다.

성격결과
캐시미스가 늘고 같은 값이 두 곳에 생긴다. 견딜 수 있다
영구 저장소같은 키의 최신 값이 어디인지 알 수 없다. 견딜 수 없다

이 요구사항이 캐시라서 전파 지연을 견딜 수 있습니다. 잠깐 어긋나면 미스가 조금 늘 뿐입니다. 저장소였다면 어긋난 동안 쓰기를 막거나 두 곳을 모두 확인해야 합니다.

목록을 어떻게 나눠 주나

방법성질
한 곳에 두고 각자 지켜보기단순하고 순서가 분명하다. 그곳이 죽으면 갱신이 멈춘다
서로 알려 주며 퍼뜨리기중앙이 없다. 퍼지는 데 시간이 걸리고 상태가 잠시 갈린다

서버 100대 규모에서는 한 곳에 두는 편이 낫습니다. 목록이 작고 변경이 주당 3~4번 정도라 중앙 저장소 하나로 충분합니다. 그곳이 잠깐 죽어도 각자 마지막 목록으로 계속 동작하므로 조회는 멈추지 않습니다.

세대 번호를 붙인다

목록에 번호를 하나 붙여 올라갈 때마다 키웁니다. 요청에 그 번호를 실어 보내면 서버가 자기가 아는 번호와 다른 것을 알아챌 수 있습니다.

클라이언트가 세대 7 로 요청한다
서버는 세대 8 을 알고 있다
그 클라이언트가 낡은 링을 보고 있다고 알 수 있다

이 신호가 있으면 어긋남을 지표로 볼 수 있고, 오래 낡은 클라이언트를 찾아낼 수 있습니다. 번호가 없으면 어긋남은 미스 증가로만 나타나서 원인을 짚기 어렵습니다.

죽었다는 판단은 한 곳에서 한다

여러 곳이 각자 판단하면 링이 흔들립니다. 어떤 클라이언트는 그 서버를 뺀 링을, 어떤 클라이언트는 넣은 링을 보게 됩니다.

그리고 넣었다 뺐다를 반복하는 것이 가장 나쁩니다. 그 서버가 담당하는 구간의 키가 매번 이동하므로 미스가 계속 발생합니다. 그래서 판단에 여유를 둡니다.

장치이유
여러 번 연속 실패해야 뺀다순간적인 실패로 링을 흔들지 않는다
뺀 뒤 일정 시간은 다시 넣지 않는다넣었다 뺐다 반복을 막는다
한 번에 뺄 수 있는 대수를 제한한다판단이 잘못돼 여럿을 뺄 때를 막는다

새 서버는 조금씩 넣는다

새 서버를 지점 150개로 한 번에 넣으면 그 몫의 키가 즉시 미스가 됩니다. 지점 수를 조금씩 늘리면 미스가 시간에 걸쳐 흩어집니다.

처음에 15개 지점으로 넣는다
값이 채워지는 것을 보며 150개까지 올린다

원본 부하가 한 번에 튀는 것을 막는 방법이고, 캐시 클러스터에서 실제로 쓰입니다. 적중률 95퍼센트 유지가 요구사항이라면 이 절차가 설계의 일부입니다.

면접에서 이렇게 나옵니다

Q.모든 클라이언트가 같은 링을 보게 어떻게 보장하나요

목록을 한 곳에 두고 각자 지켜보게 하고, 세대 번호를 붙입니다.

서버 100대 규모에서는 목록이 작고 변경이 주당 3~4번 정도라 중앙 저장소 하나로 충분합니다. 그곳이 잠깐 죽어도 각자 마지막 목록으로 계속 동작하므로 조회는 멈추지 않습니다.

목록이 바뀔 때마다 세대 번호를 키운다
요청에 세대 번호를 실어 보낸다
서버가 자기가 아는 번호와 다른 것을 알아챈다

번호가 없으면 어긋남이 미스 증가로만 나타나 원인을 짚기 어렵습니다.

흔한 실수: 완전히 같은 링을 항상 보장하겠다고 답하는 것. 전파에는 시간이 걸리므로 어긋나는 순간은 반드시 있습니다. 그 순간에 무엇이 잘못되는지 말하고, 캐시라서 견딜 수 있다는 근거를 대는 편이 정확합니다.

Q.링이 어긋난 동안 무엇이 잘못되나요

같은 키가 다른 서버로 갑니다. 결과는 무엇을 담고 있느냐에 따라 다릅니다.

성격결과
캐시미스가 늘고 같은 값이 두 곳에 생긴다
영구 저장소같은 키의 최신 값이 어디인지 알 수 없다

캐시에서는 견딜 수 있습니다. 잠깐 미스가 늘고 값이 중복되는 것이 전부이며, 어긋남이 끝나면 낡은 쪽은 만료로 사라집니다.

저장소라면 쓰기가 두 곳에 나뉘어 어느 쪽이 최신인지 판단할 근거가 없어집니다. 그때는 어긋난 동안 쓰기를 막거나 두 곳을 모두 확인해야 합니다.

흔한 실수: 캐시와 저장소를 같은 무게로 말하는 것. 잃어도 되는지가 전파 지연을 견딜 수 있는지를 정합니다. 같은 기법을 쓰더라도 이 판단이 다릅니다.

Q.서버가 죽었다는 판단을 어떻게 다루시겠습니까

한 곳에서 판단하고, 여유를 둡니다.

여러 곳이 각자 판단하면 클라이언트마다 다른 링을 보게 됩니다. 그리고 넣었다 뺐다를 반복하는 것이 가장 나쁩니다. 그 서버 구간의 키가 매번 이동하므로 미스가 계속 발생합니다.

장치이유
여러 번 연속 실패해야 뺀다순간적인 실패로 링을 흔들지 않는다
뺀 뒤 일정 시간은 다시 넣지 않는다반복을 막는다
한 번에 뺄 수 있는 대수를 제한한다판단이 잘못될 때를 막는다

흔한 실수: 감지를 빠르게 만드는 데만 집중하는 것. 빠른 감지는 잘못된 감지를 늘리고, 잘못된 제거는 미스 폭풍을 만듭니다. 캐시에서는 조금 늦게 빼는 것이 잘못 빼는 것보다 낫습니다.

Q.새 서버를 투입할 때 적중률 95퍼센트 를 어떻게 지키나요

지점 수를 조금씩 늘리며 넣습니다.

지점 150개로 한 번에 넣으면 그 몫의 키가 즉시 미스가 되고, 그 미스가 한꺼번에 원본으로 갑니다.

처음에 15개 지점으로 넣는다
값이 채워지는 것을 보며 150개까지 올린다

미스가 시간에 걸쳐 흩어지므로 원본 부하가 한 번에 튀지 않습니다. 이동량 자체는 같지만 같은 양을 어떤 속도로 겪는지가 달라집니다.

흔한 실수: 새 서버를 미리 채워 두고 넣겠다고 답하는 것. 무엇을 채울지는 그 서버의 담당이 정해진 뒤에야 알 수 있고, 담당은 링에 넣는 순간 정해집니다. 순서가 거꾸로입니다. 지점 수를 조금씩 늘리는 방법이 같은 효과를 순서대로 냅니다.

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

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

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