덧붙이기 구조는 파일이 계속 늘어납니다. 앞 단계에서 봤듯 파일이 많으면 읽기가 무거워지고, 같은 키의 옛 값들이 공간을 차지합니다.
그래서 파일을 주기적으로 합칩니다. 이 작업이 이 저장소 운영의 대부분을 차지합니다.
합치면 무엇이 좋아지나
여러 파일을 읽어 하나로 다시 쓰면서 같은 키의 옛 값과 삭제 표시를 정리합니다.
| 얻는 것 | 설명 |
|---|---|
| 파일 수가 줄어든다 | 읽을 때 물어볼 곳이 줄어든다 |
| 공간이 줄어든다 | 옛 값이 사라진다 |
대가는 디스크를 두 번 쓰는 것이다
합치기는 읽어서 다시 쓰는 작업입니다. 사용자 쓰기 한 건이 결국 디스크에 여러 번 기록되는 셈입니다.
사용자가 1GB 를 쓴다
합치기가 그 데이터를 여러 단계에 걸쳐 다시 쓴다
디스크에 실제로 쓰인 양은 그보다 몇 배가 된다
그리고 합치기는 사용자 요청과 같은 디스크를 씁니다. 합치는 동안 읽기 지연이 튀고, 그것이 상위 1퍼센트 지연으로 나타납니다. 10ms 요구를 어기는 순간이 대개 이때입니다.
언제 합칠지가 곧 정책이다
합치기의 세 비용이 서로를 밀어냅니다.
| 목표 | 어떻게 | 대가 |
|---|---|---|
| 읽기를 빠르게 | 자주 합쳐 파일을 적게 유지 | 디스크에 쓰는 양이 늘고 지연이 자주 튄다 |
| 쓰기 비용을 낮게 | 덜 합친다 | 파일이 쌓여 읽기가 느려진다 |
| 공간을 적게 | 자주 합친다 | 같은 대가 |
세 개를 동시에 좋게 만들 수 없습니다. 어느 것을 포기할지 요구사항에서 골라야 하고, 이 설계는 읽기 10ms 를 요구하므로 읽기를 우선합니다.
지연 튐을 줄이는 방법
합치기를 없앨 수는 없으므로 영향을 고르게 펴는 쪽으로 갑니다.
| 방법 | 효과 |
|---|---|
| 한 번에 합치는 양을 작게 나눈다 | 한 번의 튐이 작아진다 |
| 합치기 속도에 상한을 둔다 | 사용자 요청에 남기는 디스크 여력을 지킨다 |
| 여러 노드가 동시에 합치지 않게 흩는다 | 사본 셋이 함께 느려지는 것을 막는다 |
마지막 항목이 특히 중요합니다. 사본 셋이 같은 시각에 합치기를 시작하면 읽기 응답 둘을 기다리는 정족수가 느린 사본을 우회할 수 없습니다. 정족수의 이득이 그 순간 사라집니다.
삭제 표시는 언제 버리나
삭제 표시를 너무 빨리 버리면 다른 사본에 남아 있던 옛 값이 되살아납니다. 그래서 모든 사본이 그 삭제를 봤다고 확신할 수 있을 만큼 오래 남겨 둡니다.
기준은 사본이 낡은 상태로 머무를 수 있는 최대 시간입니다. 그 시간을 정하지 않으면 삭제 표시를 언제 버려야 하는지 알 수 없고, 버리지 않으면 공간이 계속 늘어납니다.