Tombstone이란 무엇인가
Tombstone은 우리말로 ‘묘비’라는 뜻인데, 분산 데이터베이스에서는 데이터를 실제로 즉시 지우지 않고 ‘삭제되었다’는 표시만 남겨두는 방식을 의미합니다. Cassandra, DynamoDB, Riak 같은 분산 DB는 데이터를 여러 노드에 복제해서 저장하는데, 이런 환경에서 삭제 요청이 오면 모든 복제본에서 동시에 데이터를 지우기가 어렵습니다. 그래서 실제 삭제 대신 ‘이 데이터는 삭제됨’이라는 마커, 즉 Tombstone을 기록해두고, 나중에 별도의 정리 과정을 통해 진짜로 데이터를 제거합니다.
동작 원리와 예시
비유하자면 도서관에서 책을 대출 목록에서 지울 때, 종이를 찢어버리는 대신 ‘반납 완료’라는 도장을 찍어두는 것과 비슷합니다. 나중에 정기적으로 도장 찍힌 항목들을 모아서 진짜로 목록에서 삭제하는 것이죠.
Cassandra를 예로 들면, DELETE FROM users WHERE id = 1 같은 쿼리를 실행해도 데이터가 바로 사라지지 않습니다. 대신 해당 row에 삭제 시각이 찍힌 Tombstone이 생성되고, 여러 노드에 이 Tombstone이 복제됩니다. 이후 조회 시에는 Tombstone이 있는 데이터를 ‘없는 것’처럼 처리해서 응답합니다. 그리고 gc_grace_seconds라는 설정값(기본 10일)이 지나면, Compaction이라는 정리 작업을 통해 Tombstone과 원본 데이터가 실제로 디스크에서 제거됩니다.
실무에서 왜 이 방식을 쓰는가
분산 시스템에서는 네트워크 장애로 일부 노드가 잠시 오프라인이 될 수 있습니다. 만약 삭제를 즉시 실제로 반영해버리면, 오프라인이었던 노드가 다시 온라인이 됐을 때 ‘삭제된 적 없는’ 옛날 데이터를 다시 살려내는 문제가 생깁니다. Tombstone은 이런 상황에서도 ‘삭제 이력’을 명확히 남겨두기 때문에, 노드 간 동기화(Anti-entropy repair) 과정에서 삭제 사실이 올바르게 전파될 수 있습니다.
- 삭제 이력을 복제본 간에 일관되게 전달할 수 있음
- 네트워크 파티션 상황에서도 삭제 정보 유실 방지
- 즉시 삭제가 아니라 유예 기간을 두어 안전성 확보
다만 Tombstone이 너무 많이 쌓이면 조회 성능이 떨어지고 저장 공간도 낭비되기 때문에, 잦은 삭제/재삽입 패턴이 있는 서비스라면 Tombstone 개수와 gc_grace_seconds 설정을 모니터링하는 것이 중요합니다. 실제로 Cassandra 운영에서는 ‘tombstone_warn_threshold’ 같은 경고 설정을 통해 과도한 Tombstone 발생을 미리 감지하기도 합니다.