[개발일지 - 1] 운영 서버가 터지는 것에 대하여
1. 사건
어느날 제우스를 통하여 운영서버 CPU 사용률이 폭발적으로 올라가고, 무한로딩에 걸리는 현상이 나타났다. 이로인해 많은 사용자들에게 정상적인 서비스를 제공하지 못하는 상황이었고 이에 대해 즉각적인 대응을 하였다.
2. 원인
원인은 즉슨 한 테이블에 대하여 데이터를 조회후 POI 방식으로 엑셀파일을다운로드 하게되는 기능이었다. 이 테이블에는 150만건의 데이터가 누적되어 있었고, 테이블 풀 스캔 방지 및 인덱스 추가, 데이터 조회시 1개월 미만으로 조건을 걸어 성능 저하 방지를 예방 하였다. 인덱으로 인해 DB조회는 걱정 없었지만 문제는 js단에서만 데이터 조회기간 1개월을 걸어주는게 화근이었다. js에서만 기간 체크했지 Java단에서는 기 기간 체크하는 로직을 넣지 못하였고 이로인해 불특정 누군가 엑셀다운로드 하는하는 URL직접 입력, 이로 인해 150만건의 데이터를 풀 스캔 및 전부 엑셀화되어 서버에 부담이되고 CPU 사용률이 폭발적으로 증가하였다.
3. 대응
서버을 다운시키고 바로 재가동으로 엑셀화 로직 및 DB 조회를 강제로 막았으며, 1차 대응으로 엑셀 다운로드 버튼을 숨겼으나 다시 서버가 다운 및 무한로딩 현상이 일어났음을 보아 엑셀 다운로드 URL 직접 주소창에 쳐서 접근하는 걸로 파악되었다.
2차 대응으로 엑셀다운로드하는 맵핑주소를 변경 하였으며 이로인해 또 다시 서버가 터지는 일이 없었다.
4. 대처
직접 URL로 접근시 기간 파라미터가 없으면 강제로 오늘날짜 기준 1개월 기간을 잡을 수 있게 처리하였으며 각종 필수 값에 대한 처리도 파라미터에 담겨있지 않다면 오늘 기준 기본 셋팅값이 들어갈 수 있게 처리를 하였다.
5. 후기
여태 또 다시 해당 기능에 대해 이슈가 일어나지 않는걸 보아 새로 처리한 로직들이 제대로 가동되고 있다는 사실을 알 수 있었다. 또한 150만건 같은 큰 데이터들을 어떻게 다루어야 이를 조회시 무엇을 무엇을 생각해야하는지에 대해 한번더 고민 해보고 생각해보는 이슈였던 거 같다.
6. 여담
여담이지만 바로 하위 메뉴에 똑같은 기능에 다른 테이블을 바라보고 있는 다른 URL도 파라미터 없이 다운로드가된 기록이 남아있다. 이걸보고 로봇이 데이터 수집하고 간거 아닐까 생각한다.