Elastic Stack setup with MySQL Slowquery

hansung.dev·2021년 2월 27일
1

Data Engineer

목록 보기
1/3
post-thumbnail

Elastic Stack을 이용한 데이터 파이프라인을 구성 합니다. MySQL의 ErrorLog, SlowQuery 파일을 FileBeat로 Elasticsearch에 적재 후 Kibana에서 시각화 합니다.

Elastic Stack은 FileBeat, Logstash, Elasticsearch, Kibana로 구성됩니다.
이번 실습에서는 Logstash는 제외되었습니다.

Getting Started

Elastic Stack을 설치한 후 Filebeat를 설치, 구성 및 실행하는 방법에 대해 알아보겠습니다.
실습 환경 정보는 아래와 같습니다.

Docker : 20.10.2
Filebeat : 6.7.1
Elasticsearch : 6.7.1
MySQL : MySQL 8.0.23 (Debian GNU/Linux 10.8)

docker-compose 디렉토리 구조 및 파일을 살펴보도록 하겠습니다.

File Directory with Docker-Compose

elasticsearch, kibana, filebeat, mysql 구성에 필요한 폴더구조와 파일로 구성되어있습니다.

elastic-stack-6.7.1
    ├── docker-compose.yml
    ├── elasticsearch
    │   ├── conf
    │   │   └── elasticsearch.yml
    │   ├── data
    ├── kibana
    │   ├── conf
    │   │   └── kibana.yml
    ├── filebeat
    │   ├─ filebeat-6.7.1-amd64.deb
    │   └── conf
    │       ├── filebeat.yml
    │       └── modules.d
    │           └── mysql.yml
    ├── mysql-01
        ├── conf
        │   └── my.cnf
        ├── data
        └── log

"docker-compose.yml", "filebeat.yml", "mysql.yml"를 살펴봅니다.

docker-compose.yml

elasticsearch, kibana, filebeat, mysql 구성에 필요한 이미지를 불러옵니다. 그리고 환경설정 파일 및 데이터가 저장될 볼륨을 마운트 합니다.

version: '3.2'

services:
  elasticsearch:
    image: elasticsearch:6.7.1
    hostname: elasticsearch
    volumes:
      - type: bind
        source: "${PWD}/elasticsearch/config/elasticsearch.yml"
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - "${PWD}/elasticsearch/data:/usr/share/elasticsearch/data"
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      ELASTIC_PASSWORD: changeme
      # Use single node discovery in order to disable production mode and avoid bootstrap checks
      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - mybridge
  
  kibana:
    image: kibana:6.7.1
    hostname: kibana
    volumes:
      - type: bind
        source: "${PWD}/kibana/config/kibana.yml"
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - mybridge
    depends_on:
      - elasticsearch

  mysql-01:
    container_name: mysql-01
    hostname: mysql-01
    image: mysql:8.0.23
    command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - '3306:3306'
    volumes:
      - "${PWD}/mysql-01/data:/var/lib/mysql"
      - "${PWD}/mysql-01/log:/var/log/mysql"
      - "${PWD}/mysql-01/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
      - "${PWD}/filebeat/conf/filebeat-6.7.1-amd64.deb:/tmp/"
      - "${PWD}/filebeat/conf/filebeat.cnf:/tmp/"
      - "${PWD}/filebeat/conf/modules.d/mysql.yml:/tpm/"
    networks:
      - mybridge

networks:
  mybridge:
    external: true

filebeat.yml

filebeat 환경설정의 input, output을 설정합니다. 실습에서는 filebeat modules 중 mysql modules를 사용할 예정입니다. 그리고 outputs를 elasticsearch를 바라보도록 합니다. logstash 연동이 필요한 경우 outputs을 logstash 주소로 변경합니다.

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: false
  paths:
    - /var/log/*.log
#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
#================================ Outputs =====================================
output.elasticsearch:
  hosts: ["elasticsearch:9200"]

mysql 서버에서 elasticsearch로 서버통신허용이 되어있는지 확인합니다. 연동이 되면 다음 단계로 넘어갑니다.

curl http://elasticsearch:9200

mysql.yml

filebeat modules with mysql 에서 Mysql의 Error logs, SLow logs를 설정 및 위치를 지정합니다. 실습에서는 slow logs만 설정했습니다. mysql의 slowquery 설정은 my.cnf에 미리 설정해 두었습니다.

root@mysql-01:/etc/filebeat/modules.d# cat mysql.yml

- module: mysql
  # Error logs
  error:
    enabled: false

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    # var.paths:

  # Slow logs
  slowlog:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["/var/log/mysql/mysql-slow.log*"]

Setting up and running

Docker-Compos Run

docker-compose를 실행하여 Elastic Stack 및 Mysql 서비스를 시작합니다.

docker-compose up -d

FileBeat, Set up and run the module

mysql서버에 filebeat를 설치 합니다.

dpkg -i /tmp/filebeat-6.7.1-amd64.deb

FileBeat MySQL 모듈을 활성화 하고 FileBeat 서비스를 시작합니다.

filebeat modules enable mysql
filebeat modules list
filebeat setup -e
service filebeat start

미리 설정한 filebeat.yml, mysql.yml 파일을 복사합니다.

cp /tmp/filebeat.yml /etc/filebeat/filebeat.yml
cp /tmp/modules.d/mysql.yml /etc/filebeat/modules.d/mysql.yml

Explore your data in Kibana

kibana를 통해 elasticsearch에 적재된 mysql slowquery 데이터를 확인합니다.
"http://localhost:5601/"로 접속합니다.

github 에서 모든 코드를 확인할수 있습니다.

참조 : Filebeat Reference [6.7] » Modules » MySQL module

profile
Data Engineer

0개의 댓글