개발일지

[개발일지 - 1] 운영 서버가 터지는 것에 대하여

유다의 2024. 3. 11. 20:01

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도 파라미터 없이 다운로드가된 기록이 남아있다. 이걸보고 로봇이 데이터 수집하고 간거 아닐까 생각한다.