안정 해시는 제품이 아니라 기법입니다. 그래서 어떤 상황에서 그 기법이 필요한지부터 고정합니다. 이 토픽은 아래 하나의 요구사항을 끝까지 풉니다.
| 항목 | 값 |
|---|---|
| 대상 | 분산 캐시 클러스터 |
| 캐시 서버 | 100대 |
| 키 | 10억 개 |
| 조회 | 초당 50만 |
| 구성 변경 | 주당 3~4번 (증설, 교체, 장애) |
| 적중률 | 95퍼센트 이상 유지 |
| 서버 사양 | 최대 2배 차이 |
| 조회 편중 | 일부 키가 수백 배 자주 읽힌다 |
| 담당 서버 계산 | 0.1ms 이내 |
기능 요구사항과 범위 밖
| 구분 | 내용 |
|---|---|
| 이번에 만든다 | 키의 담당 서버 정하기, 서버가 늘거나 빠질 때 담당 다시 정하기, 사양이 다른 서버에 담당 양 다르게 주기, 모든 클라이언트가 같은 담당 표 보기 |
| 범위 밖 | 캐시 값의 만료 정책, 캐시와 원본의 정합성, 장애 감지 자체, 여러 지역 배치 |
장애 감지를 범위 밖으로 둔 것이 중요합니다. "어느 서버가 죽었다" 는 주어진 입력으로 보고, 그 뒤에 담당을 어떻게 다시 정할지만 다룹니다. 감지까지 끌어오면 이야기가 흩어집니다.
왜 이동량이 첫 제약인가
캐시는 담당이 바뀌면 그 키를 새 서버에서 찾게 되고, 새 서버에는 값이 없습니다. 그러면 원본으로 갑니다.
평소: 조회 50만 x 미스 5퍼센트 = 원본 요청 2.5만
담당이 전부 바뀐 직후: 원본 요청 50만
20배입니다. 원본이 그 부하를 못 받으면 캐시를 채울 수도 없어서 회복이 더 늦어집니다. 그래서 이 설계에서 가장 먼저 재는 것은 처리량이 아니라 서버 한 대가 늘거나 빠질 때 담당이 바뀌는 키의 비율입니다.
구성 변경은 사건이 아니라 상시 조건이다
주당 3~4번 이라는 숫자가 이것을 말합니다. 서버 100대 규모에서 증설과 교체와 장애를 합치면 구성 변경은 늘 일어나는 일입니다.
한 번의 이사라면 새벽에 조용히 옮기고 끝낼 수 있습니다. 매주 일어나는 일이라면 이동 비용을 구조로 낮춰야 합니다. 운영 절차로 감당할 수 있는 종류가 아닙니다.
담당 계산은 요청 경로에 있다
조회 초당 50만 이므로 담당 서버를 찾는 계산이 초당 50만 번 실행됩니다. 예산 0.1ms 는 여기에 붙습니다.
| 방식 | 요청당 비용 |
|---|---|
| 계산으로 정한다 | 연산 몇 번 |
| 어딘가에 물어본다 | 왕복 한 번. 예산을 넘긴다 |
그래서 담당은 물어보지 않고 계산으로 알아야 합니다. 이 제약이 뒤의 설계를 크게 좁힙니다.
캐시라서 다른 점
캐시는 값을 잃어도 됩니다. 담당이 바뀐 키의 값을 새 서버로 옮기지 않고 버려도 됩니다. 다시 채우면 되니까요.
| 성격 | 담당이 바뀌면 |
|---|---|
| 캐시 | 버리고 다시 채운다. 미스가 늘 뿐이다 |
| 영구 저장소 | 실제로 옮겨야 한다. 옮기는 동안 두 곳을 봐야 한다 |
같은 기법을 쓰지만 대가의 종류가 다릅니다. 이 요구사항은 캐시이므로 이동량이 곧 미스로 환산되고, 저장소라면 이동량이 곧 이관 작업량이 됩니다.