Foundry
안정 해시 설계
고급
핵심

사본을 둘지 정하기

캐시에서는 사본이 손해일 수 있다

마지막으로 남은 질문입니다. 같은 값을 여러 서버에 두어야 할까요. 저장소라면 당연히 그렇습니다. 캐시에서는 답이 다릅니다.

사본은 용량을 먹는다

사본을 두 벌 두면 같은 메모리에 담을 수 있는 서로 다른 키가 절반이 된다 클러스터 전체 메모리는 그대로다 사본 한 벌 키 100 사본 두 벌 키 50 서로 다른 키 같은 값의 사본 장애 때는 사본이 미스를 막아 준다 평소에는 담는 키가 줄어 미스가 늘어난다 평소를 위해 쓰는 캐시라면 사본은 손해일 수 있다

클러스터 전체 메모리는 정해져 있습니다. 사본을 두 벌 두면 같은 메모리에 담을 수 있는 서로 다른 키가 절반이 됩니다. 담는 키가 줄면 평소 적중률이 내려갑니다.

상황사본 한 벌사본 두 벌
평소담는 키가 많다. 적중률이 높다담는 키가 절반. 적중률이 낮다
장애그 서버 몫이 미스가 된다사본이 받아 미스가 없다

평소를 위해 쓰는 캐시라면 사본은 손해일 수 있습니다. 캐시는 항상 켜져 있고 장애는 드물게 옵니다. 드문 순간을 위해 늘 절반을 쓰는 셈입니다.

이 요구사항에서는 두지 않는다

앞 단계에서 계산한 값을 그대로 씁니다. 링과 가상 노드를 쓰면 서버 한 대가 빠질 때 이동하는 키가 약 1퍼센트이고, 미스는 평소의 1.2배입니다.

사본 없이 한 대가 빠질 때: 미스가 2.5만에서 3만으로
적중률 95퍼센트 유지 요구사항 안에 들어온다

요구사항이 이미 충족되므로 사본을 두지 않습니다. 대신 미스가 몰릴 때 원본을 보호하는 장치에 그 여력을 씁니다. 같은 키에 대한 동시 미스를 하나로 합쳐 원본에 한 번만 묻는 방식이 대표적입니다.

사본을 둔다면 어디에 두나

캐시가 아니라 저장소이거나, 장애 시 미스도 허용되지 않는 경우라면 사본을 둡니다. 링에서는 시계 방향으로 다음 지점들에 둡니다.

여기에 함정이 하나 있습니다. 가상 노드를 쓰면 다음 지점이 같은 물리 서버일 수 있습니다.

다음 지점을 그대로 사본 위치로 쓰면
같은 서버에 원본과 사본이 함께 놓인다
그 서버가 죽으면 둘 다 사라진다

그래서 사본 위치를 고를 때 이미 고른 물리 서버는 건너뜁니다. 지점이 아니라 서버 단위로 세어야 합니다. 이 실수는 평소에 아무 증상이 없고 장애가 났을 때만 드러납니다.

무엇을 안 하기로 했는지 말한다

이 아키타입의 답은 대부분 덜 하는 쪽이었습니다.

후보결정
담당을 중앙에 물어보기하지 않는다. 예산이 왕복을 허용하지 않는다
나머지 연산하지 않는다. 구성 변경이 잦다
사본 두기하지 않는다. 요구사항이 이미 충족된다
뜨거운 키 전용 서버하지 않는다. 로컬 캐시로 충분하다

요구사항이 이미 충족되면 더 하지 않는 것이 설계입니다. 하지 않기로 한 것과 그 근거를 말할 수 있으면, 같은 문제를 다른 제약에서 다시 풀 수도 있습니다.

면접에서 이렇게 나옵니다

Q.캐시에 사본을 두시겠습니까

이 요구사항에서는 두지 않습니다. 사본은 용량을 먹고, 요구사항은 이미 충족됩니다.

클러스터 전체 메모리가 정해져 있으므로 사본 두 벌은 담을 수 있는 서로 다른 키를 절반으로 만듭니다. 담는 키가 줄면 평소 적중률이 내려갑니다.

사본 없이 한 대가 빠질 때: 미스가 2.5만에서 3만으로
적중률 95퍼센트 유지 요구사항 안에 들어온다

캐시는 항상 켜져 있고 장애는 드물게 옵니다. 드문 순간을 위해 늘 절반을 쓰는 것이 사본의 실제 비용입니다.

흔한 실수: 가용성이 좋아진다는 이유로 사본을 기본으로 두는 것. 캐시에서는 사본이 평소 적중률을 낮춰 오히려 원본 부하를 늘릴 수 있습니다. 무엇을 위해 있는 계층인지가 판단을 정합니다.

Q.사본을 둔다면 링에서 어디에 두시겠습니까

시계 방향 다음 지점들에 두되, 이미 고른 물리 서버는 건너뜁니다.

가상 노드를 쓰면 한 서버가 링에 여러 지점을 갖습니다. 그래서 다음 지점이 같은 물리 서버일 수 있습니다.

다음 지점을 그대로 사본 위치로 쓰면
같은 서버에 원본과 사본이 함께 놓인다
그 서버가 죽으면 둘 다 사라진다

사본 위치는 지점 단위가 아니라 서버 단위로 세어야 합니다.

흔한 실수: 이 건너뛰기를 빼먹는 것. 평소에는 아무 증상이 없고 장애가 났을 때만 드러납니다. 사본을 두는 이유가 장애 대비인데 정작 장애에서 동작하지 않는 상태가 됩니다.

Q.사본 없이 장애 시 미스 폭증을 어떻게 막나요

같은 키에 대한 동시 미스를 하나로 합쳐 원본에 한 번만 묻습니다.

한 서버가 빠지면 그 몫의 키가 동시에 미스가 됩니다. 같은 키를 여러 요청이 동시에 찾으면 그 수만큼 원본 요청이 나갑니다.

같은 키의 첫 요청만 원본에 간다
나머지는 그 결과를 기다린다
채워지면 함께 응답한다

미스 자체는 줄지 않지만 원본으로 나가는 요청 수가 줄어듭니다. 사본 없이도 원본을 지키는 값싼 방법입니다.

흔한 실수: 미스를 줄이는 것과 원본 요청을 줄이는 것을 같은 문제로 보는 것. 이동량을 이미 1퍼센트로 낮췄다면 남은 위험은 그 1퍼센트가 동시에 몰리는 것이고, 그것은 합치기로 다뤄야 합니다.

Q.이 설계에서 하지 않기로 한 것들을 말해 주세요

요구사항이 이미 충족되면 더 하지 않는 것이 이 설계의 결론입니다.

후보결정과 근거
담당을 중앙에 물어보기하지 않는다. 예산 0.1ms 가 왕복을 허용하지 않는다
나머지 연산하지 않는다. 구성 변경이 주당 3~4번 이라 이동량이 상시 비용이다
사본 두기하지 않는다. 이동량 1퍼센트면 요구사항 안에 들어온다
뜨거운 키 전용 서버하지 않는다. 로컬 캐시로 충분하다

각 결정에 숫자로 된 근거가 붙어 있는 것이 중요합니다. 근거가 있으면 제약이 달라질 때 결정을 다시 계산할 수 있습니다.

흔한 실수: 알고 있는 기법을 모두 넣어 설계를 무겁게 만드는 것. 면접에서 감점되는 지점이기도 합니다. 무엇을 안 했고 왜 안 했는지를 말하는 것이 기법을 아는 것보다 어렵고, 그래서 더 잘 드러납니다.

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

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

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