쓰기 초당 10만 에 값 평균 1KB 이면 초당 100MB 입니다. 그리고 응답한 쓰기는 노드가 죽어도 남아야 합니다. 이 두 조건이 쓰기 경로를 정합니다.
제자리를 고치면 못 따라온다
키가 무작위로 흩어져 있으므로 제자리를 찾아 고치는 방식은 매번 다른 위치를 다뤄야 합니다. 디스크에서 흩어진 위치를 찾아다니는 것은 순서대로 쓰는 것보다 훨씬 느립니다.
초당 10만 건을 받으려면 디스크에 순서대로만 써야 합니다.
끝에 붙이고 메모리에 모은다
쓰기가 오면 먼저 기록 파일 끝에 붙입니다. 이것은 순차 쓰기라 빠르고, 디스크에 남았으므로 노드가 죽어도 복구할 수 있습니다. 여기까지 되면 응답합니다.
그다음 메모리의 표에 넣어 정렬 상태로 모아 둡니다. 표가 어느 크기에 이르면 한꺼번에 정렬된 파일로 내려씁니다. 이것도 순차 쓰기입니다.
| 단계 | 성질 |
|---|---|
| 기록 파일에 붙이기 | 순차. 응답의 근거가 된다 |
| 메모리 표에 넣기 | 빠르다. 죽으면 사라진다 |
| 정렬 파일로 내려쓰기 | 순차. 한꺼번에 |
응답의 근거는 기록 파일입니다. 메모리에만 있는 상태에서 응답하면 노드가 죽을 때 그 쓰기가 사라지고, 요구사항을 어깁니다.
덮어쓰지 않는다
같은 키를 다시 쓰면 옛 값을 찾아 고치지 않고 새 값을 덧붙입니다. 읽을 때 가장 새 것을 고릅니다.
그래서 삭제도 지우는 것이 아니라 삭제 표시를 덧붙이는 것입니다. 앞 단계에서 삭제가 하나의 값이어야 한다고 한 이유와 여기서 맞물립니다.
이 구조가 만드는 대가가 있습니다. 같은 키의 옛 값들이 파일에 남아 공간을 차지하고, 읽을 때 여러 파일을 봐야 합니다. 그 대가를 뒤의 두 단계에서 다룹니다.
기록 파일을 언제까지 두나
메모리 표가 정렬 파일로 내려가면 그 구간의 기록 파일은 더 필요 없습니다. 지우지 않으면 디스크가 찹니다.
정렬 파일로 내려쓰기가 끝나면 그 앞의 기록 파일을 버린다
버리기 전에 내려쓰기가 확실히 끝났는지 확인한다
순서를 거꾸로 하면 복구할 수 없는 구간이 생깁니다. 이런 실수는 평소에 드러나지 않고 노드가 죽을 때만 드러납니다.
사본 셋에 어떻게 쓰나
앞 단계에서 쓰기 성공 수를 둘로 정했습니다. 세 사본에 모두 보내고 둘이 기록 파일에 남겼다고 응답하면 성공으로 봅니다.
나머지 하나는 늦게 받거나 못 받을 수 있습니다. 그 사본을 어떻게 따라잡게 할지가 장애 처리 단계의 주제입니다.