게임 서버가 출력하는 게임 로그가, 로그 DB로 일부만 들어가는.. 크리티컬한 문제가 발견되었다.
분명 이것저것 테스트까지 완료한 서비스들과 설정대로 패키징하여 퍼블리셔사에 전달드렸는데..!
퍼블리셔사에서 서버 로그가 누락되는 것 같다고 전달해주셨을 때 가슴이 철렁 했다.
이제 개발 환경을 구축중인, 신작 프로젝트라 그나마 다행이지..
한 번, 로그 관리 플로우를 되짚어 보자.
게임 서버는 로그를 로컬 파일에 한 라인씩 append해가며 작성해 나간다.
만약 로그 파일이 생성된지 5분이 넘었거나, 파일 크기가 5MB가 넘었다면, 새 파일을 열어 그곳에서 이어간다.
그리고, 쉘 스크립트를 기반으로 하는 서비스에 의해, 해당 로그 폴더에서 생성된지 6분 이상 지난 파일이 logstash 서버로 전송된다.
그리고, logstash는 들어온 로그 파일을 읽어 한줄한줄 tsv를 해석해 나가며, RDBMS에 bulk insert를 수행한다.
이 과정에서, logstash로 전송을 수행해주는 서비스는 전송 시에 파일 백업을 수행한다.
logstash또한, 처리가 완료된 파일은 gzip으로 압축하여 보관한다.
이 두 백업된 파일을 비교해 보니, logstash로 들어간 파일에 로그가 애초에 많이 누락된 상태였다.
아니, 이게 어디가 왜 문제가 생긴 걸까..하고 살펴본 결과,
https://hotfoxy.tistory.com/126
저번 글에서 확인해봤다 싶이, stat 명령어를 사용하여 creation date 를 체크한다.
그리고 360초 이상 된 파일만 logstash로 cp, mv로 백업 시키는 서비스를 개발해서 사용중이다.
하지만, 모종의 이유..로 stat 명령어 수행 시 0 값이 나와서, 방금 막 생성된 로그 파일 또한 생성된지 오래된 것으로 인식하여,
logstash 폴더로 cp 시키고, 백업 폴더로 mv시킨다.
이 때, **백업 폴더로 mv** 시켰기 때문에, 게임 서버는 들고 있던 로그 파일 핸들에 계속하여 로그를 작성하면,
백업된 폴더로 이동된 로그파일에 append가 되어버리는 문제가 있는 구조였던 것이다.
애초에 리눅스, 유닉스에서는 file creation date 를 관리하지 않는다고 한다.
최근에서야 일부 파일시스템, 리눅스에서 제한적으로 file creation date 를 기록하고 관리한다.
따라서 file creation time을 못 가져오는 (nfs mount된 폴더의 파일들) 환경에서는,
last modified date 등을 사용하는 차선책을 안전 장치로 두어야 된다.
'연구한 이야기 > 문제 해결 이야기' 카테고리의 다른 글
MySQL "Not Supported" 에러와 handshake (0) | 2024.05.30 |
---|---|
클라이언트 IP를 '잘' 가져오자 (0) | 2024.04.21 |
alpine리눅스와 stat (0) | 2024.03.24 |
mysql connect 시에 timezone 관련해서 에러가 나요! (2) | 2024.03.02 |
Android Studio NDK breakpoint가 잡히지 않아요! (0) | 2024.03.02 |