네이버 클라우드 서버 콘솔 (NCP Console) 사용법
NCP 서버
서버 정보 확인
NCP Console 좌측 Services 메뉴 > Server > 네이버 클라우드 서버 목록
OS, CPU, Memory, 디스크 용량, 서브넷, IP 등 전반적인 서버 정보 확인이 가능합니다.
NCP 트러블 슈팅
서버 요청 중 슬로우 쿼리 확인 방법
NCP Console 좌측 Platform : VPC 선택 > 좌측 Services 메뉴 > Cloud DB for MySQL > Monitoring 메뉴 > M DB 선택 (M:마스터 = 주 데이터베이스 / H:Hot Standby = 마스터 변경사항을 실시간 복제하여 백업, 읽기 전용 레플리카, 마스터 장애 시 자동 전환) > DB Logs 탭 > Slow Log 필터 및 기간 설정 (직접입력) > 하단 슬로우 쿼리 확인
MyBatis 쿼리 주석 추가 권장
<select id="쿼리명" parameterType="com.도메인명.서비스명.dto.DTO명" resultMap="ResultMap명">
/* Mapper명.쿼리명 */
SELECT
*
FROM
테이블명
</select>
위와 같이, 모든 쿼리 상단에 Mapper명.쿼리명을 쿼리 위에 주석으로 달아두면 모니터링 시 어떤 쿼리인지 식별하기 좋습니다.
슬로우 쿼리로 인한 트래픽 지연 예시
Query_time 65초, Lock_time 0초, Rows_sent 1, Rows_examined 2705 쿼리에서 Rows_examined 값은 MySQL이 최종적으로 확인한 행만 나타내므로 작게 나왔으나, 실제 실행계획을 보면 서브쿼리에서 테이블 조인 시 키 조건이 누락되어 29억 건을 스캔하고 있었습니다.
해당 통계 쿼리가 운영 관리자에서 3번 실행되었는데, 처음 실행된 직후부터 DB CPU Usage(%) total 22~25% (평소 1~4%), Memory Usage(%) value 53.60% (평소 50.80%), Disk I/O value 152.70% (평소 0.4~1.8%) 모두 크게 상승하여 평소 문제가 없던 쿼리들도 서버 과부하로 인해 Query_time이 지연되었고 이에 따라 같은 자원을 사용하는 쿼리는 Lock_time이 오래 걸리게 되어 전반적으로 트래픽 요청이 지연되는 문제가 생겼습니다.
DB 서버 부하이므로, WAS 서버 CPU, Memory 사용률 차트는 정상이었습니다.
관리자 슬로우 쿼리도 운영 서비스에 영향을 미칠 수 있으니, 검색 조건 추가 및 쿼리 성능 개선이 필요합니다.
DB 서버 과부화 학인 방법
NCP Console 좌측 Platform : VPC 선택 > 좌측 Services 메뉴 > Cloud DB for MySQL > Monitoring 메뉴 > M DB 선택 > OS Dashboard 탭 > 기간 설정 (직접입력) > CPU Usage(%), Memory Usage(%), Disk I/O(MB / sec) 등 확인
대용량 결과 반환 쿼리로 인한 서버 장애 예시
760만 건을 Rows_examined(검사)하고, 80만 건을 Rows_sent(반환) 한 Query_time 46초 쿼리 발생 시 WAS 서버 CPU가 100%에 도달하여 모든 API 및 DB 요청이 지연되고 톰캣 서버가 죽었습니다.
해당 쿼리 실행 시 DB CPU Usage(%), Memory Usage(%), Disk I/O는 큰 변화가 없었지만, 80만 건의 데이터를 전송하면서 Network I/O(MB / Sec) Send 1.86 (평소 0.04)가 크게 상승하였습니다.
DB 서버 부하는 크지 않았지만, WAS 서버가 전달 받은 80만 건의 데이터를 처리하면서 메모리, CPU 사용량이 급증해 WAS 서버 과부하가 발생한 것으로 보여집니다.
서버 장애를 방지하기 위해서는 풀스캔 쿼리 및 대용량 결과 반환 쿼리를 지양해야 합니다.
해당 쿼리는 검색 조건이 누락되어 풀스캔 한 것이므로, 필수 검색 조건을 반드시 받도록 개선하였습니다.
DB 장애 시점 모니터링 방법
NCP Console 좌측 Services 메뉴 > Cloud Insight (Monitoring) > Dashboard > 상단 Service Dashboard / Cloud DB for MySQL(VPC) 선택 > 날짜 및 시간대 선택 > 적용 > select, insert, update, delete, 슬로우 쿼리 수, total connection, running threads 차트 등 확인
DB 장애 예시 및 개선 방안
슬로우 쿼리 다수 발생 및 DB 요청 급증 시 쓰레드 풀의 모든 쓰레드가 사용 중인 경우,
모든 요청의 인터셉터에서 실행하는 메뉴 통계 테이블 UPDATE 쿼리에 락이 걸려서 슬로우 쿼리가 더욱 늘어나기도 합니다.
특히, 오늘 날짜의 메뉴별 사용자 수를 UPDATE 하면서 집계하는 경우 해당 레코드에 행 수준 락이 걸립니다.
이렇게 락 경합이 있는 경우, 오토 commit 실행 시간도 오래 걸리게 됩니다.
UPDATE 대신 메뉴 로그 테이블에 INSERT 후 주기적으로 통계 테이블에 집계하는 방식으로 개선해야 합니다.
로그 테이블 집계 완료 후 3개월 이상 지난 로그 데이터를 삭제하면 더욱 좋습니다.
스프링 배치를 통해 통계 집계 배치 job, 로그 삭제 배치 Job을 만들고 매일 스케줄링 할 수 있습니다.
NCP 톰캣 로그 관리
NCP 톰캣 로그 백업 방법
톰캣 설정파일 백업은 서버 내에 sh 스크립트 파일을 만들고 크론탭에 등록하여 매일 0시에 실행합니다.
톰캣 로그 백업은 로그 로테이트 설정으로 매일 30일치 로그를 압축 및 삭제 합니다.
NCP DB 백업 및 복원
NCP DB 백업 방법
NCP Console 좌측 Services 메뉴 > Cloud DB for MySQL > DB Server 메뉴 > DB 선택 > DB 관리 > DB Server 상세보기 > Backup 설정 관리 > Backup 파일 보관 기간 및 Backup 시간 설정 > 저장
NCP DB 백업 설정 확인
NCP Console 좌측 Services 메뉴 > Cloud DB for MySQL > Bakup 메뉴
- Backup 보관일 : 14 DAY (백업 삭제 주기 14일)
- Backup 시작시간 : 00:00 (매일 자정 증분 백업)
증분 백업이란?
마지막 백업 이후에 변경된 데이터만 백업하는 방법입니다.
마지막 전체 백업 이후에 변경된 데이터만 백업하는 차등 백업보다 복구 시간이 오래걸릴 수 있습니다.
NCP DB 백업 저장 위치
SaaS (CDB Mysql) 상품을 이용하는 경우, Naver Cloud Platofrm Service 내 Backup 경로에 저장됩니다.
NCP DB 복원 방법
NCP Console 좌측 Services 메뉴 > Cloud DB for MySQL > Bakup 메뉴 > DB 선택 > 상세 내역 > Backup 리스트에서 백업 날짜 선택 > Backup 파일 복원
NCP DB 장애 시 복구 절차
평소 Standby Master DB는 어떠한 역할도 하지 않고 Master DB 데이터를 그대로 복제합니다.
Master DB 장애 시 자동으로 Master DB의 역할을 Stadby Master DB가 넘겨 받는 Failover를 수행합니다.
Master Role 이전 시 약 3분 가량 소요되며, 전환되는 동안 DB 서버 접속이 되지 않습니다.
Failover 완료 시 현재 Master DB는 Standby Master Fole으로 변경됩니다.
수동 Failover 방법
NCP Console 좌측 Services 메뉴 > Cloud DB for MySQL > DB Server 메뉴 > DB 선택 > DB 관리 > Master DB Failover > 예
Leave a comment