가상 노드는 담당 키 개수를 고르게 만듭니다. 그런데 부하는 키 개수가 아니라 조회 횟수로 옵니다.
개수는 고른데 부하는 쏠린다
인기 상품 하나, 대문 배너, 공통 설정 같은 키는 다른 키보다 수백 배 자주 읽힙니다. 그 키 하나가 전체 조회의 10퍼센트를 차지하면 담당 서버 한 대가 초당 5만을 받습니다.
가상 노드를 늘려도 해결되지 않습니다. 한 키는 쪼개지지 않으므로 지점이 몇 개든 그 키는 한 지점에 걸리고 한 서버가 맡습니다.
값싼 순서로 본다
| 방법 | 하는 일 | 대가 |
|---|---|---|
| 클라이언트 로컬 캐시 | 뜨거운 키를 각자 짧게 들고 있는다 | 잠깐 낡은 값을 볼 수 있다 |
| 키를 여러 개로 나누기 | 같은 값을 다른 이름 몇 개로 흩는다 | 갱신할 곳이 그만큼 늘어난다 |
| 전용 서버로 빼기 | 그 키만 다른 곳에서 처리 | 예외 목록을 사람이 관리한다 |
로컬 캐시가 가장 값쌉니다. 뜨거운 키는 정의상 자주 읽히므로 아주 짧은 시간만 들고 있어도 대부분의 조회가 로컬에서 끝납니다. 1초만 들고 있어도 초당 5만 조회가 초당 몇 번의 원격 조회로 줄어듭니다.
대가는 그 1초 동안 낡은 값을 볼 수 있다는 것입니다. 얼마나 오래된 값까지 괜찮은지가 이 선택의 기준입니다.
키를 나누는 방법
값이 자주 바뀌어 로컬 캐시가 어려우면 이름을 나눕니다.
인기상품:123 대신
인기상품:123#0 부터 인기상품:123#9 까지 열 개
읽을 때 무작위로 하나를 고른다
열 개가 서로 다른 위치에 흩어지므로 부하가 여러 서버로 나뉩니다. 대가는 값을 바꿀 때 열 곳을 모두 고쳐야 하는 것이고, 고치는 중에는 사용자마다 다른 값을 볼 수 있습니다.
쏠림을 어떻게 아나
서버별 조회 수만 보면 어느 서버가 뜨거운지는 알지만 어느 키 때문인지는 모릅니다.
| 지표 | 알 수 있는 것 |
|---|---|
| 서버별 조회 수 | 쏠림이 있는지 |
| 키별 조회 수 상위 목록 | 어느 키 때문인지 |
키별 집계를 모든 조회에 붙이면 그 집계가 새로운 부하가 됩니다. 표본만 남기거나 뜨거운 후보만 세는 방식으로 가볍게 유지합니다.
값 크기 쏠림은 다른 문제다
조회가 고르더라도 어떤 키의 값이 다른 키보다 훨씬 크면 메모리가 한쪽으로 기웁니다. 담당 키 개수도 고르고 조회도 고른데 메모리만 꽉 차는 상태입니다.
이때는 값 크기에 상한을 두는 편이 낫습니다. 큰 값 하나가 작은 값 수천 개를 밀어내면 적중률 전체가 내려갑니다.