[PMM] #130 MySQL 모니터링 – 실시간 모니터링#1

MySQL 모니터링 실시간 모니터링


MySQL서버의 모니터링 요소(factor)는 상당히 다양하다. 이 모니터링 요소 중에서 매우 짧은 시간(최근 5분에서 10)동안의 변화를 실시간으로 봐야하는 상황이 있을 수 있다. 예를 들면, 쇼셜커머스 서비스에서 사용자 유입량이 특정 시각부터 급증(특정 인기상품 할인 프로모션이 시작되는 시각)하는 상황이 바로 그렇다. 더욱이 이러한 서비스 DB1개의 MySQL서버로만 서비스하지 않고 DB 트래픽 분산을 위하여 여러 대의 MySQL 서버 샤드로 구성하기도 한다. 이땐, 모든 MySQL 성능 지표를 모니터링하는 것 보다는 실시간으로 급증, 급감하거나 또는 정상적인 쿼리 실행에 영향을 줄 수 있는 락 등의 4~5개의 중요한 성능 지표만 모니터링 하는 것이 유리하다.
이번 장에서는 CPU Usage, QPS, Threads, Locks, Handlers 5개의 그래프를 실시간 모니터링 그래프로 선택하여, 여러대의 호스트를 한 화면에서 5개 그래프를 실시간으로 볼 수 있는 대시보드를 만들어 본다.

이전 포스팅에서 Percona Dashboard를 설치했으므로, 그래프를 생성할 땐 Percona Dashboard의 대시보드 설정과 그 그래프들을 복사하여 간편하게 생성한다.


010. MySQL 실시간 모니터링 대시보드 생성

메뉴 > Dashboards > [+ New] 클릭하면 다음과 같이 새로운 대시보드가 생성된다.



대시보드 설정값 세팅을 위하여 대시보드 관리(메뉴바 톱니바퀴버튼) > Settings 를 클릭한다. General(일반설정) 탭에 다음과 같이 대시보드의 이름과 태그 등을 입력해준다.




대시보드 설정 값의 변경사항은 별도의 저장버튼을 클릭해야 한다. 메뉴바의 플로피 디스켓 모양의 버튼이 저장 버튼이다. 저장 버튼을 클릭하여 다음과 같이 저장한다.




대시보드 관리(메뉴바 톱니바퀴버튼) > Templating 을 클릭한다. 대시보드의 형판을 설정하는 단계이다



[+New] 버튼을 클릭하여 다음과 같이 Interval 변수를 설정한다. 입력시 대소문자를 확실히 구분하여 Name:interval, Label:Interval 과 같이 입력하고, 다른 입력값들은 다음의 이미지와 같이 입력한다. 입력이 끝났으면 반드시 ADD 버튼을 클릭한다.




interval 변수가 정상적으로 설정되었으면 Variables탭에 다음과 같이 $interval 이라는 변수값이 생성됨을 확인할 수 있다. 그리고 하단의 대시보드에 “Interval: 5s”라는 드롭다운 버튼이 생성되었다면 추가가 잘 된것이다.




[+New] 버튼을 한번 더 클릭하여 다음과 같이 Host 변수를 설정한다. 입력시 대소문자를 확실히 구분하여 Name:host, Label:Host 와 같이 입력하고, 다른 입력값들은 다음의 이미지와 같이 입력한다. 입력이 끝났으면 반드시 ADD 버튼을 클릭한다.




host 변수가 정상적으로 설정되었으면 Variables탭에 다음과 같이 $host 라는 변수값이 생성됨을 확인할 수 있다. 그리고 PMM에서 모니터링하는 대상 MySQL 서버들의 호스트들이 대시보드에 드롭다운 버튼으로 생성된다. 이 호스트 이름들은 PMM Client - Mysqld Exporter 설치편에서 PMM Server prometheus.yml 파일에 설정한 PMM Client의 노드정보 중 alias: “pmmclient:3306” 참조하는 리스트이다.




잊지 않고 반드시 저장한다.



저장했으면 X버튼을 클릭하거나, 다시 Home 대시보드로 갔다가 MySQL모니터링-실시간모니터링 대시보드를 클릭한다. 그럼 Interval Host 드롭다운 박스가 생성된다.



센스가 있는 독자분이라면 이 두 변수가 어떤 것을 의미하는 것인지 알 수 있을 것이다. Interval은 이 대시보드에 추가할 그래프의 수치를 얼마의 간격을 두고 표시할 것인지, 그 간격의 시간을 변경할 수 있는 변수이다. 그리고 Host는 이 대시보드에 추가할 그래프의 표시 대상이 어떤 모니터링 대상 서버를 가리키는지 호스트를(복수선택가능) 선택하는 변수이다.



020. CPU Usage 그래프 생성
앞서 생성한 “MySQL모니터링-실시간모니터링대시보드에 CPU Usage그래프를 추가해본다.
그래프를 생성할 때 그래프의 모든 지표를 일일이 수동으로 설정하지 않고, Percona Dashboard에 이미 설정되어있는 그래프의 JSON 포멧 패널 정보를 그대로 복사하여 붙여넣는(ctrl+c, ctrl+v) 방법으로 간단하게 생성하는게 포인트이다.

먼저 새 브라우저 창을 띄워 “System Overview | Percona App” 대시보드로 이동한다. CPU Usage 그래프의 그래프 타이틀 부분을 마우스 좌 클릭하면 그래프 메뉴가 나타난다. 여기서 “Panel JSON”을 클릭한다.




“Panel JSON”을 클릭하면 이 그래프의 패널정보를 JSON 포멧으로 직접 확인할 수 있다. JSON 포멧을 모두 선택하여 복사(ctrl+c)해 둔다. 또는 임의의 텍스트 에디터를 열어서 잠시 에디터에 붙여 둔다




다시 “MySQL모니터링-실시간모니터링대시보드로 돌아가서,  첫 행의 행 메뉴를 클릭하여 Add Panel > Graph를 클릭하고 1행에 신규 그래프를 생성한다.




이 대시보드에 그래프를 생성할 땐, Host 드롭 박스는 1개의 호스트만 선택하여 진행한다. 다음과 같은 신규 그래프 생성 화면에서 그래프 타이틀을 마우스 좌 클릭하여 Panel JSON 버튼을 클릭한다.





다음과 같이 신규 그래프의 패널 정보 JSON 편집 창이 나타난다. JSON을 모두 삭제하고 복사해 두었던 “System Overview | Percona App” 대시보드 CPU Usage 그래프의 JSON 정보를 통째로 붙여넣기(ctrl+v)한다. 그리고 반드시 Update 버튼을 눌러서 갱신한다.




그럼 다음과 같이 CPU Usage그래프가 바로 생성된다.




이 대시보드의 기본 Time Range 6시간으로 설정되어 있어, 초기 그래프의 로딩이 다소 오래 걸릴수 있다. 대시보드의 Time Range값을 편의상 최근 5, 5초마다 새로고침(refresh)되도록 변경해보자.




이 대시보드의 용도는 실시간 모니터링이므로 CPU Usage 상세 값을 직접 보여주는 테이블은 노출하지 않도록 설정한다. 그래프 설정에서 Legend 탭의 Options > Show 항목을 체크 해제 한다




이번에는 General 탭의 Title에 선택한 호스트명이 노출되도록 Title : “[$host] CPU Usage”과 같이 변수을 추가한다. 추가하면 현재 Host 드롭 박스에서 선택한 호스트명이 자동으로 함께 노출된다.




X 버튼을 눌러서 그래프 편집화면을 빠져나오면 대시보드에 다음과 같이 CPU Usage그래프가 보일것이다



대시보드 메뉴의 저장(플로피 디스켓) 버튼을 눌러, 잊지 말고 대시보드 전체를 꼭 저장한다.

-       Interval : 그래프에서 보여주는 각 metric의 시간 간격을 선택할 수 있다.
-       Host : 선택한 호스트의 CPU 사용량을 확인할 수 있다.

Interval을 최대 5초까지 줄일수롤 5초간의 CPU Usage로 그래프를 자세히 보여준다. 반면에 Interval을 크게 잡는다면 그 만큼 CPU Usage의 상세함은 떨어지게 된다



030. Host 별 행단위 노출 설정
대시보드를 처음 설정할 때 Host 변수의 유형을 중복 체크가 가능하도록 설정하였다. 허나, 이 부분에서 Host를 여러 개 선택하거나 ALL을 선택한다면 CPU Usage 그래프가 제대로 보이지 않을 것이다. Host를 복수 선택이 가능하게 설정한 이유는 단일 그래프에서 여러 호스트의 지표를 한 번에 보여주기 위함이 아니다
선택한 호스트별로 한 행씩 보여주도록 설정한 것이다.

행 설정 메뉴에서 Row editor를 클릭한다.




행 설정(Row Settings) 화면에서 Templating options를 다음과 같이 Repeat Row host로 설정하고 X버튼을 눌러 대시보드로 돌아온다.



Host 드롭 박스에서 여러 호스트를 선택하면 다음과 같이 호스트별로 1행씩 그래프가 반복되어 나타난다. 그래프 타이틀에 $host변수를 추가하여 선택한 호스트명이 보이게 하고, 호스트 드롭 박스에서 복수 호스트를 선택할 수 있도록 설정한 이유가 바로 이렇게 행 단위 호스트 별 뷰를 보기 위함이다.



최종적으로 대시보드 메뉴의 저장(플로피 디스켓) 버튼을 눌러, 잊지 말고 대시보드 전체를 꼭 저장한다.



040. QPS / Handlers / Threads / Table Locks 그래프 생성
CPU Usage와 동일한 방법으로 “MySQL모니터링-실시간모니터링대시보드의 1행에 아래 그래프를 추가한다. 신규 추가하는 각 그래프의 JSON 패널 정보를 복사할 그래프는 다음과 같다.

- QPS : MySQL Overview | Percona App - Top Command Counters
- Handler : MySQL Overview | Percona App - MySQL Handlers
- Active Threads : MySQL Overview | Percona App - MySQL Active Threads
- Table Locks : MySQL Overview | Percona App - MySQL Table Locks
- Thread Cache : MySQL Overview | Percona App - MySQL Thread Cache

그래프를 추가할 땐, 1개의 호스트만을 선택하여 그래프를 추가하고, 추가하는 그래프의 개수에 따라 그래프 폭을 적절히 변경한다. 1행의 전체 폭(Span) 12이다. 각 그래프별 폭은 그래프 설정탭의 General > Span 값을 2로 설정하면 된다.



“Active Threads” 그래프와 “Thread Cache” 그래프의 지표는 하나의 그래프로 묶어서 보여줘도 크게 무리가 없기에 하나의 그래프로 두 그래프 지표를 합쳐본다.

먼저 Thread Cache 그래프 메뉴에서 Duplicate버튼을 클릭하여 같은 그래프를 복사해둔다




별도의 브라우저 창을 하나 더 띄워서 Active Threads 그래프 설정으로 집입하여 Metrics 탭의 Query, Legend format을 복사한다




원래창에서 복사한 Thread Cache 그래프의 설정으로 진입하여 Metrics 탭의 하단에 있는 [+Add query] 버튼을 두번 클릭하면 아래의 D/E 메트릭 행이 추가된다. 이 메트릭정보에 Active Threads A/B 메트릭 값(Query, Legend Format )을 복사하여 추가한다. 그럼 다음과 같이 추가한 두개의 메트릭도 함께 그래프에 표시된다.




Active Threads 그래프와 Thread Cache그래프를 하나의 그래프로 합쳐 만든 새로은 그래프이므로 다음과 같이 General 탭의 Title [$host] Threads 라고 이름을 수정한다.



그리고 Display 탭의 Fill 값을 0으로 변경하여 그래프 하단의 음영처리를 하지 않는 그래프로 변경한다.




X 버튼을 눌러 그래프 설정 화면에서 빠져나오면 다음과 같이 “Threads” 그래프가 잘 추가되었음을 확인할 수 있을 것이다.




원래 있었던 Active Threads, Thread Cache 그래프는 각 그래프 메뉴의 쓰레기통 모양의 버튼을 클릭하여 삭제해준다.




모든 설정을 마치면 다음과 같이 CPU Usage, QPS, Threads, Locks, Handlers 그래프를 5분단위의 5초갱신으로 볼 수 있다.






물론 Host 드롭 박스에서 여러 호스트를 설정하면 복수의 행에 선택한 호스트들의 그래프도 함께 볼 수 있다.



최종적으로 완성한 이 MySQL 실시간 모니터링 대시보드는 아직 저장되지 않은 상태이다. 잊지 말고 반드시 대시보드의 저장버튼을 눌러 저장한다.







[PMM] #120 Coffee Break


Coffee Break

{PMM] 이라는 이름으로 11개의 포스팅을 통해서 PMM의 플랫폼을 설치했고, 최종 목적인 MySQL 서버 모니터링 환경(모니터링 정보 수집, 대시보드 구성 등)을 구성해 보았다. 주요 모듈(Prometheus, Grafana, node/mysqld exporter )에 대한 상세한 구조와 원리에 대한 설명보다는 실행(Action)에 중점을 두어 설명했으므로, 여기까지 잘 따라해 보았다면, 잠시 쉬어가자.

지난 포스팅을 쭈욱 살펴보는것도 괜찮다.

[PMM] #010 PMM Tutorial for MySQL Monitoring
[PMM] #020 PMM (Percona Monitoring and Management)
[PMM] #030 PMM Server - Client 서버 정보
[PMM] #040 PMM Server - Prometheus 설치
[PMM] #050 PMM Client - Node Exporter 설치
[PMM] #060 PMM Client - Mysqld Exporter 설치
[PMM] #070 PMM Server - Grafana 설치
[PMM] #080 PMM Server - Grafana/Prometheus 데이터소스 연동
[PMM] #090 PMM Server - Percona App for Grafana 설치
[PMM] #100 Percona Dashboard - 리눅스 모니터링
[PMM] #110 Percona Dashboard - MySQL 모니터링



그리고 본 포스팅시리즈를 읽고 있는 독자들이 갖고 있을지도 모르는 몇가지 의아한 점에 대해서 간단히 언급해본다.



010. PMM 관련 포스팅을 왜 시작했나요?
- 한글 매뉴얼이 없음.
- 인터넷 검색을 해봐도 한글로 포스팅한 자료를 찾을 수 없음. 없는 듯 함.


020. PMM을 설치할 때 왜 Docker 이미지가 아니라 각각의 모듈별로 따로 설치하나요?
- Docker가 익숙치 않은 독자들을 위함.
- PMM을 구성하는 모듈의 개별 버전 업데이트가 빠르게 announce되고 있다. 개별 모듈별로 설치하므로써, 아직 실험적인 모듈들은 나중에 안정화 버전이 나오면 설치하고 싶다.
- PMM의 기능 중에서 꼭 필요한 기능만 사용하고 싶기 때문에.
- 각각의 모듈을 설치해보고 연동하는 과정은 생각보다 간단하기에 독자가 이해하고 실습하기에 더 적절할 것이라고 생각함.


030. PMM 아키텍쳐에는 Query Analytics, Ochestrator, Proxy Exporter 등의 모듈들이 있던데, 이 모듈들의 설명이나 설치에 관련한 내용은 왜 없나요?
- Query Analytics : 추후, 포스팅 하고 싶음. 아직까지는 시간적인 여유가 없기에.
- Ochestrator : 아직 실험적인 툴. 나중에 안정화 버전이 나오면 PMM과는 별도로 테스트해 보고 공유하고 싶음.
- Proxy Exporter : ProxySQL 관련 포스팅은 별도로 진행 예정.


040. Percona Dashborad TokuDB Metrics 대시보드는 언급하지 않고 건너뛴 이유가 있나요?
MySQL 서버를 사용하는 시스템에서 TokuDB 엔진에 비하여 InnoDB 엔진을 사용하는 것이 아직은 일반적이라고 생각하고 있다. 물론 Toku 엔진을 상용서비스( Production환경)에서 사용하고 있는 시스템이 없지는 않을 것이라 예상한다. “보편적으로 더 많이 사용하는 것들에 대한 모니터링하는 것을 먼저 언급하는 것뿐이다. Toku엔진, Galera Cluster, MyISAM 엔진 등에 대한 모니터링 지표도 기회가 되면 꼭 포스팅 하고 싶다


050. 리눅스 모니터링, MySQL 모니터링 지표 설명이 너무 간단한 것 같다. 실제로 MySQL 모니터링 지표를 성능 관점의 튜닝 등을 위하여 자세히 설명하거나 다양한 케이스를 예를 들어 설명해줄 수 없나요?
가장 공유하고 싶은 내용이다. 하지만 이 내용은 매우 자세하고 다양한 케이스를 언급해야 하는데 내용도 많고, 튜닝 케이스 재연이 필요하므로 포스팅에 오랜 시간이 필요하다. 이 내용도 나중에 기회가 된다면


060. 다음 PMM관련 포스팅 내용에는 어떤 것들이 있을지 미리 알려주세요.
다음 포스팅 내용을 미리 공유하자면 간단히 다음과 같다.

MySQL 실시간 모니터링
MySQL
모니터링 지표 중 실시간으로 조회하는 것이 의미있는 그래프로 구성하는 대시보드 만들기..
- [PMM] #130 MySQL
모니터링 - Realtime#1
- [PMM] #140 MySQL
모니터링
- Realtime#2

MySQL
일별 모니터링
MySQL
모니터링 지표 중 일별로 조회하는 것이 의미있는 그래프로 구성하는 대시보드 만들기
- [PMM] #150 MySQL
모니터링 - Daily#1
- [PMM] #160 MySQL
모니터링
- Daily#2


MySQL 모니터링 알림
Prometheus
Alert Manager를 설치하여 MySQL 모니터링 지표 중 특정 지표의 상태 변경시 알림(이메일 등) 기능 연동
- [PMM] #170 MySQL
모니터링 - 알림-Prometheus Alertmanager 설치
- [PMM] #180 MySQL
모니터링 - 알림
-Replication Stop

MySQL
데이터 모니터링
MySQL 성능 지표가 아닌 MySQL 서버의 특정 테이블들에 대한 SQL 질의 결과를 Prometheus에 저장하고 이를 대시보드로 구성.
- [PMM] #190 MySQL
모니터링 - 데이터모니터링#1-mysqlexporter 설치
- [PMM] #200 MySQL
모니터링 - 데이터모니터링#2-대시보드구성













[PMM] #110 Percona Dashboard – MySQL 모니터링

Percona Dashboard – MySQL 모니터링

Percona Dashboard에서 조회할 수 있는 MySQL 모니터링 지표는 앞서 연동한 mysqld exporter가 주기적으로 수집하여, Prometheus가 주기적으로 가져와(scraping) 저장하고 있는 정보(metric)를 조회하는 것이다.
MySQL 모니터링 지표에 대한 대시보드는 MySQL Overview, MySQL InnoDB Metrics, MySQL Table Statistics, MySQL User Statistics, MySQL Replication 등이 있다. 이 지표들은 mysqld exporter로부터 수집한 MySQL 서버의 전역 변수(Global Variables)와 전역 상태 정보(Global Status) 등의 주요 지표들을 시간별, 기간별로 보여준다.

본 장에서는 MySQL Overview, MySQL InnoDB Metrics, MySQL Table Statistics, MySQL User Statistics, MySQL Replication 다섯 개 대시보드의 주요 그래프에 대해서 간단히 알아보자.


010. MySQL – MySQL Overview
MySQL Overview는 모니터링 대상 MySQL 서버의 주요 모니터링 지표를 보여준다.

- Connections, Active Thread, Thread Cache .
MySQL 서버의 커넥션과 스레드의 상태별 수, 스레드 캐시 사용량 등을 보여준다.




- Top Command Counter/Counter Houry, Handlers
MySQL 서버에서 실행되는 SQL의 유형별 실행 횟수 상위 5 SQL 유형 실행 횟수(초당)를 보여준다(Top Command Counters). 또한 최근 24시간 동안의 유형별 SQL 실행횟수를 시간당 누적 횟수로도 보여준다(Top Command Coounters Hourly). MySQL Handler 그래프는 MySQL서버의 주요 핸들러의 초당 사용량을 보여준다.



020. MySQL – MySQL InnoDB Metrics
MySQL 서버에서 사용하는 InnoDB 엔진과 관련된 성능지표를 나타낸다.

- InnoDB Buffer Pool Size, InnoDB Row Operations .
InnoDB 버퍼 풀의 전체크기와 실제 물리 메모리에서 InnoDB 버퍼 풀의 용량이 차지하는 비율, InnoDB 버퍼 풀의 초당 행 읽기/쓰기 횟수 등의 지표등을 보여준다.


- InnoDB Buffer Pool Content, Pages, I/O
InnoDB 버퍼 풀에 적재되어 있는 데이터 량(크기, 페이지 수)와 아직 디스크로 플러시 되지 않은 데이터 량을 보여준다. 또한 InnoDB 버퍼 풀의 읽기/쓰기 페이지 수, 읽기/쓰기 요청 횟수 등을 보여준다.




030. MySQL – MySQL Table Statistics
MySQL Table Statistics 대시보드는 MySQL 서버의 모든 테이블에 대한 간략한 통계정보(테이블 크기, 행 읽기 횟수 등)를 보여준다.

- Table Size
mysqld expoter 프로세스를 실행할 때, “-collect.infor_schema.tables=true” 옵션을 추가하여 실행하면 테이블 관련 통계정보를 수집한다. 이 테이블 통계 정보는 MySQL 서버의 information_schema 데이터베이스의 tables 테이블에 저장된 통계정보를 수집하는 것이다.
전체 데이터베이스 크기, 데이터베이스별 크기 상위 5, 테이블별 크기 상위 5개 등의 사이즈 정보를 보여준다.



- Table Activity
mysqld expoter 프로세스를 실행할 때, "-collect.infor_schema.tablestats=true" 옵션을 추가하여 실행하면 해당 통계정보를 수집한다. 이때, 모니터링 대상 MySQL 서버의 전역 변수(Global Variables) 중 사용자 통계정보 수집 기능을 사용 중이어야 한다(userstats=1). MySQL의 클론 DB MariaDB Percona Server에서만 사용할 수 있는 기능이다.
Table Activity 항목의 그래프는 읽은 행의 수, 변경 행의 수가 많은 상위 5개 테이블의 행 읽기 수, 변경 행의 수 등의 테이블 관련 모니터링 지표를 보여준다.


Top Tables by Auto Incremeht Usage 그래프는 auto_increment 속성의 컬럼의 최대 값 대비 현재 값을 백분율로 보여준다.
이 지표는 mysqld expoter 프로세스를 실행할 때, "-collect.auto_increment.columns=true " 옵션을 추가하여 실행해야 해당 통계정보를 수집한다






040. MySQL – MySQL User Statistics
MySQL Table Statistics 대시보드는 MySQL 서버의 유저들에 대한 간략한 통계정보(유저별 접속 횟수, 유저별 CPU사용시간, 유저별 행 추출/변경 휫수 등)를 보여준다. 이 지표들은 mysqld expoter 프로세스를 실행할 때, "-collect.infor_schema.userstats=true" 옵션을 추가하여 실행해야 해당 통계정보를 수집한다.
MySQL Table Statistics 대시보드의 Table Activity 항목의 그래프와 동일하게 사용자 통계정보 수집 기능을 사용 중이어야 한다(userstats=1).





050. MySQL – MySQL Replication
MySQL Replication 대시보드는 MySQL의 레플리케이션 관련 모니터링 지표를 보여준다.

- IO/SQL Tread Running, Replication Delay
모니터링 대상 서버의 Replication 관련 지표(IO/SQL 스레드 동작 상태, 복제 지연(Slave Lag) 상태 등)를 보여준다.



- Binlogs Size
MySQL 서버의 Binlog 크기와 시간별 누적 binlog 크기를 보여준다.





- Relay Log Space
MySQL 서버의 Relay Log 크기와 시간별 누적 Relay Log 크기를 보여준다.