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


  • 설치
  • 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


  • rpm 파일 얻기
  • # 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. 소통 확인



    느린 쿼리를 만들어 슬랙에 알림이 있는지 확인


  • slow 쿼리 실행
  • SELECT COUNT(*), sleep(10) 
    FROM blog_t
    

    평소에는 많이 사용하지 않지만 sleep에서 10 초가 걸리는 쿼리를 만들어 slack으로 알림을 확인합니다.
  • 아래 화면과 같이 알림이 도착했는지 확인합니다.



    작동하지 않으면 td 로그를 확인해보십시오.



    · td-agent.conf에서 설정한 사용자의 DB 액세스 권한이 부여되지 않음
    · explain 실행에 오류가 있습니다.
    · td-agent 자체가 멈췄다, 퍼스가 잘되지 않는다.

    등, warn이나 error가 나오면, 잘 작동하지 않을 가능성이 있습니다.
  • 좋은 웹페이지 즐겨찾기