안녕하세요. 아임웹 개발팀 이주승입니다. 저는 팀 내에서 새로운 쇼핑 기능을 개발하고, 개선하는 업무를 맡고 있는데요. 업무를 진행하다 보면 모니터링 시스템에서 비정상적인 Database connection으로 인해 memory 및 cpu 리소스가 비정상적인 경우를 종종 발견하게 됩니다. 이런 경우 여러 가지 원인들이 있지만 그중 꼭 개선해야 할 부분인 slow query에 대해 알아보겠습니다.
slow query란 말 그대로 DBMS가 클라이언트의 요청을 받아 응답하는 과정에서 오래 걸리는 query를 지칭합니다. 응답시간이 길어진다면 서비스 품질이 전체적으로 저하되겠죠? 그래서 지속해서 이 slow query를 모니터링하며 개선해야 합니다.
그렇다면 아임웹은 현재 slow query를 어떻게 모니터링하며, 개선하고 있는지에 관해 얘기해 보겠습니다.
우선 아임웹은 aws의 데이터베이스 관리 시스템 중 하나인 rds를 사용하고 있습니다. rds는 간편한 스토리지 확장, 뛰어난 보안 및 스냅샷을 이용한 빠른 백업 등 많은 장점이 있으며 위에서 말씀드린 slow query 또한 쉽게 모니터링 및 관리할 수 있다는 장점이 있습니다. 하지만 매번 aws console에서 slow query를 확인 및 필터링하는 일은 번거롭습니다. 그래서 아임웹은 여러 aws 서비스와 사내 메신저인 slack을 이용해서 slow query 알람 및 관리를 하고 있습니다.
첫 번째로 rds에서 모니터링할 인스턴스의 slow query를 저장하는 부분부터 시작해 보겠습니다. slow query를 저장하기 위해선 rds 인스턴스에 할당된 파라미터 그룹에서 slow query에 관련된 설정을 진행해야 합니다. 여기서 slow query를 저장하기 위한 옵션들이 여러 가지가 있는데요.
이렇게 세 가지 옵션을 설정합니다.
이렇게 설정을 하게 되면 해당 파라미터 그룹이 할당된 rds 인스턴스에서 10초 이상의 응답시간이 발생한 query는 로그에 기록이 됩니다. (참고로 파라미터 그룹은 인스턴스를 수동으로 재부팅해야 수정사항이 반영됩니다.)
그렇게 옵션 설정 후 인스턴스를 재시작 후 10초가 넘는 query를 질의하게 되면
이렇게 slow query Log 가 기록됩니다 :)
그 후에는 해당 slow query를 Aamazon CloudWatch 에 보관하게 되는데요, 이 부분은 rds 에서 인스턴스 설정을 통해 수정할 수 있습니다.
인스턴스 수정 페이지에서 로그 내보내기 영역으로 이동합니다.
이 중 느린 쿼리 로그(slow query) 를 선택 후 저장을 합니다.
그 후에 다시 slow query 질의 후 CloudWatch 서비스에서 로그 그룹 > slowquery 항목을 선택하여 로그를 확인하면
이렇게 CloudWatch에서 slow query 로그가 확인됩니다.
로그 보관까지 이상없이 완료가 됐다면, 이 로그 데이터를 파싱 후 slack 알람 및 s3 에 저장하기 위해서 Lambda 함수에 로그데이터를 전달합니다.
Cloud Watch slow query log 에 Lambda 구독필터 생성 후 데이터 파싱을 실행시킬 코드가 입력된 Lambda 함수 를 선택 후 필터를 생성합니다.
이때 구독 필터 패턴을 원하는 필터링에 맞게 입력해주면 더욱 효율적인 모니터링이 가능합니다.
그렇게 연결된 Lambda 함수에서 파싱된 로그 데이터를 s3에 저장합니다.
s3에 로그 데이터가 저장이 완료되면 해당 데이터를 slack 메세지에 맞게 가공 후 webhook으로 알람을 보냅니다.
이렇게 되면 slow query가 발생하는 즉시 확인이 가능합니다.
지금까지 아임웹에서 slow query 모니터링과 관리를 어떻게 하는지 간단하게 알아보았습니다. 물론 더 효율적인 방법이 존재하고, 기타 query log를 관리하는 툴과 방법들이 다양하기 때문에 아임웹은 지속해서 모니터링 시스템을 아키텍쳐에 맞게 개선해나가고 있습니다.
아임웹 사용자의 원활한 서비스 이용을 위해 아임웹 개발팀은 늘 노력하고 있습니다. 그 노력은 앞으로도 계속 될 예정이니, 앞으로도 아임웹을 믿고 많은 이용을 부탁드려요! 그럼 다음 포스팅에서 또 만나요 :)
by 개발 주승