MySQL의 느린 쿼리를 슬랙에 알릴 수 있도록
하고 싶은 일
이런 식으로 MySQL에서 병목 현상이 될 것 같은 slow 쿼리를 slack에 알리고
지속적으로 쿼리 튜닝을 원합니다.
그래서 Mysql에서 출력된 슬로우 쿼리 로그를 fluentd로 가져오고,
해당 쿼리에 대해 explain을 실행하고 쿼리의 내용과 함께,
explain의 결과를 slack에게 통지할 수 있도록 한다.
1. 준비
slack 게시물 webhookURL 준비
IncomingWebHook의 키 발행은 다음으로부터 취득한다
htps : // x x. scck. 코 m/세 rゔぃ세 s/네 w
참조 URL : ぃ tp // 이 m / v mhy ぺr
2. 환경 구축
fluentd
slack 게시물 webhookURL 준비
IncomingWebHook의 키 발행은 다음으로부터 취득한다
htps : // x x. scck. 코 m/세 rゔぃ세 s/네 w
참조 URL : ぃ tp // 이 m / v mhy ぺr
2. 환경 구축
fluentd
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
# /etc/init.d/td-agent start
td-agent td-agent: [ OK ]
# /etc/init.d/td-agent status
td-agent is running [ OK ]
# /etc/init.d/td-agent stop
Stopping td-agent: td-agent [ OK ]
# td-agent-gem install fluent-plugin-nata2
# td-agent-gem install fluent-plugin-mysql_explain
# td-agent-gem install fluent-plugin-sql_fingerprint
# td-agent-gem install fluent-plugin-slack
fluent-plugin-mysql_explain
SQL에 대해 EXPLAIN을 실행하여 결과를 explain 속성에 유지하는 filter plugin
github : htps : // 기주 b. 코 m / 키쿠 모토 / f
인용구 : h tp // 키쿠모토. 하테나 bぉg. 코m/엔트리/2015/12/04/000152
fluent-plugin-sql_fingerprint
in_mysqlslowquery_ex에서 얻은 JSON의 sql 속성에 유지되는 SQL 문의 매개 변수 부분을 추상화하는 플러그인
github : htps : // 기주 b. 코 m / 키쿠모토 / f
인용구 : h tp // 키쿠모토. 하테나 bぉg. 코m/엔트리/2015/12/04/000152
fluent-plugin-nata2
github : htps : // 기주 b. 코 m / s Tsuoo 3104 / f ぅ 엔 top ぅ 긴-나타 2
fluent-plugin-slack
slack에 post를 위해 이용한 plugin
github : htps : // 기주 b. 코 m / 소와와 / f ぅ 엔 tp
percona-toolkit
# wget percona.com/get/percona-toolkit.rpm
# ls | grep percona
percona-toolkit.rpm
# yum install percona-toolkit.rpm
3. fluentd 설정
conf 파일 편집
vim /etc/td-agent/td-agent.conf
<source>
type mysqlslowquery_ex
read_from_head
path 【パスを指定】/slow.log
pos_file /var/log/td-agent/mysql-slow.pos
tag mysqld.slow_query.bp
last_dbname_file /tmp/slowquery.log.lastdb
</source>
<filter mysqld.slow_query.**>
type record_transformer
<record>
hostname ${hostname}
</record>
</filter>
<filter mysqld.slow_query.**>
type mysql_explain
host 127.0.0.1
port 3306
username 【DBへのアクセスユーザ名を指定】
password 【DBへのアクセスパスワードを指定】
database 【DB名を指定】
sql_key sql
added_key explain
</filter>
<filter mysqld.slow_query.**>
type sql_fingerprint
fingerprint_tool_path /usr/bin/pt-fingerprint
</filter>
<match mysqld.slow_query.**>
type copy
<store>
type slack
webhook_url 【slackのwebhookURLを指定】
channel 【slackのchannel名を指定】
username 【slackの投稿ユーザ名を指定】
icon_emoji :x:
color danger
message "*[User]* %s\r\n *[Host]* %s\r\n *[Query Time]* %s\r\n *[Lock Time]* %s\r\n *[Rows sent]* %s\r\n *[Rows Examined]* %s\r\n *[SQL]* %s \r\n *[Explain]* \r\n %s \r\n"
message_keys user,host,query_time,lock_time,rows_sent,rows_examined,fingerprint,explain
flush_interval 1m
</store>
</match>
fluentd 재부팅
service td-agent restart
4. 소통 확인
느린 쿼리를 만들어 슬랙에 알림이 있는지 확인
vim /etc/td-agent/td-agent.conf
<source>
type mysqlslowquery_ex
read_from_head
path 【パスを指定】/slow.log
pos_file /var/log/td-agent/mysql-slow.pos
tag mysqld.slow_query.bp
last_dbname_file /tmp/slowquery.log.lastdb
</source>
<filter mysqld.slow_query.**>
type record_transformer
<record>
hostname ${hostname}
</record>
</filter>
<filter mysqld.slow_query.**>
type mysql_explain
host 127.0.0.1
port 3306
username 【DBへのアクセスユーザ名を指定】
password 【DBへのアクセスパスワードを指定】
database 【DB名を指定】
sql_key sql
added_key explain
</filter>
<filter mysqld.slow_query.**>
type sql_fingerprint
fingerprint_tool_path /usr/bin/pt-fingerprint
</filter>
<match mysqld.slow_query.**>
type copy
<store>
type slack
webhook_url 【slackのwebhookURLを指定】
channel 【slackのchannel名を指定】
username 【slackの投稿ユーザ名を指定】
icon_emoji :x:
color danger
message "*[User]* %s\r\n *[Host]* %s\r\n *[Query Time]* %s\r\n *[Lock Time]* %s\r\n *[Rows sent]* %s\r\n *[Rows Examined]* %s\r\n *[SQL]* %s \r\n *[Explain]* \r\n %s \r\n"
message_keys user,host,query_time,lock_time,rows_sent,rows_examined,fingerprint,explain
flush_interval 1m
</store>
</match>
service td-agent restart
느린 쿼리를 만들어 슬랙에 알림이 있는지 확인
SELECT COUNT(*), sleep(10)
FROM blog_t
평소에는 많이 사용하지 않지만 sleep에서 10 초가 걸리는 쿼리를 만들어 slack으로 알림을 확인합니다.
작동하지 않으면 td 로그를 확인해보십시오.
· td-agent.conf에서 설정한 사용자의 DB 액세스 권한이 부여되지 않음
· explain 실행에 오류가 있습니다.
· td-agent 자체가 멈췄다, 퍼스가 잘되지 않는다.
등, warn이나 error가 나오면, 잘 작동하지 않을 가능성이 있습니다.
Reference
이 문제에 관하여(MySQL의 느린 쿼리를 슬랙에 알릴 수 있도록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tachitechi/items/cde10b4055013846a677텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)