- 인쇄
- PDF
MSSQL Log Collector (Lazylog) 사용자 가이드
- 인쇄
- PDF
Classic/VPC 환경에서 이용 가능합니다.
소개
MSSQL 로그 수집기(LazyLog) 개요 및 필수 내용
로그 수집기 개요
SQL 서버 운영 시 모니터링 대상 서버의 설정이나, 프로그램의 쿼리 성능, 서버의 이벤트 로그, 성능 카운터의 베이스라인을 수집해 두는 것은 매우 중요합니다.
이러한 베이스라인 데이터가 없다면 현재 서비스가 정상인지 (어제와 다른지) 판단에 오랜 시간이 걸릴 수 있습니다. 이에 네이버 클라우드에서는 SQL 서버 로그 수집 프로그램을 배포하고 있으며, 수집된 데이터는 장애 분석이나 성능 분석용 필수 데이터(윈도우 성능카운터, 윈도우 이벤트로그, SQL 에러로그 Agent 로그, 쿼리 구문, 쿼리 실행계획, 대기, 잠금 등 필수 DMV 스냅샷)입니다.
로그 수집 콘솔 응용 프로그램(LazyLog)은 SQL Server 2008, 2012, 2014, 2016을 지원하며, 서버 리소스가 허락하는 한 무제한의 대상 서버, 다중 SQL 인스턴스, 다중 데이터베이스를 지원합니다. 로그 수집기 프로그램은 하나의 서버에서 동시에 여러 개 동작 시킬 수 있으며, 이때는 폴더를 분리해 따로 실행하면 됩니다. 비슷한 서버 그룹을 묶어 모니터링 하면 서버의 설정이나 리소스 사용량 비교를 통해 정상 유무를 더욱 쉽게 판단할 수 있으므로 대상을 적절히 분리해 구성하는 것이 좋습니다. 여러 모니터링 대상 SQL 서버를 단 한 개의 그룹으로 모니터링 한다면, 윈도우 서비스프로그램으로도 사용 가능합니다. (설정 완료 후 Setup.exe을 동작시키고 설정 파일 수정 후 서비스 시작).
LazyLog는 사용자 정의 값(SqlLogManManager) 기반으로 대상 서버에 접근해특정 데이터를 수집해 오고, 저장 기간을 초과한 데이터는 자동으로 삭제합니다.
수집 주기를 과도하게 짧게 설정하면 많은 로그를 저장해 데이터 저장용 데이터베이스가 매우 커지거나 수집 프로그램이 오 동작할 수 있으므로, 수집 주기 조절과 데이터 보관 주기를 적절하게 설정해야 합니다. 또한 프로그램이 실행되기 위해 OS 여유 메모리를 최소3GB 이상 남겨두길 권고합니다. (이 권고 여유 메모리는 SQL Server 운영시 OS에 남겨두어야 할 메모리에 추가 확보할 메모리 입니다.) 로그 수집 프로그램은 여러 모니터링 대상 서버로부터 받은 데이터를 메모리에 임시 보관하고 SQL Server 저장소 데이터베이스에 대량(Bulk Insert) 입력합니다.
관리 대상 SQL 서버가 매우 중요하다면, 해당 SQL 서버에 응용 프로그램이 설치되지 않기 원할 것입니다. LazyLog는 모든 데이터를 원격으로 수집 가능하게 개발되었으며, 로컬 SQL 서버를 대상으로도 모니터링 가능합니다. 이 프로그램은 수 TB 용량과 초당 수만 Batch Requests를 수행하는 SQL 서버 수십 여대를 대상으로 로그수집 및 분석하고 있습니다. 원격 로그온 및 데이터 수집을 위해 윈도우 가장 계정(Windows Impersonation)과 SQL 인증이 지원됩니다. 성능 카운터와 이벤트 로그를 원격에서 읽기 위해 적절한 권한과 방화벽 개방이 필요합니다.
윈도우 성능카운터와 이벤트로그 수집을 위해 반드시 윈도우 인증(Active Directory or WorkGroup)이 사용되어야 하고, SQL Server 상태 모니터링을 위해서는 Windows 인증과 SQL 인증이 지원됩니다. (SQL 인증을 권고하며, 기본으로 SQL 인증이 설정되어 있습니다.) 계정의 암호설정은 반드시 LazyLog.exe 프로그램을 통해 암호화된 값 (안전한 암호 보관을 위해)을 생성해 사용해야 합니다. 설정은 두 곳에 저장 되는데, 첫 번째 LazyLog.exe.config 라는 XML 파일에는 글로벌 설정정보와 정보설정 데이터베이스 접근정보, 수집정보 저장용 데이터베이스 설정 정보가 저장되며, 두 번째 SqlLogManManger 라는 데이터베이스에 수집 대상 서버 접속 정보가 입력되어야 합니다.
로그 수집기 응용 프로그램(LazyLog.exe) 혹은 서비스 응용 프로그램이 설치되는 서버에서 (1)모니터링 대상 서버 정보가 들어있는 데이터베이스(SqlLogManManger) 와 수집 데이터 저장용 데이터베이스(SqlLogManDmvRepository, SqlLogManPerfmonRepository) 서버에 접근 가능한지, (2)모니터링 대상 서버를 대상으로 성능카운터 모니터링 가능한지, (3)모니터링 대상 SQL Server에 접근 가능한지 계정 과 권한 테스트를 먼저 수행하고 설치한다면 빠른 시간에 설정을 마칠 수 있습니다.
수집 저장 데이터베이스가 느려지면 로그 수집 프로그램 메모리가 과도하게 사용될 수 있으므로, 로그 수집 프로그램은 데이터베이스 서버와 분리해 동작시키는 것이 좋습니다. 다수의 서버를 모니터링 할 경우, 저장소 스토리지로 SSD를 추천합니다. 소수의 서버를 모니터링 해보고 천천히 대상을 늘여 수집 운영 서버 환경에서 로그 수집기 프로그램의 리소스 사용량을 판단해 모니터링 대상 서버를 늘여갑니다. 로그 수집 프로그램 오류 정보는 Log 폴더에 일별 아이템 별로 생성되게 되어 있으므로, 수집에 문제가 있으면 참고합니다.
구성 가이드
MSSQL 로그 수집기(LazyLog) 설치 구조
로그 수집기 구성 방법
로그 수집기는 원격 수집이 가능하므로 수집 대상 서버와 별도로 설치하는 것을 권고하고 수집 대상 서버에 직접 설치도 가능합니다. 아래 몇 몇 예시를 들어 설치 가능한 구성을 설명합니다. 본 설치 가이드에서는 방화벽과 계정 설정에 제한이 없는 로컬 설치(구성안 1)를 기본으로 설명합니다. 로컬 구성을 먼저 해보고 LazyLog 응용 프로그램 구성과 사용법을 익힌 후 원격 수집을 시도합니다.
구성안 1
구성안 1은 가장 간단한 구성이며, LazyLog 사용법을 익히기 위한 구성입니다.
이 구성은 방화벽 설정이 필요하지 않습니다. 로그 수집 프로그램을 모니터링 대상 SQL Server 에 직접 설치하고, 모니터링 데이터베이스도 같은 SQLServer에 생성해 사용하는 방법입니다. 이 경우 네트워크를 통하지 않아 성능 카운터나 이벤트 로그 수집 속도는 빠르나 로그 수집 프로그램이 이상 동작하거나 (일반적으로 Agent 프로그램이 운영서버에서 동작하는 경우의 문제들)SQL 모니터링 데이터베이스 용량이 늘어날 경우 운영 서버에 영향을 줄 수 있어 권고하지 않습니다.
1대의 서버만 모니터링하는 경우 DMV, 성능 카운터 정보만 데이터베이스에 저장하고 이벤트 로그는 데이터베이스에 저장하지 않아도 됩니다. (직접 이벤트 로그를 조회하는 것이 더 좋을 수 있기 때문입니다). 그러나, 어떤 특정 이벤트로 알람을 보내고자 할 때는 이벤트 로그를 SqlLogManPerfmonRepository(기본 저장소 이름이며 변경 가능합니다.)에 저장하면 좀 더 편리하게 관리 가능합니다.
구성안 2
구성안 2는 대부분의 모니터링 서버에 권장되는 모델입니다.
사용자 서버에는 어떠한 프로그램도 설치하지 않고 모니터링 서버를 따로 구성해 해당 서버에 SQL Server를 설치하고 ManagerDB(SqlLogManManager), DMV Repository(SqlLogManDmvRepository), Perfmon EventLog(SqlLogManPerfmonRepository)를 만들고 로그 수집 프로그램은 모니터링 대상 서버를 대상으로 원격으로 정보를 수집해 SQL 모니터링 데이터베이스에 데이터를 저장합니다.
모니터링 서버를 따로 구성하고, 다수의 서버를 모니터링하면 성능 카운터 수집에 네트워크 대역폭 부담이 있을 수 있습니다. Manager 데이터베이스의 Config 테이블에 Perfmon 항목을 적절히 수정해 씁니다. (배포된 프로그램의 기본값은 동일 IDC 내 있는 원격 서버들을 모니터링하기 적절한 값으로 설정되어 있습니다.)
모니터링 서버에 문제가 생기거나, 모니터링 대상 서버의 문제가 모니터링으로 인해 발생하는 것을 검증하기 위해서 모니터링 대상 서버에서 모니터링 서버에 설정된 계정 정보를 차단하거나 수집 프로그램을 정지해보면
쉽게 모니터링이 해당 데이터베이스에 문제를 일으키는지 검증할 수 있는 장점이 있습니다.
이 모니터링 모델은 모니터링 대상 서버의 리소스가 거의 없어 (대상 서버 CPU 100% 등) 모니터링 쿼리도 동작하지 못할 경우 데이터를 수집해 오지 못할 수 있는 문제는 가지고 있습니다. 이 문제는 원격 모니터링 모델에서 피할 수 없는 문제입니다. 구성안 1을 적용하더라도 완전한 리소스 부족에서는 모니터링 데이터를 저장하지 못할 수 있습니다.
일부 ISP 업체에서는 445 포트 개방이 불가능 하므로, 모니터링 서버가 모니터링 대성 서버와 같은 IDC에 설치하기를 권장 합니다. 이 모델은 독립 SQL Server 가 모니터링에만 사용되므로 라이선스 비용이 부담이 될 수 있습니다. 적절한 CAL 라이선스 모델이 도움이 될 수 있습니다.
구성안 3
SQL Server 라이선스 문제가 있다면 서버 사용량이 낮은 서버에서 모니터링 프로그램과 모니터링 데이터베이스를 같이 설치해 운영할 수 있습니다.
구성안 4
로그 수집 프로그램의 리소스 사용량이 부담 된다면, 모니터링 프로그램만 다른 서버를 이용해 구성 가능합니다. 또 위 구성안 1, 2, 3, 4구성을 적절히 혼합해 구성 가능합니다.
단 구성안 4와 같이 SQL 모니터링 데이터베이스가 다른 인스턴스나 서버로 구성된다면, 미리 구성된 동의어 2개를 적절히 수정해야 정상적인 모니터링이 가능합니다.
(동의어는 SqlLogManManager 데이터베이스에 SN_CounterDetailsd 와 SqlLogManPerformanceRepository 데이터베이스에 CounterDetailsAutoUpdated 가 있습니다.)
동의어 :
https://msdn.microsoft.com/ko-kr/library/ms187552.aspx
수집 데이터
MSSQL 로그 수집기(LazyLog)에서 수집 가능한 데이터
성능카운터
윈도우 성능카운터 수집이 가능하며, SqlLogManManager.dbo.CounterDetailsFilterinfo 테이블 정보를 기반으로 어떤 카운터가 서버에 있는지 읽어오고, 읽어온 카운터는 SqlLogManManager.dbo.CounterDetailsAutoUpdated 에 저장됩니다.
SqlLogManManager.dbo.CounterDetailsFilterinfo의 FilterType [IN]은 수집 대상 오브젝트를 말하며, FilterType [NOTIN]은 수집 제외 대상 오브젝트입니다.
이 값은 설치 후 사용자가 직접 수정 가능합니다.
SqlLogManManager.dbo.CounterDetailsFilterInfo
SqlLogManManager.dbo.CounterDetailsAutoUpdated
이 테이블의 구성은 윈도우 성능 카운터 스키마와 같고, 위 필터 정보에 해당하는 카운터 정보 모두를 저장하고 있습니다. IsEnabledYN 필드만 추가 되었는데, 이 필드가 Y인 것만 SqlLogManPerfmonRepository 데이터베이스에 15초 마다 저장됩니다. (저장 간격 제한 : 로컬 최소 5초, 리모트 최소 15초)
실제 저장되는 테이블은 SqlLogManPerfmonRepository 의 CounterData, CounterDetails, DisplayToID 입니다. 기본 수집 Y 항목을 수정하고자 한다면, 설치 폴더의 Resources 에서 UpdateCounterDetailsY.sql를 수정해 업데이트 하면됩니다. 원래 카운터 항목에는 없는 디스크 볼륨 별 Free , Total, Used Megabytes를 계산해 입력 되도록 디자인 되어있으므로 유용하게 쓰길 바랍니다
이 3개 테이블의 스키마는 https://msdn.microsoft.com/en-us/library/aa371915(VS.85).aspx를 참고합니다.
디스크 볼륨 별 Free , Total, Used Megabytes
수집이 정상적으로 될 경우 아래와 같은 데이터가 조회 가능합니다.
SQLCMD 명령어 [서버]
select * from SqlLogManPerfmonRepository.[dbo].[DisplayToID]
select * from SqlLogManPerfmonRepository.[dbo].[CounterDetails]
select * from SqlLogManPerfmonRepository.[dbo].[CounterData]
정상 수행 중인 데이터를 SSMS에서 조회한 결과
윈도우 실행에서 odbcad32 를 실행(ODBC 데이터 원본 관리자(64비트)) 및 설정 수행 후 윈도우 내장 성능 카운터 프로그램으로 연결하면 저장된 기록을 볼 수 있습니다. (윈도우 계정만 가능하므로, 해당 윈도우 계정이 모니터링 수집 서버에 로그인 및 data_reader 권한이 있어야 합니다.)
ODBC 구성
LazyLog 에서 수집된 데이터를 Perfmon 응용 프로그램으로 조회
이벤트로그
서버의 Application, Security, Setup, System 이벤트 로그를 읽어오는 것이 가능하며, 특정 정보를 필터 해 저장하는 것도 가능합니다. 이 이벤트 정보의 서버 별 필터는 SqlLogManManager.dbo.CollectItem 테이블의 ItemOption에 정의되어 있습니다.
이 정보는 SqlLogManManager.dbo.CollectItemTemplate 테이블을 기준으로 SqlLogManManager.dbo.usp_register_CollectItem 프로시저를 통해 입력되었고, 개별 수정이나 전체 수정이 가능합니다.
SQLCMD 명령어
select * from SqlLogManPerfmonRepository.[dbo].[EventLogApplication]
select * from SqlLogManPerfmonRepository.[dbo].[EventLogSecurity]
select * from SqlLogManPerfmonRepository.[dbo].[EventLogSetup]
select * from SqlLogManPerfmonRepository.[dbo].[EventLogSystem]
LazyLog 를 통해 Application 로그를 저장한 경우 조회 결과
저장된 이벤트 로그는 직접 윈도우 기본 eventvwr 응용 프로그램에서 읽는 것과 같게 저장되어 있습니다. SMS 전송을 위해 IsCheckedYN 필드를 추가해
두었으니, 특정 이벤트에 메시지를 보낼 때 유용하게 쓰길 바랍니다 예제에서 EventLogSecurity, EventLogSetup, EventLogSystem 은 기본 모니터링에 바로 추가 가능한 항목입니다.
DMV (Dynamic Management View)
Always On Availability 의 수행 현황, 현재 상태, 쿼리 별 리소스 사용량, 쿼리, 쿼리 플랜, 잠금, 대기 분석, 파일 별 I/O 양, 인덱스 구조, 통계 일자, 서버 메모리 현황, Agent 실행 기록 등을 수집해 저장하고 있습니다.
LazyLog는 SQL Server 운영, 문제 해결에 도움이 되는 대부분의 정보를 수집하고 있습니다. 자세한 모니터링 항목은 아래 표를 참고합니다.
항목이름 | 중요도 | 항목유형 | 항목구분 | 설명 |
---|---|---|---|---|
availability_replicas | 2 | AG (Availability Group) | DMV | 가용성 복제본 정보 |
dm_hadr_auto_page_repair | 2 | AG (Availability Group) | DMV | 가용성 복제본의 모든 가용성 데이터베이스에 대해 수행하는 자동 페이지 복구에 대한 시도 정보 |
dm_hadr_availability _group_states | 2 | AG (Availability Group) | DMV | 로컬 인스턴스에 가용성 복제본이 있는 각 AlwaysOn 가용성 그룹에 대한 정보 |
dm_hadr_availability _replica_cluster_nodes | 2 | AG (Availability Group) | DMV | WSFC 클러스터에 있는 AlwaysOn 가용성 그룹의 모든 가용성 복제본에 대한 정보 |
dm_hadr_availability _replica_cluster_states | 2 | AG (Availability Group) | DMV | WSFC 클러스터에 있는 모든 AlwaysOn 가용성 그룹의 각 AlwaysOn 가용성 복제본에 대한 정보 (복제본 위치나 조인상태에 상관없음) |
dm_hadr_availability _replica_states | 2 | AG (Availability Group) | DMV | 동일한 AlwaysOn 가용성 그룹의 로컬 복제본으로 각 로컬 가용성 복제본에 대한 행 및 각 원격 가용성 복제본에 대한 행을 반환 |
dm_hadr_cluster | 2 | AG (Availability Group) | DMV | 클러스터 이름과 쿼럼 정보 반환 |
dm_hadr_cluster_members | 2 | AG (Availability Group) | DMV | WSFC 노드에 쿼럼이 있는 경우 쿼럼을 구성하는 각 멤버에 대한 행과 각 멤버의 상태 반환 |
dm_hadr_database_replica _cluster_states | 2 | AG (Availability Group) | DMV | AlwaysOn 가용성 그룹에서 가용성 데이터베이스의 상태에 대한 정보 |
dm_hadr_database _replica_states | 1 | AG (Availability Group) | DMV | 현재 Primary 서버의 Queue 에 쌓여있는 용량, Primary 에서 Secondary 로 보내는 속도, Secondary Queue Redo 에 쌓여있는 용량, Secondary Redo반영 속도를 모니터링 할 수 있습니다. 이 값은 신규 인덱스를 생성, 대규모 데이터 수정 등을 수행할 때 필수 모니터링 항목입니다. |
dm_hadr_name_id_map | 2 | AG (Availability Group) | DMV | AlwaysOn 가용성 그룹 매핑 정보 |
database_principals | 3 | Config | DMV | 데이터베이스에 생성된 로그인 현황입니다. 계정의 생성일, SID, 기본 데이터베이스 등의 정보 |
dbcc_loginfo | 1 | Config | DMV | 데이터베이스 로그 파일의 VLF(Virtual Log File) 파일 개수나, 현재 활성 로그 파일이 몇 개인지 판단할 수 있습니다. VLF 파일은 100개 미만으로 생성되어 있어야 하고, 이 개수가 과도하게 많으면 해당 SQL Server 시작이 매우 느리거나 백업 복구가 매우 느릴 수 있습니다. |
dbcc_tracestatus | 1 | Config | DMV | 해당 데이터베이스에 활성화 된 TraceFlag 정보 |
dm_os_sys_info | 2 | Config | DMV | 물리 메모리 용량, 커밋 메모리 용량, SQL Server 시작 시간, SQL Server Version 등 |
dm_server_services | 2 | Config | DMV | SQL Server, SQL Server Agent, Full-text Daemon 등 해당 서버의 SQL 서비스 시작유형, 현재 상태 Service Account 등 |
dm_xe_sessions | 2 | Config | DMV | 서버에서 동작중인 모든 확장 이벤트 정보 |
fn_trace_getinfo | 2 | Config | DMV | 모든 활성 프로파일러 정보 |
identity_columns | 1 | Config | DMV | 모니터링 하는 데이터베이스의 모든 identity 속성의 최대값과 현재 값 |
server_principals | 2 | Config | DMV | 서버의 모든 로그인 관련 정보 |
server_triggers | 2 | Config | DMV | 서버 레벨 트리거의 모든 정보 (ex 로그인 트리거) |
sp_configure | 1 | Config | DMV | 서버의 설정 정보 |
sysaltfiles | 2 | Config | DMV | 데이터베이스 크기, 자동증가 설정 |
sysdatabases | 1 | Config | DMV | 데이터베이스 상태 값 (로그가 잘리지 않는다면 왜 잘리지 않는지, page verify option, recovery model 등의 정보 등을 알 수 있습니다.) |
sysjobs | 2 | Config | DMV | 모든 예약 작업 정보를 알 수 있으며, 활성화 비 활성화 정보 |
backupset | 1 | Log | DMV | 데이터베이스 백업 셋 정보 |
sp_readerrorlog | 1 | Log | DMV | SQL Server 의 에러로그 정보(Agent 에러 정보도 포함, Express Edition 의 경우 ItemOption 에서 SqlAgentLog=Fasle 를 설정해야 합니다) |
sysjobhistory | 1 | Log | DMV | 예약작업 수행 결과 |
dbcc_memorystatus | 3 | Performance | DMV | 서버의 가장 자세한 수준의 메모리 현황입니다. 서버의 메모리 관련 오류가 있을 때 자세한 정보를 수집 할 수 있습니다. |
dbcc_sqlperf_logspace | 1 | Performance | DMV | 로그파일(LDF 파일) 의 사용량을 알 수 있습니다. AG 환경이나 미러링 환경의 경우 DBCC Loginfo 의 Status 정보로 남은 공간을 추정 할 수 없습니다. (by design) |
dm_db_index_usage_stats | 1 | Performance | DMV | 인덱스 사용 상태 값 (클러스터 비 클러스터, 인덱스 사이즈, 복합 칼럼 순서, 통계 업데이트 일자, Unique 여부, Filtered 인덱스 여부, 활성 비활성 여부, index seek scan 회수 등을 저장합니다. 단 단편화 정보는 수행시간 문제로 수집하지 않았다. |
dm_db_missing_index _group_stats | 2 | Performance | DMV | 추가 인덱스 추천 기능으로 제안된 인덱스와 인덱스 생성시 성능 향상 정도를 보여줍니다. |
dm_db_task_space_usage | 2 | Performance | DMV | TEMPDB 공간 추적용으로 어떤 쿼리에 의해 어느 정도의 공간이 TEMPDB 에 할당되어 있는지 보여줍니다. |
dm_exec_query_stats2 | 1 | Performance | DMV | 쿼리 별 1분 단위 통계를 수집합니다. CPU, Reads, Execution Count, Elapsed Time 등의 통계를 구합니다. 또한 연관된 Query String 과 쿼리 실행계획을 보관합니다. 1분 통계 테이블 : dm_exec_query_stats2_b_summary 실제 쿼리 테이블 : dm_exec_query_stats2_b_statement 쿼리 플랜 테이블 : dm_exec_query_stats2_b_query_plan 실제 쿼리 통계 기본 데이터 (1시간) : dm_exec_query_stats2_b |
dm_io_virtual_file_stats | 2 | Performance | DMV | 데이터 파일 및 로그 파일에 대한 I/O 통계를 반환합니다. 하나의 물리 디스크에 여러 파일이 존재할 경우 어떤 파일에서 가장 많은 I/O 가 발생하는지 판단할 주요 수치입니다. |
dm_os_memory_clerks | 2 | Performance | DMV | SQL Server 인스턴스에서 현재 활성 상태의 모든 메모리 클럭을 반환합니다. SQL Server 에서 사용하는 대부분의 메모리 할당은 해당 DMV에 등록 후 사용되므로 메모리 사용량을 추적하거나, 과도한 메모리 사용량을 보이는 개체를 확인 할 때 주로 사용됩니다. |
dm_os_wait_stats | 1 | Performance | DMV | 쿼리 수행이 완료된 대기 시간을 보여줍니다다. 누적값으로 기록되며, 과거 값과 현재 값의 차이를 일정 주기로 쿼리하면, 어떤 대기가 많이 발생하는지 알 수 있습니다. |
dm_os_workers | 1 | Performance | DMV | 현재 동작중인 쿼리와 상태값을 반환 합니다. SQL Server 에서 현재 수행되는 사용자 쿼리와 시스템에서 발생하는 동작도 모두 담도록 디자인 되어 있으며, 현재 동작중인 서버 상태를 가장 자세히 알 수 있습니다. (dm_exec_query_stats2 에는 동작이 완료된 통계가 있고, dm_os_workers 는 현재 수행중인 쿼리의 리소스 사용량 정보가 있습니다.) |
sp_lock2 | 1 | Performance | DMV | SQL Server 잠금 정보를 Tree 형태로 출력하도록 만들어졌으며, 원인 쿼리 분석이 가능합니다. (ex : 65 > 70 > 81 라고 LockTree 결과는 65 번 spid 가 잠금 원인이며, 70번과 81번 spid 가 수행 대기[잠금으로 수행이 불가능한 상황]하고 있다는 설명입니다.) 수집주기를 운영 환경에 맞게 적절히 조절할 필요가 있습니다. 기본값은 10초로 되어 있으나, 필요에 따라 그 수집 주기를 짧게 설정하는 것도 좋습니다. |
sp_spaceused | 1 | Performance | DMV | 테이블의 행수 및 공간 사용정보를 출력합니다. |
suspect_pages | 1 | Performance | DMV | 일관성이 깨진 페이지 정보를 출력합니다. 823, 824 오류를 모니터링 할 수 있습니다. 823, 824 오류는 물리 하드웨어 스토리지 일관성에 문제가 있을 수 있으므로 하드웨어 점검이 필요할 수 있습니다. |
Application | 1 | Log | EVENTLOG | 이벤트 로그의 Application 정보를 가져온다. 필터 조건을 추가해 원하는 조건의 데이터만 수집 가능합니다. |
Security | 3 | Log | EVENTLOG | 이벤트 로그의 Security 정보를 가져온다. 필터 조건을 추가해 원하는 조건의 데이터만 수집 가능합니다. |
Setup | 3 | Log | EVENTLOG | 이벤트 로그의 Setup 정보를 가져온다. 필터 조건을 추가해 원하는 조건의 데이터만 수집 가능합니다. |
System | 3 | Log | EVENTLOG | 이벤트 로그의 System 정보를 가져온다. 필터 조건을 추가해 원하는 조건의 데이터만 수집 가능합니다. |
BaselineCollect | 1 | Performacne | PERFMON | Performance Counter 값을 가져온다. 미리 정의된 Performance Counter 값을 가져오며, 미리 정의된 카운터는 설치 폴더 하위의 Resources 폴더에 UpdateCounterDetailsY.sql 값을 기반으로 모니터링 합니다. 모니터링 기본값 변경을 위해 해당 쿼리를 바꾸거나 개별로 SqlLogManManager 데이터베이스의 CounterDetailsAutoUpdated 테이블의 값 IsEnabledYN 를 조절합니다. 추가로 필요한 성능 카운터 정보가 있으면, CounterDetailsFilterInfo 테이블의 필터 정보를 수정합니다. |
중요도는 LazyLog 개발자가 SQL Server 모니터링 시 주요하게 살펴봐야 할 내용을 1로 했으며, 특수한 문제 해결이나 그 중요도가 낮은 것은 3으로 설정했습니다.
특별히 문제가 없다면, 모든 설정을 활성화해 모니터링 합니다. 저장 공간 문제가 있다면 아이템의 수집 주기를 변경하거나 삭제
한계 시간을 조절하면 됩니다.
데이터베이스 스키마
MSSQL 로그 수집기(LazyLog) 데이터베이스 구조
SqlLogManManager
수집 대상 서버 정보를 저장하는 테이블과, 수집 설정에 관계된 모든 설정이
들어있는 데이터베이스 입니다. (이 데이터베이스와 lazylog.exe.config 파일만
백업하면 언제든지 수집 서버를 복구 할 수 있습니다.)
테이블 이름 | 칼럼 이름 | 설명 |
---|---|---|
CollectItem | CollectId | 자동 증가 값 |
ItemType | DMV / EVENTLOG / PERFMON 값을 가질 수 있습니다. | |
ItemName | dm_os_workers, dm_os_waitstats, dm_exec_query_stats2 등의 값이 들어 있습니다. 아이템이 DMV 인 경우 SqlLogManDmvRepository 에 ItemName_b 로 저장됩니다. dm_exec_query_stats2 아이템의 경우는 테이블이 추가됩니다. dm_exec_query_stats2_b, dm_exec_query_stats2_b_query_plan, dm_exec_query_stats2_b_statement, dm_exec_query_stats2_b_summary 테이블로 결과가 저장됩니다. 모든 ItemName 은 CollectItemTemplate 테이블에 기본값과 함께 저장되어 있습니다. | |
ItemDesc | PERF, CONFIG, LOG로 나눈 분류 값 이며, 프로그램에서 특별한 동작을 하지 않습니다. | |
MachineId | Machine 테이블에 등록된 모니터링 대상 서버의 MachineId 값 | |
SqlInstanceId | MachineSqlInstance 에 저장된 SqlInstanceId 값 | |
DatabaseName | Connection String 의 기본 데이터베이스 값입니다. 몇몇 아이템은 master 데이터베이스에 수집이 안되고 직접 사용자 데이터베이스에 접속해야 합니다. CollectitemTemplate에 master 와 UserDatabase로 구분되어 있습니다. UserDatabase로 분류된 아이템은 기본 아이템이 먼저 성공적으로 수집된 후 설정되어야 합니다. | |
CollectIntervalSec | 수집 주기 초 | |
IsNtAuthYN | Y / N 값을 가질 수 있으며, NT 인증인지 SQL 인증인지 구분하는 값입니다. ItemType 중 PERFMON 과 EVENTLOG는 반드시 IsNtAuthYN 이 Y로 설정 되어야합니다. DMV 관련 아이템은 Y/N 값을 가질 수 있습니다. DMV 관련 아이템은 IsNtAuthYN가 Y인 경우 모니터링 대상 서버를 찾을 때 Machine 테이블에 있는 MachineName, MachinePublicIp, NtUserName, NtPassword, NtDomain, MachineSqlInstance 테이블의 PortDefault 정보를 이용해 Windows Impersonation 을 시도한 후 접근합니다. 대상 서버가 도메인 환경이면 NtDomain에는 도메인(ex: minsouk.com)을 적고 없다면 hostname (ex: LocalMachineHostnmaeA을 적으면 됩니다. N 인 경우 SQL 인증으로 동작하며, Machine 의 MachinePublicIp, MachineSqlInstance 테이블의 SqlUsername, SqlPassword, PortDefault 값을 이용해 접근합니다. EVENTLOG 와 PERFMON 은 MachinePublicIp가 아니라 MachineName 을 이용해 접근하므로 AD 환경에서는 도메인, 아닌 경우에는 hostname 을 windows/system32/drivers/etc/hosts 에 등록하고, NtDomain 에 기입해야 정상적으로 수집 가능합니다. | |
IsEnabledYN | Y / N 값을 가질 수 있으며, N 일 경우 해당 아이템은 수집하지 않습니다. | |
PurgeIntervalSec | 수집 저장된 데이터 삭제 주기 초, 수집 주기와 같게 설정하는 것이 좋습니다. | |
PurgeDurationHH | 남겨둘 데이터의 한계 시간입니다. 24를 입력하면 24시간이 지난 데이터는 IsPurgeEnabledYN 이 Y 인 경우 자동 삭제 됩니다. | |
IsPurgeEnabledYN | Y / N 값을 가지며 Y 인 경우 데이터 삭제 동작을 수행합니다. | |
ItemOption | db_exec_query_stats2_b 에는 topCnt, SrcDelHH, IsNewDmv, isGatherQueryStatement, isGatherQueryPlan 옵션을 가질 수 있습니다. topCnt 는 dm_exec_query_stats 를 last_execution_time desc 기준으로 정렬해 top 으로 가져올 때 최대값을 기록합니다. 초기값은 20000 입니다. SrcDelHH dm_exec_query_stats2_b 의 데이터 유지 시간입니다. 기본값은 1 이며 1시간 입니다. 특수한 경우가 아니면 1시간 이상 유지할 필요가 없습니다. 집계 값은 따로 dm_exec_query_stats2_b_summary 에 저장되기 때문입니다. isNewDmv 는 SQL Server 2012 SP3 부터 total_dop ~ max_used_threads 값을 수집할 수 있습니다. SP 버전마다 달라 기본값은 false로 설정되어 있습니다. 만약 이 값이 나오는 dm_exec_query_stats 를 수집하면 true 를 입력하면 됩니다. isGatherQueryStatement 는 쿼리문 수집 여부이며, 기본값은 true 입니다. isGatherQueryPlan 은 플랜 수집 여부이며, 기본값은 true 입니다. ad-hoc 쿼리로 동작해 수많은 플랜이 생길 경우 false 로 설정합니다. true 로 설정되어 있더라도 최소 부하로 플랜을 수집해 온다. 쿼리문과 플랜은 1분에 최대 부하를 일으키는 쿼리 100개를 수집합니다. EVENTLOG Security 의 경우 filter 조건을 명시할 수 있습니다. 기본값은 filter | and \*[System[EventID != '4674']] and \*[System[EventID != '4624']] and \*[System[EventID != '4634']] and \*[System[EventID != '4672']] and \*[System[EventID != '5447']] and \*[System[EventID !='4673']] and \*[System[EventID != '4776']] and \*[System[EventID != '4670']] 입니다. PERFMON BaselineCollect 의 경우 counterReload 옵션을 가질 수 있고 기본값은 Y 입니다. 서버의 모든 성능 카운터 수집이 완료되면 N으로 자동으로 변경됩니다. | |
CollectItemTemplate | 수집 기본값을 저장하고 있는 테이블입니다. IsEnabledYN 이 모두 N 으로 설정되어 있습니다. isNtAuthYN 은 EVENTLOG, PERFMON 은 Y DMV 관련 항목은 N으로 등록되어 있습니다. usp_register_CollectItem 저장 프로시저를 이용해 아이템 등록 시 이 값을 참조해 수행합니다. | |
Config | Type | PERFMON / EVENTLOG / DMV 값을 가질 수 있습니다. |
Name | 아이템 이름 CollectPerServerItemSleepMiliSec 성능 카운터 아이템 수집 시 각 아이템 간 휴지 시간(Thread.Sleep 값) 입니다. 동일 IDC내 원격 서버의 경우 150을 권고하고, 예를 들어 성능 카운터 수집 간격이 10초이며, 수집 성능카운터 아이템이 10개 라면, CollectPerServerItemSleepMiliSec 은 최대 1000 ms 까지 줄 수 있을 것입니다. 이 값은 서버의 아이템 수집 항목과 수집주기에 의존됩니다. 수집 간격 사이에 최소 1000 ms 까지 설정 가능하지만 900ms 정도까지 설정하는 것이 좋고, 최소값은 25ms 이상 확보해야 합니다. 로컬 서버의 경우 더 짧은 시간으로 설정 가능합니다. CollectIntervalSec 성능 카운터 수집 주기입니다. 기본값은 15초 입니다. 원격서버의 경우 15초 이상의 값을 설정해야 합니다. 서버 별로 다른 값을 줄 수 없습니다. 대상서버의 성능 카운터를 추가 할 경우 이 값은 변경 되어야 합니다. CounterDetailsThreads 최초 성능 카운터를 수집 할 경우, 각 카운터 정보를 읽어야 하며, 이 값은 CounterDetailsFilterInfo 테이블 설정을 통해 성능 카운터 카테고리를 필터 합니다. 한번에 너무 많은 서버의 성능 카운터를 읽어오면 네트워크 병목을 유발 할 수 있으므로 적절하게 설정하면 됩니다. 1로 설정하면 한번에 하나의 서버에서 성능 카운터 정보를 수집합니다. 이 값은 수집 프로그램 내 SemaphoreSlim 클래스의 동시 수행 숫자를 제어합니다. 수집 대상 서버를 모두 동시에 수집하길 원한다면 수집 대상 서버 숫자만큼 적어주면 됩니다. 기본값 1을 적용해 순차적으로 수집 되는걸 권장 합니다. PerfmonReset : LazyLog.exe 프로그램 실행 중 항목의 Value 값이 Y로 업데이트 되면, 수 초 후 성능 카운터만 수집을 다시 시작합니다. 전체 수집 프로그램을 재 시작 하지 않기 위한 옵션이며, LazyLog.exe 프로그램을 종료하고 다시 시작해도 같은 동작을 수행합니다. DmvReset : LazyLog.exe 프로그램 실행 중 항목의 Value 값이 Y로 업데이트 되면, 수 초 후 DMV 만 수집을 다시 시작합니다. 전체 LazyLog 프로그램을 재 시작 하지 않기 위한 옵션이며, LazyLog.exe 프로그램을 종료하고 다시 시작해도 같은 동작을 수행합니다. EventLogReset LazyLog.exe 프로그램 실행 중 항목의 Value 값이 Y로 업데이트 되면, 수 초 후 이벤트 로그만 수집을 다시 시작합니다. 전체 LazyLog 프로그램을 재시작 하지 않기 위한 옵션이며, LazyLog.exe 프로그램을 종료하고 다시 시작해도 같은 동작을 수행합니다. | |
Value | 모두 문자 값이나 프로그램에서 적절히 변환해 사용됩니다. (위 Name 칼럼 설명 참조) | |
CounterDetailsAutoUpdated | 성능 카운터 수집을 위해 CounterDetailsFilterInfo 테이블 값 기준으로 서버에서 읽어온다. CounterDetailAutoUpdated 는 서버에서 읽어온 성능 카운터 정보의 최초 저장 위치이며, 기본으로 IsEnabledYN 이 Y로 설정된 카운터들은 lazylog.exe 하위 Resources 폴더에 UpdateCounterDetailsY.sql 값에 의해 설정됩니다. 성능 카운터를 추가 하고자 한다면, SqlLogManManager 데이터베이스의 CounterDetailsAutoUpdated 테이블에서 해당 항목의 IsEnabledYN 값을 Y 로 수정 후 CollectItem 에서 해당 서버의 성능 카운터 항목 ItemOption 에 counterReload=Y 를 설정합니다. (Y 로 설정된 성능 카운터를 N 으로 바꾸는 절차도 같습니다.) | |
CounterDetailsFilterInfo | idx | identity 값 |
FilterType | IN / NOTIN 값을 설정할 수 있으며, ObjectName 기준으로 IN 은 포함, NOTIN 은 수집하지 않습니다. | |
ObjectName | 성능카운터 ObjectName입니다. | |
Machine | MachineId | identity 값 |
IdcName | 사용되지 않습니다 | |
MachineName | EventLog 수집시 EventLogSession 클래스에서 사용됩니다. PERFMON 수집시 PerformanceCounter 클래스에서 사용됩니다. ActiveDirectory 환경이 아니라면, windows/system32/etc/hosts 에 hostname과 IP가 등록되어 있어야 합니다. | |
MachinePublicIp | DMV 수집 시 대상서버 접근 IP | |
MachinePrivateIp | 사용되지 않습니다 | |
MachineClusterIp | 사용되지 않습니다 | |
MachineAgIp | 사용되지 않습니다 | |
NtUserName | Windows Impersonation 인증에서 사용할 계정이름 | |
NtPassword | Windows Impersonation 인증에서 사용할 암호 lazylog.exe “암호”를 수행해 얻은 암호화 된 값을 넣어야 합니다. 암호화된 암호는 프로그램 내부에서 정상 암호값으로 DeCrypt 해 사용됩니다. | |
NtDomain | Windows Impersonation 인증에서 사용할 도메인 이름입니다. Active Directory 환경이 아닐 경우 반드시 hostname 을 적습니다. | |
NtSessionAuthenticationType | KERBEROS, NEGOTIATE, NTLM, DEFAULT를 지원하며 EventLogSession 클래스에서 사용됩니다. 기본값은 DEFAULT 입니다. | |
IsEnabledYN | Y / N 을 설정할 수 있으며, N 일 경우 해당 서버의 모든 아이템을 수집하지 않습니다. (lazylog.exe 재 시작 혹은 Config 값 조절로 해당 수집을 재 시작 해야합니다.) | |
MachineSqlDatabase | MachineId | Machine 테이블의 MachineId 값 |
SqlInstanceId | MacineSqlInstance 테이블의 SqlInstanceId 값 | |
DatabaseName | SqlLogManDmvRepository 데이터베이스의sysdatabases_b 에 수집된 데이터베이스 이름 | |
DatabaseDesc | 사용되지 않습니다 | |
IsEnabledYN | usp_register_CollectItem 저장프로시저를 이용해 생성할 때 스크립팅 여부를 결정합니다. N 은 스크립트 되지 않습니다. | |
CollectItem | CollectId | 사용되지 않습니다 |
SqlLogManDmvRepository
DMV 수집 결과 데이터가 저장되는 데이터베이스 입니다.
테이블 이름 | 칼럼 이름 | 설명 |
SqlLogManManager 데이터베이스의 CollectItem 테이블에 있는 ItemName 에 \_b (베이스라인 의미) 를 가진 모든 테이블 | idx | identity 값 |
MachineName | 수집 대상 서버 호스트명 | |
FullinstanceName | 수집 대상 SQL 서버 인스턴스 이름 | |
probe_time | 수집 요청 시간 | |
etc | 각 itemname 명령어 기반으로 유추 | |
dm_exec_query_stats2_b | dm_exec_query_stats2 아이템의 데이터 | |
dm_exec_query_stats2_b_summary | dm_exec_query_stats2_b 의 delta 값 (현재 설정 기준으로 1분 기준 delta 값) 이 테이블은 dm_exec_query_stats_b 가 3번이상 수집되어야 최초로 과거 값 기반으로 생성 됩니다. | |
dm_exec_query_stats2_b_statement | dm_exec_query_stats2_b_summary 에 있는 query_hash 에 해당하는 쿼리 문장 | |
dm_exec_query_stats2_b_query_plan | dm_exec_query_stats2_b_summary 에 있는 plan_handle 에 해당하는 xml plan |
SqlLogManPerfmonRepository
성능 카운터와 이벤트로그를 저장하는 데이터베이스 입니다.
테이블 이름 | 칼럼 이름 | 설명 |
---|---|---|
CounterData | 성능 카운터 기본 데이터베이스 스키마를 따름 (수집된 성능 값) | |
CounterDetails | 성능 카운터 기본 데이터베이스 스키마를 따름 (수집된 성능 카운터 종류) | |
DisplayToID | 성능 카운터 기본 데이터베이스 스키마를 따름 (수집 성능카운터 Set 정의이며, lazylog.exe.config 의 PerfmonItemName 값 BaselineCollect 는 DisplayString 으로 사용됩니다. | |
EventLogApplication | 윈도우 이벤트 로그의 Application 정보 (최초 수집 시 30분 이전 로그부터 가져옵니다) | |
EventLogSecurity | 윈도우 이벤트 로그의 Security (최초 수집 시 1분 이전 로그부터 가져옵니다) | |
EventLogSetup | 윈도우 이벤트 로그의 Setup (최초 수집 시 1일 이전 로그부터 가져옵니다) | |
EventLogSystem | 윈도우 이벤트 로그의 System (최초 수집 시 30분 이전 로그부터 가져옵니다) |
설치
MSSQL 로그 수집기(LazyLog) 설치 가이드
프로그램 설치
개요
- 암호를 평문으로 저장하면, 해킹이나 보안에 문제가 있으므로 암호를 다시 암호화해 사용해야 합니다. [필수]
- 성능카운터와 이벤트로그를 모니터링 대상 서버에서 읽어오기 위해 대상 서버에서 윈도우 계정설정, 권한설정, 필수 서비스시작, 방화벽 설정이 필요합니다.
- 모니터링 대상 서버를 대상으로 모니터 서버에서 성능카운터, 이벤트로그, DMV를 조회 할 수 있는지 먼저 확인이 필요합니다
- 저장소 데이터베이스 3개를 생성합니다.
- lazylog.exe.config 파일에는 항목의 글로벌 설정과 수집기 설정이 저장되는 데이터베이스, 수집 결과가 저장되는 데이터베이스 정보가 기록됩니다.
- SqlLogManManager 데이터베이스에 수집 대상 서버의 접속 정보를 저장합니다.
- SqlLogManManager 데이터베이스에 서버 별 수집 아이템을 등록합니다. (성능카운터 수집여부, 이벤트로그 각 항목 수집여부, DMV 각 항목 수집여부 등)
- 설정이 복잡해 등록 스크립트를 생성해주는 프로시저가 제공되므로 스크립트를 생성해 SQLCMD 나 SSMS에서 실행합니다.
- 기본 수집과 확장 수집이 있는데, 확장 수집의 경우
- SqlLogManDmvRepository.dbo.sysdatabases_b 수집이 완료되어야 합니다. (기본 아이템 중 sysdatabases를 수집해야 함)
- SqlLogManDmvRepository 데이터베이스에는 SQL Server 관련 모니터링 항목이 저장됩니다.
- SqlLogManPerfmonRepository 데이터베이스에는 성능카운터와 이벤트로그 수집 결과가 저장됩니다.
콘솔 모드 설치
LazyLog.zip 파일의 압축을 해제 하면 아래와 같은 파일이 있습니다.
항목 | 설명 |
---|---|
Resources | UpdateCounterDetailsY.sql 파일이 있음 |
SQLScript | 윈도우 명령어 모음과 설치 Step 에서 사용하는 SQL 스크립트 파일이 있음 |
LazyLog.exe | 로그수집 프로그램 (Console 응용 프로그램) |
LazyLog.exe.config | 로그수집 설정 파일 (XML 설정파일) |
LazyLogService.zip | 로그수집 프로그램 (Service 설치용 응용 프로그램 설치 파일) |
탐색기 보기 옵션에서 파일 확장명에 체크를 하지 않으면, LazyLog.exe 는 LazyLog, LazyLog.exe.config 는 LazyLog.exe 로 보이므로 LazyLog.exe.config 와 LazyLog.exe를 혼동하지 않도록 주의합니다.
암호 생성
LazyLog 에서 사용하는 암호는 LazyLog를 통해 생성한 암호화된 문자열을 사용해야 합니다. 암호화된 문자열 생성은 cmd에서 LazyLog “암호문자열”을 입력하여 생성합니다. 아래는 3개의 암호를 생성한 예제입니다. 테스트 설정의 경우 모두 같은 암호를 설정하는 것도 좋은 방법입니다. 그러나, 실제 모니터링 환경에서는 서버 별 암호가 모두 다를 수 있습니다.
테스트의 경우 암호도 가이드와 같게 생성해 실습하면 더욱 쉽게 설정 할 수 있습니다.
모니터링 대상 서버 설정
- 서버 설정
lazyNtUser는 SqlLogManManager 데이터베이스에 설정될 윈도우 가장 인증 계정입니다. 아래는 모니터링 대상 서버에서 실행해야 할 명령어 이며, 관리자 모드로 실행되어야 합니다. 모니터링 저장소 서버와 모니터링 대상 서버가 같을 경우 아래 붉은색 명령어는 수행하지 않아도 됩니다.
- 윈도우 CMD 명령어 [클라이언트]
sc config remoteregistry start=auto
net start remoteregistry
netsh advfirewall firewall set rule name="Netlogon 서비스(NP-In)" new enable=yes
net user lazyNtUser P@ssw0rd2 /ADD
net localgroup "Performance Log Users" lazyNtUser /add
net localgroup "Performance Monitor Users" lazyNtUser /add
net localgroup "Event Log Readers" lazyNtUser /add
- SQL Server 설정
lazyClient 라는 계정은 SqlLogManManager 데이터베이스에 설정될 계정 정보입니다. SQL Server 관리자로 아래 명령을 SQLCMD 모드로 실행합니다. SQLScript하위 폴더에 L03_Account_lazyClient.sql 파일을 엽니다
- SQLCMD 명령어 [클라이언트]
-- 변수 수정
:setvar AccountName lazyClient
:setvar AccountPassword P@ssw0rd1
-- 변수 수정 끝
- lazyClient SQL 인증 계정이 P@ssw0rd1 라는 암호로 생성됩니다.
본 가이드의 모든 SQL 쿼리문은 SQLCMD 모드에서 동작시킨다. SSMS 에서 SQLCMD 모드로 동작 시키기 위해 아래 설명을 참고합니다.
SQLCMD 모드 변환 방법 | 일반 모드 | SQLCMD 모드 (변수 부분이 반전되어 있음) |
모니터링 저장소 데이터베이스 생성
- 저장소 데이터베이스가 생성될 폴더를 생성합니다.
- 윈도우 CMD 명령어
mkdir c:\lazylog
폴더가 생성되면 됩니다. (데이터베이스 이름은 자유롭게 변경 가능합니다. 나중에 해당 폴더에 데이터베이스가 생성됩니다.) 처음 실습에서는 그대로 유지합니다.
- SQLScript하위 폴더에 L01_InitScript.sql 파일을 엽니다.
- SQLCMD 명령어
-- 변수 수정
:setvar SqlLogManManagerDatabase SqlLogManManager
:setvar SqlLogManManagerMdfPath c:\lazylog
:setvar SqlLogManManagerLdfPath c:\lazylog
:setvar SqlLogManDmvRepositoryDatabase SqlLogManDmvRepository
:setvar SqlLogManDmvRepositoryMdfPath c:\lazylog
:setvar SqlLogManDmvRepositoryLdfPath c:\lazylog
:setvar SqlLogManPerfmonRepositoryDatabase SqlLogManPerfmonRepository
:setvar SqlLogManPerfmonRepositoryMdfPath c:\lazylog
:setvar SqlLogManPerfmonRepositoryLdfPath c:\lazylog
-- 변수 수정 끝
이 스크립트는 SqlLogManManager, SqlLogManDmvRepository, SqlLogManPerfmonRepository 3개의 데이터베이스를 만드는 스크립트입니다. 변수 수정 부분을 확인하고 SQLCMD 모드에서 실행합니다. 아래와 같이 데이터베이스 3개가 생성됩니다.
모니터링 저장소용 계정 생성
위 단계에서 만든 데이터베이스에 접근할 계정을 만들어 줍니다.
- SQLScript하위 폴더에 L02_Account_lazyServer.sql 파일을 엽니다.
- SQLCMD 명령어
-- 변수 수정
:setvar AccountName lazyServer
:setvar AccountPassword P@ssw0rd3
-- 변수 수정 끝
변수를 수정하고 SQLCMD 모드로 실행합니다.
lazylog 응용 프로그램이 구동하는 곳에서 ip, port, 계정으로 SSMS 로 모니터링 저장소 서버에 로그인이 되는지 반드시 테스트 합니다. (SSMS 로 로그인 할 경우는 원래의 암호 P@ssw0rd3로 접근) GUI 로 설정할 경우, 옵션에 따라 암호를 변경 해줘야 로그인 되는 경우가 있습니다. lazyServer 의 암호 P@ssw0rd3 는 Lazylog.exe.config 에 넣을때는 qcWa7DCqnN7vqMZ6b9ilzw== 로 암호화된 값을 입력합니다.생성한 계정과 IP 패스워드로 LazyLog.exe 파일이 구동되는 서버에서 저장소 데이터베이스 서버에 IP 와 Port 로 접근 가능한지 테스트합니다.
LazyLog.exe.config 설정
이 파일은 LazyLog 응용 프로그램이 위 단계에서 생성한 데이터베이스에 접근할 정보를 기입해 주는 단계입니다.
notepad 로 수정하면 됩니다. IP, Port, 계정이름, 암호화된 계정 비밀번호를 적절히 수정합니다. 127.0.0.1,1433으로 접근할 경우 SSMS로 접근이 되는지 테스트 후 설정 합니다.
<appSettings>
<add key="FileLogYN" value="Y" />
<add key="UsePerfmonYN" value="Y" />
<add key="UseEventmonYN" value="Y" />
<add key="UseSqlmonYN" value="Y" />
<add key="UseLocalKey" value="Y" />
<add key="NClavisKey" value="" />
<add key="PerfmonItemName" value="BaselineCollect" />
<add key="SqlLogManManagerInstanceName" value="AD01047147" />
<add key="SqlLogManManagerIP" value="127.0.0.1" />
<add key="SqlLogManManagerPort" value="1433" />
<add key="SqlLogManManagerDatabase" value="SqlLogManManager" />
<add key="SqlLogManManagerIsNtAuthYN" value="N" />
<add key="SqlLogManManagerUserName" value="lazyServer" />
<add key="SqlLogManManagerPassword" value="qcWa7DCqnN7vqMZ6b9ilzw==" />
<add key="SqlLogManDmvRepositoryInstanceName" value="AD01047147" />
<add key="SqlLogManDmvRepositoryIP" value="127.0.0.1" />
<add key="SqlLogManDmvRepositoryPort" value="1433" />
<add key="SqlLogManDmvRepositoryDatabase" value="SqlLogManDmvRepository" />
<add key="SqlLogManDmvRepositoryIsNtAuthYN" value="N" />
<add key="SqlLogManDmvRepositoryUserName" value="lazyServer" />
<add key="SqlLogManDmvRepositoryPassword" value="qcWa7DCqnN7vqMZ6b9ilzw==" />
<add key="SqlLogManPerfmonRepositoryInstanceName" value="AD01047147" />
<add key="SqlLogManPerfmonRepositoryIP" value="127.0.0.1" />
<add key="SqlLogManPerfmonRepositoryPort" value="1433" />
<add key="SqlLogManPerfmonRepositoryDatabase" value="SqlLogManPerfmonRepository" />
<add key="SqlLogManPerfmonRepositoryIsNtAuthYN" value="N" />
<add key="SqlLogManPerfmonRepositoryUserName" value="lazyServer" />
<add key="SqlLogManPerfmonRepositoryPassword" value="qcWa7DCqnN7vqMZ6b9ilzw==" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
항목 | 설명 |
---|---|
FileLogYN | LazyLog 응용 프로그램의 에러 로그를 남길지 여부, Y일 경우 설치 폴더에 Log 라는 폴더가 생기고 일자 별 아이템 별 로그가 생성됩니다. 수집이 정상화 되면 N으로 바꾸고 프로그램을 재 시작해 로그파일이 서버에 쌓이지 않도록 합니다. |
UsePerfmonYN | LazyLog 응용 프로그램이 성능카운터 수집 여부를 결정합니다. Y 일 경우 성능카운터가 수집되며, N일 경우 SqlLogManManager.dbo.CollectItem 에 Y로 설정되더라도 어떤 아이템도 수집되지 않습니다. |
UseEventmonYN | LazyLog 응용 프로그램이 이벤트로그 수집 여부를 결정합니다. Y 일 경우 이벤트로그가 수집되며, N일 경우 SqlLogManManager.dbo.CollectItem 에 Y로 설정되더라도 어떤 아이템도 수집되지 않습니다. |
UseSqlmonYN | LazyLog 응용 프로그램이 DMV 수집 여부를 결정합니다. Y 일 경우 DMV가 수집되며, N일 경우 SqlLogManManager.dbo.CollectItem 에 Y로 설정되더라도 어떤 아이템도 수집되지 않습니다. |
UseLocalKey | 반드시 Y 이여야 합니다. |
PerfmonItemName | 성능 카운터 저장 데이터베이스(SqlLogManPerfmonRepository) DisplayToID 테이블의 DisplayString 이름입니다. 해당 이름으로 성능 카운터 저장소가 구성하고, 윈도우 성능 카운터로 다시 그림을 그려볼 때 조회할 이름으로 사용됩니다. 기본값은 BaselineCollect 가 사용됩니다. |
SqlLogManManagerInstanceName | 수집 설정 저장소 인스턴스 이름. (프로그램에서 사용되지 않습니다.) |
SqlLogManManagerIP | 수집 설정 저장소 IP |
SqlLogManManagerPort | 수집 설정 저장소 SQL Service Port |
SqlLogManManagerDatabase | 수집 설정 데이터베이스 이름. |
SqlLogManManagerIsNtAuthYN | 윈도우 인증의 경우 Y, SQL 인증의 경우 N 을 입력합니다. (N을 권고합니다.) |
SqlLogManManagerUserName | 수집 설정 데이터베이스의 계정 이름 |
SqlLogManManagerPassword | 수집 설정 데이터베이스의 암호 (실제 데이터베이스에 접근하는 암호가 P@ssw0rd3 이라면 LazyLog.exe 를 이용해 생성한 암호 값 qcWa7DCqnN7vqMZ6b9ilzw== 를 입력해야 합니다. 암호화 관련 오류의 대부분은 계정 별 암호 값을 잘못 적는 경우이거나 암호가 너무 긴 경우입니다.) |
- 나머지 SqlLogManDmvRepositoryXXXX 와 SqlLogManPerfmonRepositoryXXXX는 DMV 결과를 저장할 데이터베이스 와 성능카운터와 이벤트 로그를 저장할 데이터베이스 정보입니다.
Hosts 파일 추가
모니터링 서버에서 모니터 대상 서버로 이름으로 접근 불가능 할 경우 windows/system32/drivers/etc/hosts 파일에 추가해 이름으로 접근 가능하게 합니다. 워크그룹 환경에서 호스트네임 추가는 성능카운터와 이벤트로그 수집에 필수입니다.
모니터 서버에 대상 서버 정보 입력
모니터링 대상 서버를 등록하는 과정입니다. SQLScript하위 폴더에서 L04_TargerServerRegister.sql 을 열고 아래 변수를 수정하고 SQLCMD 모드로 실행합니다.
- SQLCMD 명령어
-- 변수 수정
:setvar ManagerDatabaseName SqlLogManManager
-- 설정이 저장될 데이터베이스 이름
:setvar IdcName NCloud
-- 서버위치 (프로그램에 영향 없음)
:setvar MachineName AD01047147
-- 모니터링 대상 서버 호스트 이름 (원격일 경우 hosts 에 등록해 접근 가능하게 해둘것)
:setvar MachinePublicIp 127.0.0.1
-- 모니터링 대상 아이피
:setvar lazyNtUserName lazyNtUser
-- 성능모니터와 이벤트로그를 읽을 대상 서버에 생성한 윈도우 인증
:setvar lazyNtUserPasswordEncrypted XckO0Pvn7Lq0GjFVAjehhg==
-- 위 계정의 암호 (lazylog.exe 로 암호화 해야 동작합니다. lazylog.exe "P@ssw0rd2" 와 같이 생성)
:setvar NtDomainNameIfNotAdEnvHostname AD01047147
-- AD 환경이면 호스트네임을 제외한 도메인 이름 hostname.adServer.com -> adServer.com 만 입력, workgroup 일 경우 hostname 입력
:setvar FullInstanceName AD01047147
-- 모니터링 대상 SQL 인스턴스 이름 (해당 서버에서 sysservers 의 0번 이름)
:setvar SqlUsername lazyClient
-- 모니터링 대상 SQL 인스턴스에 설정된 SQL admin 계정
:setvar SqlPassword BaQJi8Br/qBUv0lq/F1Z1Q==
-- 위 계정의 암호 (lazylog.exe 로 암호화 해야 동작합니다. lazylog.exe "P@ssw0rd1" 와 같이 생성)
:setvar RoleName 테스트서버
-- 서버 메모 (프로그램에 영향 없음)
:setvar SqlServerMajorVersion 2014
-- SQL 서버의 주 버전 2008, 2012, 2014, 2016 중 한개의 값
:setvar SqlPort 1433
-- 모니터링 대상 서버의 포트
-- 변수 수정 끝
기본 모니터링 등록
SQLScript하위 폴더에서 L05_TargetItemRegisterBasic_01.sql 파일을 열고 아래 변수를 수정하고 SQLCMD 모드로 실행합니다.
-- 변수 수정
:setvar machineName AD01047147
-- MachineName 은 hostname
:setvar FullInstancename AD01047147
--FullInstanceName 은 해당 서버의 select srvname from sysservers where srvid = 0 결과값 입니다
:setvar SqlLogManManagerDatabase SqlLogManManager
-- lazylog 모든 설정이 저장된 매니저 데이터베이스 이름 (모니터링 저장소 데이터베이스)
-- 변수 수정 끝
LazyLog.exe 실행
윈도우 탐색기에서 LazyLog.exe를 더블 클릭 해 실행합니다. 아래는 실행중인 Console 모드 LazyLog.exe 가 정상 실행되는 모습입니다.
기본 모니터링 정상 수집 확인
- 성능카운터
정상 수집이 되는지 확인하기 위해 LazyLog 가 구동되고 난 후 약 2분 후 아래 테이블을 확인합니다.
- SQLCMD 명령어
select * from SqlLogManPerfmonRepository.[dbo].[DisplayToID]
select * from SqlLogManPerfmonRepository.[dbo].[CounterDetails]
select * from SqlLogManPerfmonRepository.[dbo].[CounterData]
아래와 같이 출력되면 정상수집이 되고 있습니다.
- 이벤트로그
정상 수집이 되는지 확인하기 위해 LazyLog 가 구동되고 난 후 약 2분 후 아래 테이블을 확인합니다.
select * from SqlLogManPerfmonRepository.[dbo].[EventLogApplication]
select * from SqlLogManPerfmonRepository.[dbo].[EventLogSecurity]
select * from SqlLogManPerfmonRepository.[dbo].[EventLogSetup]
select * from SqlLogManPerfmonRepository.[dbo].[EventLogSystem
아래와 같이 출력되면 정상수집이 되고 있습니다.
DMV 확인
기본 모니터링이 정상적으로 수행되는지 확인하기 위해 SqlLogManDmvRepository.dbo.sysdatabases_b 테이블 내용을 확인합니다. 이 내용이 정상적으로 수집되어야 확장 모니터링을 등록할 수 있습니다.
- SQLCMD 명령어
select * from SqlLogManDmvRepository.dbo.sysdatabases_b order by probe_time desc
아래와 같이 사용자 데이터베이스 리스트가 보이면 정상 수집이 완료된 것입니다.
확장 모니터링 등록
- 사용자 데이터베이스 정보 확인 및 복사
확장 모니터링은 기본 모니터링 항목 중 바로 위에서 확인한 sysdatabase가 정상 수집 되어야 수집 가능합니다. SQLScript하위 폴더에서 L06_TargetItemRegisterAdvanced_01.sql 파일을 열고 아래 변수를 수정 후 SQLCMD 모드로 실행하면, 사용자 데이터베이스 정보를 SqlLogManManager.dbo.MachineSqlDatabase에 입력하게 됩니다.
- SQLCMD 명령어
-- 변수 수정
:setvar machineName AD01047147
-- 모니터링 대상 hostname
:setvar SqlLogManManagerDatabase SqlLogManManager
-- lazylog 모든 설정이 저장된 매니저 데이터베이스 이름 (모니터링 저장소 데이터베이스)
:setvar SqlLogManDmvRepositoryDatabase SqlLogManDmvRepository
-- DMV 수집 정보가 저장될 데이터베이스 이름
-- 기본 아이템 수집에서 sysdatabases 가 수집되어야 정상 등록이 가능합니다.
-- 변수 수정 끝
정상적으로 수행되면 아래와 같은 출력이 나옵니다.
- 확장 모니터링 등록 스크립트 생성
SQLScript하위 폴더에서 L06_TargetItemRegisterAdvanced_02.sql 파일을 열고 아래 변수를 수정 후 SQLCMD 모드로 실행합니다.
- SQLCMD 명령어
-- 변수 수정
:setvar machineName AD01047147
-- 모니터링 대상 hostname
:setvar SqlLogManManagerDatabase SqlLogManManager
-- lazylog 모든 설정이 저장된 매니저 데이터베이스 이름 (모니터링 저장소 데이터베이스)
-- 변수 수정 끝
정상 수행이 되면, 실행할 스크립트다 출력됩니다.
생성된 스크립트 중 “실행할 스크립트”라고 된 스크립트 2개 세트를 SSMS에서 실행합니다.
- 확장 모니터링 스크립트 활성화
SQLScript하위 폴더에서 L06_TargetItemRegisterAdvanced_04.sql 파일을 열고 아래 변수를 수정 후 SQLCMD 모드로 실행합니다.
- SQLCMD 명령어
-- 변수 수정
:setvar machineName AD01047147
-- 모니터링 대상 hostname
:setvar FullInstanceName AD01047147
--FullInstanceName 은 해당 서버의 select srvname from sysservers where srvid = 0 결과값 임
:setvar SqlLogManManagerDatabase SqlLogManManager
-- lazylog 모든 설정이 저장된 매니저 데이터베이스 이름 (모니터링 저장소 데이터베이스)
-- 변수 수정 끝
LazyLog.exe 재 시작
확장 모니터링 항목을 수집하기 위해 Console LazyLog.exe를 재시작 합니다.
(Console 어플리케이션 종료 및 시작)
확장 모니터링 정상 수집 확인
기본 모니터링이 정상임을 확인하고 확장 모니터링이 정상인지 확인할 경우 sp_spaceused_b 가 정상 수집되면 모든 수집이 정상입니다.
- SQLCMD 명령어
select * from SqlLogManDmvRepository.dbo.sp_spaceused_b order by probe_time desc
아래와 같이 db_name 별 테이블사이즈가 정상 출력이 되면 모든 수집이 정상적입니다.
윈도우 서비스로 설치
콘솔 모드에서 모든 설정이 완료되면, LazyLogService.zip 파일을 압축 해제하고 간단하게 Setup.exe 를 실행하고 [Next] 를 클릭해 설치를 완료합니다. (윈도우 서비스로 LazyLog를 구동할 경우, 한 개의 서비스만 구동 가능하므로 다수의 LazyLog를 구동해야 한다면, Console 모드로 사용합니다.)
C:\Program Files\Naver Business Platform\SQL Server Log Collector
폴더의 LazyLog.exe.config 파일 중 appSettings 부분만 이전에 셋팅한 Console 어플리케이션의 appSettings 설정을 복사해 넣습니다.
cmd 프롬프트에서 net start “SQL Server Log Collector” 을 입력해 서비스를 시작하거나, services.msc 에서 SQL Server Log Collector를 시작합니다.
서비스로 구동할 경우 모니터링 서버가 다시 시작 되어도 자동으로 수집을 시작합니다.
모든 수집이 정상이면, FileLogYN 설정을 N으로 설정하길 권고합니다.
설치 문제 해결
MSSQL 로그 수집기(LazyLog) 설치 문제 해결을 위한 가이드
문제 해결
문제 해결에서는 예제와 같은 계정으로 설정했다고 가정하고 살펴본다. 다른 문제는 Log 파일을 참고해 해결하기 바라며, 대부분의 오류는 계정을 잘못 설정하거나 TCP 445 포트가 ISP 사업자에 의해 막힌 경우였으며, 이 경우 성능 카운터와 이벤트 로그 데이터를 수집할 수 없었다. 이 경우 차단된 포트를 쓰지 않도록 수집 프로그램 위치를 변경하면 됩니다.
Machine 테이블
- WorkGroup 서버
AD01047147 이라는 호스트명을 가지는 모니터링 서버가 있다면
windows/system32/drivers/etc/hosts 에 host를 alias로 등록합니다.
Ping 과 Telnet 등으로 1433 모니터링 SQL Server 에 접근이 되는지 테스트 합니다.
MachineName에 AD01047147을 기입하고, NtDomain에도 동일하게 AD01047147를 입력합니다.
NtUserName에 lazyNtUser를 입력합니다.
NtPassword에 암호화된 암호를 적습니다. (lazylog.exe 를 통해 암호를 암호화 해 적습니다.)
IsEnabledYN 이 Y 인지 확인
- Active Directory 서버
- 모니터링 대상 호스트가 mhv1.minsouk.com 서버가 있다면
- NtDomain 에 minsouk.com 만 적습니다. (hostname 은 제외)
- MachineName 에 mhv1[호스트이름만] 기입하면 됩니다.
(슬래시 @ 등의 다른 내용이 들어가면 안 됩니다.) - NtUserName 에 lazyNtUser 나 모니터링 아이디를 적습니다. (도메인 명 제외)
- NtPassword 에 위 계정의 암호를 lazylog.exe를 통해 암호화한 값을 적습니다.
- IsEnabledYN 이 Y 인지 확인
MachineSqlInstance 테이블
SQL 서버가 기본 인스턴스라면, MHV1만 입력하고, 명명된 인스턴스로 설치되었다면 FullInstacneName을 모두 입력합니다. (MHV1\SQL2016 와 같이 입력되면 됩니다.)
DMV 항목 등을 CollectItem 에서 IsNtAuthYN 값이 Y 일 경우는 Machine 에 기록된 NtUserName과 NtPassword값을 이용해 접근하고, N일 경우는 MachinePublicIp 와 PortDefault 를 이용해 접근합니다.
IsEnabledYN 이 Y인지 확인합니다. 아래 그림을 참조해 수정합니다.
위 설정 중 1번 MachineId 는 WorkGroup 서버이고, 6번 MachineId 는 ActiveDirectory 서버의 설정입니다. LazyLog 는 위 정보를 기반으로 가장해 윈도우 성능카운터, 이벤트로그, DMV를 읽어옵니다.
내부 ConnectionString 생성 로직
워크 그룹 환경에서 DMV 수집을 위해 대상서버에 호스트 이름으로 Ping 이나 telnet으로 1433 포트가 정상 동작 하는지 살펴봐야 합니다(사용자 지정 포트일 경우 해당 포트 확인). 성능 카운터와 이벤트로그 수집을 위해 Ping 이나 445 포트가 정상 동작 하는지 확인 되어야 합니다.
계정 별 접근 테스트
- lazyServer
lazylog.exe.config 에 설정되며, 수집된 데이터를 저장할 SQL Server 에 계정과 권한이 설정 되어야 합니다.
- SQL Server 계정으로 저장소 데이터베이스에 접근 가능해야 합니다. (lazyLog.config.XML 에 설정) SSMS 나 SQLCMD로 테스트를 수행할 때는 lazyServer 계정이 암호화 되기 전 암호값으로 lazyLog.exe 프로그램이 동작하는 컴퓨터에서 SqlLogManManager 데이터베이스가 있는 SQL Server 에 로그인이 되는지 확인합니다. (IP,Port 정확하게 테스트)
- lazyServer 가 sysadmin 이나 dbo 권한을 가지고 있는가?
- lazyClient
MachineSqlInstance 에 설정되며, 수집 대상 SQL Server 에 계정과 권한이 설정 되어야 합니다.
- SQL Server 계정으로 모니터링 대상 서버에 SSMS 나 SQLCMD 프로그램으로 해당 서버에 접근이 가능한가? (lazyClient 계정은 SqlLogManManager 데이터베이스의 Machine 과 MachineSqlInstance 정보로 대상 서버에 접근합니다. SSMS 에서 테스트할 때는 암호화 하기 전 값으로 입력해야 합니다.)
- lazyCliecnt 가 sysadmin 권한을 가지고 있는가?
- lazyNtUser
Machine 테이블에 설정되며, 대상 컴퓨터에 계정과 권한이 설정 되어야 합니다.
성능 카운터와 이벤트로그를 읽기위해 사용됩니다. (SQL 인증은 허용되지 않습니다.)
설정한 암호가 정확한지 수집 대상 서버에 Administrator 로 로그인 해 Runas 명령어로 다음과 같이 실행합니다.
runas /user:lazyNtUser cmd.exe
cmd 창이 정상적으로 lazyNtUser 로 시작되면 암호는 정확합니다.
lazyNtUser 의 권한을 확인 합니다. 대상 서버에 설정되어야 할 권한은 아래와 같습니다.
계정항목 확인
L07_FullCollectItemStatus.sql 내용을 기준으로 아래 쿼리를 실행하고, IsEnabledYN 에 모두 Y 인가?
원격 수집을 위한 포트 및 서비스 확인
- WorkGroup 서버
- 워크그룹일 경우 대상 서버에 lazyNtUser 의 암호와 동일하게 lazyNtUser를 lazylog.exe 가 동작하는 서버에 계정과 암호를 같게 생성하고 해당 계정으로 윈도우 로그인을 합니다.
- 실행에서 Perfmon 을 수행합니다.
- 카운터 추가 메뉴에서 다음 컴퓨터에서 카운터 선택란에 수집대상 IP 를 입력합니다.
- 원격 컴퓨터의 성능 카운터 수집이 정상적으로 되는지 확인합니다.
- Active Directory 서버
- 실행에서 Perfmon 을 수행합니다.
- 원격 컴퓨터의 성능 카운터 수집이 정상적으로 되는지 확인합니다.
- 방화벽
- 동일 IDC 내에서 방화벽이 없는 환경에서 테스트 하거나, 동일 네트워크 환경에서 테스트 해보고 동작하는지 테스트 합니다.
- RPC 포트가 막혀 있을 경우, 수집 프로그램을 방화벽 안쪽에 위치시키고 수집 결과만, 외부 SQL Server를 지정하는 것도 좋은 방법입니다.
- 네트워크 패킷 분석 프로그램을 대상 컴퓨터와 수집 컴퓨터 양쪽에 트레이스를 걸고 RPC 445포트가 정상인지 모니터링 합니다.
- 네트워크 패킷 분석 프로그램을 대상 컴퓨터와 수집 컴퓨터 양쪽에 트레이스를 걸고 TCP 1433포트가 정상인지 모니터링 합니다.
- 모니터링 대상 서버의 필수 서비스
- Remote Registry 서비스가 활성화 되어 있는가?
- Remote Procedure Call(RPC) 서비스가 활성화 되어 있는가?
- SQL Server
- sp_readerrorlog 에 어떤 오류가 있는지 확인합니다.
- 프로파일러나 확장 이벤트로 쿼리와 에러를 확인합니다.
활용 예
MSSQL 로그 수집기(LazyLog) 활용 예시
DMV 데이터 활용 예시
아래 대시보드는 위 LazyLog 수집 데이터를 이용해 단순히 그래프화 한 것입니다. 대시보드나 그래프를 그리기 위해 Excel 이나 다양한 대시보드 툴이 이용될 수 있습니다.
AG 모니터링
아래 그림은 SQL Server 고가용 솔루션인 AlwaysOn 모니터링을 구성한 예입니다. 아래 그림1의 스택 차트는 스택 별 개별 서버를 의미하며, 현재 Primary 서버의 Queue 에 쌓여있는 용량, Primary 에서 Secondary 로 보내는 속도, Secondary Queue Redo 에 쌓여있는 용량, Secondary Redo반영 속도를 각각 표현합니다.
중앙 붉은색 박스를 살펴보면, 한 개 서버의 로그 적용이 정지된 상태를 모니터링 할 수 있습니다. 이 경우 보조서버로 모든 로그가 전송된 상태로 모니터링 되었고 적용만 정지되거나 매우 느린 것으로 보입니다. 이 경우
보조서버를 재 시작해 문제를 해결한 경우입니다. 이 문제를 모니터링 하고 있지 않고 계속 서비스를 했다면, 최악의 경우 AG를 재구성해야 하는 상황이 되었을 수 있습니다. (보조 서버에서 로그 적용은 동작중인 상태와 재시작시 조금 다른 로직으로 디자인 되어 있고, 재시작으로 로그 적용을 하면 더 빠르게 적용 할 수 있습니다.) LazyLog 에는 dm_hadr_database_replica_states_b 테이블에 아래 정보가 20초 단위로 모니터링 되고 있습니다.
서버 리소스 사용률 모니터링
아래 그림은 같은 그룹의 서버를 모니터링 하며, CPU, BatchRequests/Sec, Memory 상황과 네트워크 전송율을 한번에 모니터링 하도록 구성한 페이지의 예입니다. 평소와 다르게 동작하는 서버가 있다면 즉시 발견 가능합니다. LazyLog 에는 성능카운터 정보가 15초 단위로 기록되어 있습니다.
쿼리 리소스 사용량 검증
아래 그림은 같은 역할을 수행하는 2대의 서버를 대상으로 쿼리 모니터링을 한 예입니다. 같은 역할을 수행하는 데이터베이스이므로 쿼리도 비슷하게 유입되고 CPU WorkerTime 도 비슷해야 합니다. 그런데 특정 시간대에 한 서버에서 특정 쿼리만 리소스 사용량이 높아진 것을 바로 인지 가능한 경우입니다.
중앙 버블 차트는 X축은 수행 회수, Y 축은 WokerTime 입니다. 쿼리를 보고 특정 시간대 어떤 쿼리가 가장 리소스를 많이 소모하는지 즉시 알 수 있습니다.
LazyLog 의 dm_exec_query_stats2_b_summary 에는 1분 단위 쿼리별 리소스 사용량이 상세히 기록되어 있습니다.
잠금 모니터링
아래는 잠금을 모니터링 한 예입니다. 서버에서 잠금이 생기면 잠금의 원인 쿼리는 무엇이고 대기하는 쿼리가 어떤 쿼리인지 즉시 알 수 있습니다. LazyLog
의 sp_lock2_b 에는 10초 단위 잠금 모니터링이 쿼리와 함께 상세히 기록되어 있습니다. OLTP 환경에서 잠금 모니터링이 중요하다면 수집 간격을 적절하게 조절합니다. (3초 권장)