네트워크 솔루션 기업 테일스케일(Tailscale)이 6개월에 걸쳐 19건의 데이터베이스 손상과 반복적인 제어 평면(control plane) 장애를 겪은 끝에, 그 원인이 16년 된 SQLite의 WAL-Reset 버그 때문임을 밝혀냈습니다. 이는 SQLite의 체크포인트(checkpoint) 과정과 쓰기 트랜잭션(write transaction) 사이에 발생하는 희귀한 데이터 경쟁(data race) 문제로, WAL(Write-Ahead Logging) 페이지가 주 데이터베이스에 복사되지 않았음에도 체크포인트가 완료된 것으로 처리되어 데이터가 영구적으로 소실되는 현상이었습니다.
테일스케일은 2022년부터 SQLite를 주 데이터베이스로 사용하며, 단일 Go 프로세스만 독점적으로 접근하는 샤드(shard) 구조를 채택했습니다. 특히 빠르고 일관된 백업을 위해 SQLite가 자동으로 체크포인트 시점을 정하는 대신 수동으로 고빈도 체크포인트를 실행하는 비표준 운용 방식을 사용했습니다. 이러한 방식이 일반적인 SQLite 사용자보다 WAL-Reset 버그 발생 조건을 만날 가능성을 높였습니다. 문제 해결을 위해 테일스케일은 SQLite 개발팀과 전문 지원 계약을 맺고, 운영 환경에 진단 도구인 tmstmpvfs VFS shim을 배포하여 트랜잭션 로그와 비정상적인 체크포인트 통계를 분석했습니다. 이 과정을 통해 체크포인트 도중 쓰기가 발생할 때 WAL 페이지가 잘못 복사되었다고 판단하는 데이터 경쟁 조건을 특정할 수 있었습니다.
이번 사건은 문서화되고 지원되는 기능이라 할지라도 비표준적인 운용 방식이 예상치 못한 위험을 초래할 수 있음을 보여줍니다. 테일스케일은 이번 조사를 통해 장기간 존재했던 SQLite 버그를 수정하는 데 기여했을 뿐만 아니라, 백업 및 복구 절차를 개선하고 자동 백업 모니터링 시스템을 구축하는 등 내부 시스템 안정성을 크게 강화했습니다. 또한, 오픈소스(open source) VFS shim 개발에 자금을 지원하여 향후 유사한 버그를 찾는 데 활용될 수 있도록 한 점은 기업이 오픈소스 생태계에 기여하며 문제를 해결하는 좋은 선례로 평가됩니다. 사용자 입장에서는 반복적인 장애 공지로 서비스 신뢰가 훼손될 수 있었던 상황에서, 근본적인 원인을 찾아 해결함으로써 장기적인 서비스 안정성을 확보했다는 점에서 긍정적인 의미를 가집니다.