Foundry
안정 해시 설계
기초
핵심

요구사항 정리와 재배치 비용

이동량이 첫 제약이 되는 이유

안정 해시는 제품이 아니라 기법입니다. 그래서 어떤 상황에서 그 기법이 필요한지부터 고정합니다. 이 토픽은 아래 하나의 요구사항을 끝까지 풉니다.

항목
대상분산 캐시 클러스터
캐시 서버100대
10억 개
조회초당 50만
구성 변경주당 3~4번 (증설, 교체, 장애)
적중률95퍼센트 이상 유지
서버 사양최대 2배 차이
조회 편중일부 키가 수백 배 자주 읽힌다
담당 서버 계산0.1ms 이내

기능 요구사항과 범위 밖

구분내용
이번에 만든다키의 담당 서버 정하기, 서버가 늘거나 빠질 때 담당 다시 정하기, 사양이 다른 서버에 담당 양 다르게 주기, 모든 클라이언트가 같은 담당 표 보기
범위 밖캐시 값의 만료 정책, 캐시와 원본의 정합성, 장애 감지 자체, 여러 지역 배치

장애 감지를 범위 밖으로 둔 것이 중요합니다. "어느 서버가 죽었다" 는 주어진 입력으로 보고, 그 뒤에 담당을 어떻게 다시 정할지만 다룹니다. 감지까지 끌어오면 이야기가 흩어집니다.

왜 이동량이 첫 제약인가

적중률이 떨어지면 원본으로 가는 요청이 몇 배로 늘어난다 조회는 늘 초당 50만이다. 원본으로 가는 것만 달라진다 적중률 95퍼센트 2.5만 적중률 50퍼센트 25만 담당이 전부 바뀐 직후 50만 캐시가 비면 원본이 조회를 그대로 받는다. 20배다 원본이 그 부하를 못 받으면 캐시를 채울 수도 없다 그래서 재배치량이 이 설계의 첫 제약이다

캐시는 담당이 바뀌면 그 키를 새 서버에서 찾게 되고, 새 서버에는 값이 없습니다. 그러면 원본으로 갑니다.

평소: 조회 50만 x 미스 5퍼센트 = 원본 요청 2.5만
담당이 전부 바뀐 직후: 원본 요청 50만

20배입니다. 원본이 그 부하를 못 받으면 캐시를 채울 수도 없어서 회복이 더 늦어집니다. 그래서 이 설계에서 가장 먼저 재는 것은 처리량이 아니라 서버 한 대가 늘거나 빠질 때 담당이 바뀌는 키의 비율입니다.

구성 변경은 사건이 아니라 상시 조건이다

주당 3~4번 이라는 숫자가 이것을 말합니다. 서버 100대 규모에서 증설과 교체와 장애를 합치면 구성 변경은 늘 일어나는 일입니다.

한 번의 이사라면 새벽에 조용히 옮기고 끝낼 수 있습니다. 매주 일어나는 일이라면 이동 비용을 구조로 낮춰야 합니다. 운영 절차로 감당할 수 있는 종류가 아닙니다.

담당 계산은 요청 경로에 있다

조회 초당 50만 이므로 담당 서버를 찾는 계산이 초당 50만 번 실행됩니다. 예산 0.1ms 는 여기에 붙습니다.

방식요청당 비용
계산으로 정한다연산 몇 번
어딘가에 물어본다왕복 한 번. 예산을 넘긴다

그래서 담당은 물어보지 않고 계산으로 알아야 합니다. 이 제약이 뒤의 설계를 크게 좁힙니다.

캐시라서 다른 점

캐시는 값을 잃어도 됩니다. 담당이 바뀐 키의 값을 새 서버로 옮기지 않고 버려도 됩니다. 다시 채우면 되니까요.

성격담당이 바뀌면
캐시버리고 다시 채운다. 미스가 늘 뿐이다
영구 저장소실제로 옮겨야 한다. 옮기는 동안 두 곳을 봐야 한다

같은 기법을 쓰지만 대가의 종류가 다릅니다. 이 요구사항은 캐시이므로 이동량이 곧 미스로 환산되고, 저장소라면 이동량이 곧 이관 작업량이 됩니다.

면접에서 이렇게 나옵니다

Q.분산 캐시에서 담당 서버를 정하는 요구사항을 어떻게 정리하시겠습니까

이동량을 첫 제약으로 세웁니다. 처리량이 아닙니다.

구분내용
기능키의 담당 정하기, 구성 변경 시 다시 정하기, 사양 차이 반영, 같은 담당 표 공유
범위 밖만료 정책, 원본과의 정합성, 장애 감지 자체
비기능서버 100대, 키 10억 개, 조회 초당 50만, 구성 변경 주당 3~4번, 적중률 95퍼센트

그다음 각 숫자가 무엇을 강제하는지 말합니다. 구성 변경 주당 3~4번 은 이동 비용을 구조로 낮추게 만들고, 조회 초당 50만 은 담당을 물어보지 않고 계산하게 만듭니다.

흔한 실수: 장애 감지까지 범위에 넣는 것. 감지는 별개의 문제이고 그것을 끌어오면 담당을 정하는 이야기가 흩어집니다. "어느 서버가 빠졌다는 사실은 주어진 것으로 본다" 고 먼저 잘라야 합니다.

Q.담당이 바뀌는 것이 왜 비싼가요

바뀐 키는 새 서버에서 미스가 되고, 그 미스가 그대로 원본 부하가 됩니다.

평소: 조회 50만 x 미스 5퍼센트 = 원본 요청 2.5만
담당이 전부 바뀐 직후: 원본 요청 50만

20배입니다. 그리고 원본이 그 부하를 받지 못하면 캐시를 채우는 것도 실패하므로 회복이 더 늦어집니다. 캐시 계층이 있는 시스템에서 가장 위험한 순간이 이것입니다.

그래서 이 설계에서 먼저 재는 값은 처리량이 아니라 서버 하나가 늘거나 빠질 때 담당이 바뀌는 키의 비율입니다.

흔한 실수: 캐시니까 미스가 좀 늘어도 괜찮다고 답하는 것. 미스는 조금 늘지 않고 한꺼번에 늡니다. 평소 부하로 맞춰 둔 원본이 20배를 받는 순간이 생기는 것이 문제입니다.

Q.담당 서버를 조회 서비스에 물어보면 안 되나요

예산을 넘깁니다. 담당 계산은 조회마다 실행되므로 초당 50만 번입니다.

방식요청당 비용
계산으로 정한다연산 몇 번
어딘가에 물어본다왕복 한 번

왕복은 같은 구역에서도 0.2에서 1밀리초입니다. 예산 0.1ms 를 한 번에 넘기고, 그 조회 서비스가 새로운 병목이자 새로운 장애 지점이 됩니다.

그래서 담당은 물어보지 않고 계산으로 알아야 합니다. 필요한 것은 서버 목록뿐이고, 그것은 자주 바뀌지 않으므로 각자 들고 있을 수 있습니다.

흔한 실수: 매핑 표를 중앙에 두고 캐시해서 쓰겠다고 답하는 것. 키가 10억 개 이므로 표를 키 단위로 만들면 그 표 자체가 또 하나의 대규모 저장소가 됩니다. 키마다의 답을 저장하는 것과 계산하는 것은 규모가 다릅니다.

Q.캐시가 아니라 영구 저장소라면 무엇이 달라지나요

이동량의 대가가 달라집니다. 기법은 같습니다.

성격담당이 바뀌면
캐시버리고 다시 채운다. 미스가 늘 뿐이다
영구 저장소실제로 옮겨야 한다. 옮기는 동안 두 곳을 봐야 한다

캐시는 값을 잃어도 되므로 담당만 바꾸면 끝입니다. 저장소는 데이터를 옮겨야 하고, 옮기는 중에는 새 담당과 옛 담당을 모두 확인해야 하며, 옮기다 실패하면 어디까지 옮겼는지 알아야 합니다.

그래서 저장소에서는 이동량이 이관 작업량으로 환산됩니다.

흔한 실수: 캐시와 저장소를 같은 무게로 다루는 것. 캐시에서는 "그냥 버린다" 가 정답인데 저장소에서 그렇게 하면 데이터가 사라집니다. 무엇을 잃어도 되는지가 설계를 가릅니다.

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

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

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