안녕하세요.
일평균 접속이 100,000건 이상, 동시접속이 1,000건 이상인 어린이집 출결관리 시스템을 운영 중에 알 수 없는 문제가 발생하였습니다.
문제
문제는 컨테이너 용량이 계속해서 증가한다는 것이었는데요.
초기에는 원인 파악이 어려워 일단 호스트 파티션 용량을 늘려 조치를 하고 원인을 분석한 결과 문제는 Docker 이미지의 /tmp 디렉토리였습니다.
저희는 AWS S3를 사용하고 있으니 용량 문제는 발생하지 않을 거라고 생각했지만, 사실 어린이집에서 업로드하는 영상이나 사진들이 모두 호스트를 거쳐 S3에 업로드되는 구조다 보니 임시 파일(/tmp)이 계속해서 쌓이더군요.
더군다나 리눅스에서 /tmp 경로는 시스템이 재부팅될 때 청소가 된다고 하니 무중단 시스템에서는 정기적으로 청소를 해 주는 방법밖에는 없는 것 같습니다. (관련하여 오류가 있다면 지적해주세요.)
해결책
그래서 저희는 해당 Docker 이미지 내에 cron 을 이용해 주기적으로 /tmp 디렉토리를 비워주기로 결정하였습니다.
아래와 같이 tmp-clean.cron 이라는 파일을 만들고 /tmp 경로에 쌓인 파일 중 마지막 액세스 일시가 1시간(60분)이 넘어간(-amin +60) 모든 파일을 삭제하도록 하였습니다.
(1시간이라는 조건을 준 이유는 사용자가 파일을 업로드 하는 시점과 cron 작업이 동작하는 시점이 겹치게 되면 쓰려는자와 지우려는자의 대결이 이루어짐으로써 결함을 유발할 수 있기 때문입니다.)
#!/bin/bash
0 * * * * find /tmp -type f -amin +60 -delete
아래와 같이 Dockerfile에 cron을 설치하고 매 시간 동작하도록 등록을 해 주었습니다.
RUN apt-get update
RUN apt-get install -y cron
ADD tmp-clean.cron /etc/cron.d/tmp-clean.cron
RUN chmod 775 /etc/cron.d/tmp-clean.cron
RUN crontab /etc/cron.d/tmp-clean.cron
이렇게 우리의 골치거리가 하나 더 해결되었답니다^^
'Docker' 카테고리의 다른 글
호스트 디스크 용량이 갑자기 부족한 경우 (0) | 2024.02.17 |
---|---|
Ubuntu에 Docker 및 Docker compose 설치하기 (0) | 2022.08.08 |