Exploring NanoTDB: A Minimalist Append-Only Time Series Database in Go

NanoTDB는 Go로 작성된 경량 append-only 시계열 데이터베이스(TSDB)입니다. 높은 처리량의 데이터 수집(ingestion)과 단순함에 초점을 맞추도록 설계되었으며, 데이터가 한 번 기록되고 거의 또는 전혀 업데이트되지 않는 시계열 데이터의 전형적인 패턴에 최적화하기 위해 append-only 아키텍처를 활용합니다. 이 접근 방식은 설계를 단순화하고 역사적 시계열 기록의 안정성과 일치합니다.

The Architecture of Append-Only Storage

NanoTDB의 핵심은 append-only 모델을 활용한다는 점입니다. 시계열 워크로드에서는 대부분의 작업이 쓰기(삽입)와 특정 시간 범위의 후속 읽기입니다. 저장 엔진을 로그와 유사한 구조로 취급함으로써, NanoTDB는 복잡한 B-Tree 업데이트나 전통적인 관계형 데이터베이스를 괴롭히는 동일 페이지 업데이트(same-page updates)의 오버헤드를 피할 수 있습니다.

이 append-only 설계의 주요 장점 중 하나는 순차적 쓰기(sequential writes)의 효율성입니다. 순차 I/O는 무작위 I/O보다 훨씬 빠르며, 순차적 쓰기는 데이터베이스가 기본 저장 매체의 성능에 맞춰 데이터를 수집할 수 있는 속도를 제공합니다. 이는 센서, 시스템 메트릭 또는 금융 틱(financial ticks)으로부터 고주파수 데이터 수집이 필요한 애플리케이션에 이상적입니다.

Community Perspectives and Technical Trade-offs

프로젝트가 저장소에 대한 간결한 접근 방식을 제공하지만, 커뮤니티에서는 구현 및 append-only 시스템의 내재된 트레이드오프에 대해 몇 가지 사항을 제기했습니다.

The "Log File" Comparison

개발자들이 제기하는 흔한 질문 중 하나는 이러한 시스템이 표준 로그 파일과 어떻게 다른가 하는 점입니다. 둘 다 append-only 방식이지만, NanoTDB와 같은 TSDB는 전체 파일을 스캔하지 않고도 특정 시간 범위의 데이터를 검색할 수 있는 필요한 인덱싱 및 쿼리 기능을 제공합니다. 로그 파일은 일반적으로 디버깅이나 텍스트 표현을 위해 사용되는 반면, TSDB는 시간 인덱스 기반의 데이터를 효율적으로 관리하고 쿼리할 수 있는 구조화된 방법을 제공합니다.

The Challenge of Deletions

데이터베이스 설계 역사에서 반복되는 주제는 데이터 삭제의 어려움입니다. 커뮤니티 멤버들이 언급했듯이, 많은 append-only 데이터베이스는 설계를 단순화하기 위해 엄격한 "no-delete" 철학으로 시작하지만, 결국 GDPR 준수 또는 데이터 수정과 같은 실제 요구 사항이 복잡한 삭제 메커니즘의 구현을 필요로 한다는 것을 알게 됩니다.

"the history of every append only database: * we will make it append only, the type of data makes sense for it and it will simplify the design * whoops, devs fucked something up and added a bunch of nonsense that have to be removed, let'ates figure out how to make at least occasional deletes work"

Integration and Alternatives

예를 들어 홈 자동화의 맥락에서, 일부 사용자들은 유사한 경량 TSDB 아키텍처가 Home Assistant와 같은 플랫폼에서 발생하는 성능 문제를 해결할 수 있다고 제안했습니다. 더 강력하고 엔터프라이즈급 기능을 요구하는 사용자들을 위해 Clickhouse 또는 DuckDB와 같은 대안이 언급되지만, DuckDB는 정렬된 또는 순서가 있는 데이터에 대한 네이티브 이해가 부족하여 시계열 쿼리 중 읽기 증폭(read amplification)이 발생할 수 있다는 비판을 받기도 합니다.

Conclusion

NanoTDB는 특정 데이터 패턴—append-only 시계열—에 집중함으로써 매우 효율적이고 미니멀리스트한 도구를 만들 수 있다는 매력적인 사례입니다. While it is a powerful choice for high-ingestion workloads, developers must consider the long-term maintenance of the data and the potential need for data removal, a common pitfall in the append-only systems의 설계 방식에서 흔히 발생하는 함정입니다.

Sources