
최근 SQLite WAL mode가 같은 호스트의 두 Docker 컨테이너에서 공유 볼륨을 써도 잘 동작한다는 실험 결과가 화제가 됐습니다.1 컨테이너가 다르면 WAL의 shared memory가 깨질 것 같다는 불안이 있었는데, 결론부터 말하면 "같은 호스트, 같은 파일시스템"이라면 꽤 안정적으로 작동합니다.
하지만 여기서 많은 분이 놓치는 포인트가 있습니다. SQLite WAL mode 자체는 똑똑하지만, 배포 방식이나 스토리지 환경이 바뀌면 이야기가 완전히 달라집니다. 오늘은 그 경계선을 쉽게 정리해보겠습니다.
SQLite WAL mode가 Docker 컨테이너에서도 작동하는 이유
SQLite의 기본 저널 방식은 쓰기 시 잠금 범위가 커서 웹 서비스에는 답답할 수 있습니다. 반면 WAL mode는 변경 내용을 먼저 -wal 파일에 쌓고, 읽는 쪽은 기존 DB 파일을 계속 볼 수 있게 해줍니다. 그래서 "읽기 많고 쓰기 적당한" 서비스에 특히 강합니다.2
핵심은 -shm 파일입니다. WAL은 이 shared memory 성격의 파일을 통해 여러 프로세스가 상태를 맞춥니다. 최근 실험에서는 Docker Desktop for macOS 환경에서 같은 named volume을 마운트한 두 컨테이너가 변경 사항을 실시간으로 공유했고, -shm 파일도 정상적으로 협업에 사용됐습니다.1 즉, 컨테이너가 달라도 결국 같은 호스트 커널과 파일시스템 의미론을 공유하면 WAL의 전제가 유지되는 셈입니다.3
쉽게 비유하면, 방은 둘이어도 같은 화이트보드를 같이 보는 상황입니다. 방이 다르다고 회의가 망가지진 않는 거죠.
SQLite WAL mode가 위험해지는 순간
문제는 "컨테이너"가 아니라 "어떤 저장소 위에 있느냐"입니다. 같은 머신의 로컬 볼륨은 괜찮을 수 있지만, NFS나 CIFS 같은 네트워크 파일시스템, 혹은 여러 호스트에 걸친 분산 스토리지는 얘기가 다릅니다.1
이 환경에서는 mmap이나 파일 잠금이 SQLite가 기대하는 방식대로 보장되지 않을 수 있습니다. Kubernetes에서도 Persistent Volume은 종류가 워낙 다양해서, 겉으로는 둘 다 "공유 스토리지"처럼 보여도 실제 동작 특성은 크게 다릅니다.4 그래서 "PVC 붙였으니 되겠지"는 위험한 생각입니다.
한마디로, WAL mode의 적은 Docker가 아니라 애매한 스토리지입니다.
실무에서 더 무서운 건 배포 겹침입니다
흥미로운 점은, 실제 운영 장애 사례를 보면 WAL 자체보다 배포 방식이 더 큰 변수였다는 겁니다. 한 사례에서는 단일 서버에서 SQLite를 잘 쓰고 있었지만, 짧은 시간 동안 연속 배포가 일어나며 여러 컨테이너가 동시에 같은 DB 파일에 접근했고, 그 과정에서 주문 누락 문제가 발생했습니다.2
이 사례가 말해주는 건 단순합니다. WAL mode는 동시 읽기와 단일 작성자 패턴에는 강하지만, 배포 중 겹치는 프로세스와 예측 어려운 쓰기 타이밍까지 모두 해결해주는 만능키는 아닙니다. 특히 블루-그린 배포처럼 구버전과 신버전 컨테이너가 잠깐 함께 떠 있는 구조라면, "DB는 파일"이라는 사실을 더 조심해야 합니다.
즉, SQLite WAL mode를 쓸 때는 DB 튜닝보다 배포 리듬 조절이 더 효과적인 처방일 때가 많습니다.
시사점
정리하면 이렇습니다. 같은 호스트에서 Docker 컨테이너들이 동일한 로컬 볼륨을 공유한다면 SQLite WAL mode는 충분히 현실적인 선택입니다.1 읽기 중심 서비스, 단일 서버 운영, 단순한 인프라를 원할 때 특히 매력적입니다.2
하지만 스토리지가 네트워크 기반이거나, 여러 노드에 걸치거나, 배포 중 컨테이너 중첩이 잦다면 신뢰성은 다른 문제로 넘어갑니다. 이때는 "SQLite가 느려서"가 아니라 "환경이 SQLite의 가정을 깨서" 문제가 생길 가능성이 큽니다.
실무 팁을 하나만 남기자면, SQLite WAL mode를 Docker에서 쓸 때 체크리스트는 세 가지입니다. 같은 호스트인지, 로컬 파일시스템인지, 배포 시 여러 쓰기 프로세스가 겹치지 않는지. 이 세 가지만 확인해도 대부분의 함정은 피할 수 있습니다.
참고
1SQLite WAL Mode Across Docker Containers Sharing a Volume
2SQLite in Production: Lessons from Running a Store on a Single File | ultrathink.art Blog
3How SQLite Internals Connect Into One Unified System - DEV Community
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
