Foundry
키-값 저장소 설계
고급
핵심

파일 합치기와 그 대가

읽기를 위해 디스크를 두 번 쓴다

덧붙이기 구조는 파일이 계속 늘어납니다. 앞 단계에서 봤듯 파일이 많으면 읽기가 무거워지고, 같은 키의 옛 값들이 공간을 차지합니다.

그래서 파일을 주기적으로 합칩니다. 이 작업이 이 저장소 운영의 대부분을 차지합니다.

합치면 무엇이 좋아지나

파일을 합치면 읽기가 가벼워지지만 합치는 동안 디스크가 더 바쁘다 합치기 전 파일 여섯. 같은 키의 옛 값도 들어 있다 읽어서 다시 쓴다 합친 뒤 파일 둘. 옛 값이 사라져 공간도 줄었다 합치는 동안 디스크는 읽고 쓰기를 함께 한다 사용자 요청과 같은 디스크를 쓴다. 그때 지연이 튄다

여러 파일을 읽어 하나로 다시 쓰면서 같은 키의 옛 값과 삭제 표시를 정리합니다.

얻는 것설명
파일 수가 줄어든다읽을 때 물어볼 곳이 줄어든다
공간이 줄어든다옛 값이 사라진다

대가는 디스크를 두 번 쓰는 것이다

합치기는 읽어서 다시 쓰는 작업입니다. 사용자 쓰기 한 건이 결국 디스크에 여러 번 기록되는 셈입니다.

사용자가 1GB 를 쓴다
합치기가 그 데이터를 여러 단계에 걸쳐 다시 쓴다
디스크에 실제로 쓰인 양은 그보다 몇 배가 된다

그리고 합치기는 사용자 요청과 같은 디스크를 씁니다. 합치는 동안 읽기 지연이 튀고, 그것이 상위 1퍼센트 지연으로 나타납니다. 10ms 요구를 어기는 순간이 대개 이때입니다.

언제 합칠지가 곧 정책이다

합치기의 세 비용이 서로를 밀어냅니다.

목표어떻게대가
읽기를 빠르게자주 합쳐 파일을 적게 유지디스크에 쓰는 양이 늘고 지연이 자주 튄다
쓰기 비용을 낮게덜 합친다파일이 쌓여 읽기가 느려진다
공간을 적게자주 합친다같은 대가

세 개를 동시에 좋게 만들 수 없습니다. 어느 것을 포기할지 요구사항에서 골라야 하고, 이 설계는 읽기 10ms 를 요구하므로 읽기를 우선합니다.

지연 튐을 줄이는 방법

합치기를 없앨 수는 없으므로 영향을 고르게 펴는 쪽으로 갑니다.

방법효과
한 번에 합치는 양을 작게 나눈다한 번의 튐이 작아진다
합치기 속도에 상한을 둔다사용자 요청에 남기는 디스크 여력을 지킨다
여러 노드가 동시에 합치지 않게 흩는다사본 셋이 함께 느려지는 것을 막는다

마지막 항목이 특히 중요합니다. 사본 셋이 같은 시각에 합치기를 시작하면 읽기 응답 둘을 기다리는 정족수가 느린 사본을 우회할 수 없습니다. 정족수의 이득이 그 순간 사라집니다.

삭제 표시는 언제 버리나

삭제 표시를 너무 빨리 버리면 다른 사본에 남아 있던 옛 값이 되살아납니다. 그래서 모든 사본이 그 삭제를 봤다고 확신할 수 있을 만큼 오래 남겨 둡니다.

기준은 사본이 낡은 상태로 머무를 수 있는 최대 시간입니다. 그 시간을 정하지 않으면 삭제 표시를 언제 버려야 하는지 알 수 없고, 버리지 않으면 공간이 계속 늘어납니다.

면접에서 이렇게 나옵니다

Q.파일 합치기가 왜 필요한가요

파일 수와 공간을 줄이기 위해서입니다. 덧붙이기 구조는 파일이 계속 늘어납니다.

파일이 많으면 읽을 때 물어볼 곳이 많아지고, 같은 키의 옛 값들이 공간을 차지합니다.

얻는 것설명
파일 수 감소읽기가 가벼워진다
공간 감소옛 값과 삭제 표시가 정리된다

여러 파일을 읽어 하나로 다시 쓰면서 같은 키의 최신 값만 남깁니다.

흔한 실수: 합치기를 부수적인 관리 작업으로 말하는 것. 이 구조에서 합치기는 디스크 사용량의 대부분을 만드는 주 작업이고, 지연 튐의 주된 원인입니다. 설계의 일부로 다뤄야 합니다.

Q.합치기의 대가는 무엇인가요

디스크에 같은 데이터를 여러 번 쓰게 되고, 그동안 사용자 요청의 지연이 튑니다.

사용자가 1GB 를 쓴다
합치기가 그 데이터를 여러 단계에 걸쳐 다시 쓴다
디스크에 실제로 쓰인 양은 그보다 몇 배가 된다

그리고 합치기는 사용자 요청과 같은 디스크를 씁니다. 읽기 10ms 요구를 어기는 순간이 대개 이때입니다.

세 비용이 서로를 밀어냅니다. 읽기를 빠르게 하려면 자주 합쳐야 하고, 자주 합치면 쓰는 양과 지연 튐이 늘어납니다.

흔한 실수: 세 개를 모두 좋게 만들려는 것. 어느 것을 포기할지 요구사항에서 골라야 합니다. 이 설계는 읽기 지연을 요구하므로 읽기를 우선하고 쓰는 양을 더 냅니다.

Q.합치기로 인한 지연 튐을 어떻게 줄이나요

영향을 고르게 펴고, 사본이 동시에 합치지 않게 흩습니다.

방법효과
한 번에 합치는 양을 작게 나눈다한 번의 튐이 작아진다
합치기 속도에 상한을 둔다사용자 요청에 디스크 여력을 남긴다
노드마다 시작 시각을 흩는다사본이 함께 느려지는 것을 막는다

마지막이 특히 중요합니다. 사본 셋이 같은 시각에 합치면 읽기 정족수가 느린 사본을 우회할 수 없습니다. 정족수로 얻은 꼬리 지연 이득이 그 순간 사라집니다.

흔한 실수: 합치기를 한가한 시간에만 돌리려는 것. 쓰기가 계속 들어오는 시스템에서 합치기를 미루면 파일이 쌓여 읽기가 상시로 느려집니다. 미루는 것과 고르게 펴는 것은 다릅니다.

Q.삭제 표시는 언제 버리시겠습니까

모든 사본이 그 삭제를 봤다고 확신할 수 있을 만큼 오래 남긴 뒤입니다.

너무 빨리 버리면 다른 사본에 남아 있던 옛 값이 되살아납니다. 삭제 표시가 없으면 그 사본의 옛 값이 최신으로 보입니다.

기준은 사본이 낡은 상태로 머무를 수 있는 최대 시간
그 시간을 정해 두고 그보다 길게 남긴다

그 시간을 정하지 않으면 언제 버려야 하는지 알 수 없고, 버리지 않으면 공간이 계속 늘어납니다.

흔한 실수: 삭제 표시를 다른 값과 같은 규칙으로 정리하는 것. 삭제 표시는 없다는 사실을 증명하는 유일한 근거라 더 오래 남겨야 합니다. 이 실수는 지운 데이터가 되살아나는 형태로 드러나고, 사용자 신뢰를 크게 깎습니다.

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

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

키-값 저장소 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.