MySQL의 query_log를 시각화하는 part2

이 기사는 Retty Advent Calendar 3일째입니다.
어제는 복어( @ Atsuko Fukui )의 Retty 음성 검색을 시도했습니다. 이었습니다.

이번은, 1일째에 쓴 MySQL log를 시각화의 계속을 써 가고 싶습니다.

설마, 이렇게 빨리 계속을 쓰는 날이 온다고는. . .

방법


  • RDS에서 slow_query_log를 가져옵니다.
  • slow_query_log를 Elasticserch에 넣습니다.
  • Elasticsearch 설정.
  • Kibana에서 시각화를 열심히 한다.

  •  

    RDS에서 slow_query_log 얻기



    RDS에서 로그를 얻는 방법은 DB에 쿼리를 던져 얻는 방법과,
    File로 내뿜는 것을 얻는 두 가지 방법이 있습니다.

    이번에는 DB에 저장된 것에 대해 Query를 던져 가져옵니다.
    이전에는 filebeat를 사용하여 로그를 얻었지만 RDS에서 얻는 방법을 잃어 버렸기 때문에 Embulk에서 로그를 얻는 방법으로 변경했습니다.

    Embulk 설치



    다음 명령을 실행하여 설치를 수행합니다.
    curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
    chmod +x ~/.embulk/bin/embulk
    echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
    source ~/.bashrc
    

    플러그인 설치



    RDS는 MySQL에서 읽어들이기 때문에 MySQL용 플러그인을 설치한다.
    또, Elasticsearch에 취득한 로그를 날리기 위해서, 그 플러그인도 인스톨 한다.
    embulk mkbundle bundle
    vim ~/bunble/Gemfile
    
    
    ~~ <以下2行を追加> ~~~
    gem 'embulk-input-mysql'
    gem 'embulk-output-elasticsearch_ruby'
    ~~~ <ここまで> ~~~~
    
    
    embulk bundle
    
    

    설치된 것을 확인한다.
    [ec2-user@ip-172-19-76-160 ~]$ embulk bundle list -b bundle
    2016-12-02 13:39:15.469 +0000: Embulk v0.8.15
    Gems included by the bundle:
      * bundler (1.10.6)
      * elasticsearch (5.0.0)
      * elasticsearch-api (5.0.0)
      * elasticsearch-transport (5.0.0)
      * embulk (0.8.15)
      * embulk-input-mysql (0.8.0)
      * embulk-output-elasticsearch_ruby (0.1.1)
      * excon (0.54.0)
      * faraday (0.10.0)
      * liquid (3.0.6)
      * msgpack (0.7.6)
      * multi_json (1.12.1)
      * multipart-post (2.0.0)
      * rjack-icu (4.54.1.1)
    [ec2-user@ip-172-19-76-160 ~]$
    

    YAML 파일 만들기



    다음 파일을 만듭니다.

    ~/bundle/rds_slowlog.yml
    in:
      type: mysql
      host: ***************.ap-northeast-1.rds.amazonaws.com
      user: user-name
      password: password
      database: mysql
      query: |
        SELECT
          DATE_FORMAT(start_time, '%Y-%m-%d %T') AS query_start_time,
          user_host,
          SECOND(query_time) AS query_system_time,
          SECOND(lock_time) AS query_lock_time,
          rows_sent,
          rows_examined,
          db,
          sql_text
        FROM mysql.slow_log_backup
    
    out:
      type: elasticsearch_ruby
      index: slowquery-%Y.%m.%d
      index_type: slowquery
      nodes:
        - host: 127.0.0.1
    

    다음 명령을 실행하여 YAML 파일의 동작을 확인합니다.
    embulk preview bundle/rds_slowlog.yml -b bundle
    

    Elasticsearch로 가져오기



    다음 명령을 실행하여 Elasticsearch로 데이터를 가져옵니다.
    mysql -uuser -p -hretty-********.ap-northeast-1.rds.amazonaws.com --execute 'CALL mysql.rds_rotate_slow_log;'
    embulk run bundle/rds_slowlog.yml -b bundle
    

     

    Elasticsearch 설정



    템플릿 설정



    취득한 형태에 맞추어 템플릿을 설정한다.
    {
      "slowquery": {
        "template": "slowquery-*",
        "mappings": {
          "slowquery": {
            "properties": {
              "query_system_time": {
                "type": "float"
              },
              "rows_sent": {
                "type": "integer"
              },
              "rows_examined": {
                "type": "integer"
              },
              "query_start_time": {
                "format": "yyyy-MM-dd HH:mm:ss",
                "type": "date"
              },
              "query_lock_time": {
                "type": "float"
              },
              "user_host": {
                "index": "not_analyzed",
                "type": "string"
              },
              "sql_text": {
                "index": "not_analyzed",
                "type": "string"
              },
              "db": {
                "index": "not_analyzed",
                "type": "string"
              }
            }
          }
        },
      }
    }
    

     

    Kibana로 시각화하기



    여기에서 취향에 맞게 시각화 해보세요.
    내 대시보드는 다음과 같습니다.



    요약



    RDS로부터 데이터를 취득하는데 의외로 시간이 걸려 버려 괴로웠습니다만, 순서가 정리되었으므로 편해질까 생각합니다.
    Elasticsearch에 던지면 fluentd에서도 좋았을 것이라고 생각했습니다만, DB에의 부하가 무서웠기 때문에 갱신 빈도를 임의로 설정할 수 있는 Embulk 를 선택했습니다.

    비주얼라이즈가 그다지 잘 되어 있지 않으므로, 깨끗하게 할 수 있는 분은 가르쳐 주세요! !

    좋은 웹페이지 즐겨찾기