-
Linux 두개 프로세스의 동시 쓰기 문제사소한 트러블 슈팅 기록 2023. 12. 18. 16:49
문제상황
서버 로그를 less 명령어로 확인하면 가끔 "@^" 문자열이 무한반복하여 나타나는 현상 발생
원인 분석 및 접근 방법
- 해당 문제는 무중단 배포 쉘스크립트를 적용한 이후에만 발생
- 쉘스크립트 분석 결과 블루 그린 두 개의 프로세스가 로그파일인 application.log 한 개에 쓰기 작업을 동시에 수행하고 있었음.
- 기존 쉘 스크립트에선 로그파일 의 용량을 줄이기 위해 표준출력 리다이렉션이 > 로 설정되어 있어, 결과를 파일에 덮어쓰는 (overwrite) 방식
- 그린 서버가 작동을 시작하여 로그파일을 덮어쓸 때, 블루 서버가 로그 파일에 쓰기 연산을 하면 하나의 자원에 덮어쓰기+쓰기 연산이 동시에 발생하므로 의도하지 않은 결과가 나오게 될 것이라고 예상
1. 기존 쉘 스크립트 : overwrite redirection
2. 블루 서버 작동 중에, 로그 출력하는 api에 지속적으로 요청 보냄. 이 때 동시에 그린 서버 작동시작
기존 로그파일에서 발견하던 "@^" 문자열 발생
3. 뒤에 붙여쓰는 방식의 리다이렉션으로 변경
블루 로그와 그린서버 로그가 번갈아 가며 나타남
대안
- 로그 파일에 lock 적용
- 로그 파일을 포트별로 하나씩 별도로 지정하여 관리 (2개로 나눔)
- 쉘 스크립트에서 표준 출력을 append 방식으로 변경하고 일정 조건 하에 로그 파일 삭제
결정
- 로그 파일을 2개로 나누어 관리하기로 결정
- 기존 덮어쓰기 방식은 개발 단계에서 서버의 용량 관리를 자동화하기 위해 결정한 사항으로, Lock 적용이나 append 방식으로 변경 시 서버 용량을 지속적으로 모니터링 해야한다는 부담이 있었음
- 로그 파일을 2개로 나누면 블루/그린 배포 주기마다 로그 파일을 덮어쓸 수 있으므로 누락의 문제와 용량 문제를 보완
- 이후 "@^" 문자열의 무한반복과 같은 오류 현상은 해결됨
- 하지만 배포주기를 반복하는 개발 단계가 아니면, 로그 파일의 용량이 계속 증가한다는 문제는 여전히 있음, 따라서 특정 기간이나 용량을 넘어서면 삭제할 수 있도록 로그파일을 관리하는 추가적인 스크립트가 필요하다고 판단
'사소한 트러블 슈팅 기록' 카테고리의 다른 글
Elasticsearch 7.17.3 → 8.0 버전 update (1) 2024.02.19 Redis 크롤러봇에 의한 해킹 (1) 2023.12.19 Debian Stretch(Debian 9) 저장소 지원 종료 트러블 (1) 2023.12.15 Ansible ssh-copy-id 에러 (1) 2023.12.14 Docker image arm64 CrashLoopBackoff 현상 (0) 2023.12.13