코딩마을방범대

[ELK] ELK를 이용한 MySQL 로그 연동 방법 본문

💡 백엔드/ELK

[ELK] ELK를 이용한 MySQL 로그 연동 방법

신짱구 5세 2024. 10. 21. 11:15
728x90

 

 

 

도커를 통해 ELK 구축하기

ELK란 아래 포스트를 통해 개념을 확인할 수 있다. ELK 스택(Elasticsearch, Kibana, Beats, Logstash) 개념 정리ELK 스택Elasticsearch, Logstash, Kibana의 세 가지 인기 있는 프로젝트로 구성된 스택을 의미

sweet-rain-kim.tistory.com

 

위 포스터를 참고하여 ELK를 구축한 경우 여러 서비스의 로그를 수집할 수 있다.

이번 포스터에선 MySQL 로그와 연동해 볼 예정이다.

 

 


 

 

 

 

 

 

1. MySQL 환경 설정

 

우선 MySQL의 로그 설정이 필요하다.

 

1. MySQL conf 파일 수정

sudo vi /etc/mysql/my.cnf

 

위 명령어를 실행한 뒤 로그 출력을 세팅해주면 된다.

 

[mysqld]
# 일반적인 로그
general_log = 1
general_log_file = /var/log/mysql/mysql.log

# 에러 로그
log_error = /var/log/mysql/error.log

# 슬로우 쿼리 로그
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
설정명 설명
general_log 일반 쿼리 로그를 활성화
general_log_file 일반 로그 파일의 경로를 설정
log_error 에러 로그 파일의 경로를 설정
slow_query_log 슬로우 쿼리 로그를 활성화
slow_query_log_file 슬로우 쿼리 로그 파일의 경로를 설정
long_query_time 슬로우 쿼리로 간주할 쿼리 실행 시간을 설정

 

 


 

 

2. 디렉토리 권한 설정

MySQL이 로그를 쓸 수 있도록 /var/log/mysql/ 디렉토리를 생성하고 올바른 권한을 설정한다.

sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
sudo chmod 750 /var/log/mysql

 

 


 

 

3. MySQL 재시작 및 로그 확인

sudo systemctl restart mysql
ls -l /var/log/mysql/

 

 

 

 


 

 

 

 

 

2. Docker-compose 세팅하기

 

 

도커를 통해 ELK 구축하기

ELK란 아래 포스트를 통해 개념을 확인할 수 있다. ELK 스택(Elasticsearch, Kibana, Beats, Logstash) 개념 정리ELK 스택Elasticsearch, Logstash, Kibana의 세 가지 인기 있는 프로젝트로 구성된 스택을 의미

sweet-rain-kim.tistory.com

 

위 포스트를 참고하여 4번까지 세팅했다는 가정 하에 아래 단계들을 진행해주면 된다.

docker-compose.yml 파일을 수정해주면 된다.

logstash를 이용할 경우 logstash: depends_on에 mysql 추가 필수!

 

예시.

version: '3.8'

services:
  elasticsearch:
    image: elasticsearch:7.10.1
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data

  logstash:
    image: logstash:7.10.1
    ports:
      - "5044:5044"
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch
      - mysql 

  kibana:
    image: kibana:7.10.1
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: your_database
      MYSQL_USER: your_user
      MYSQL_PASSWORD: your_password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  filebeat:
    image: docker.elastic.co/beats/filebeat:7.10.1
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/log:/var/log:ro
    depends_on:
      - mysql
      - logstash

volumes:
  esdata:
    driver: local
  mysql_data:
    driver: local



 


 

 

 

 

 

 

이후에는 파일을 전송하는 방법에 따라 설정 방법이 다르다!

logstash를 활용하는 방법과 filebeat를 사용하는 방법이 있다.

filebeat는 경량 로그 데이터 수집가로, logstash와 다르게 세부적인 사항을 설정할 수 없다.

작은 프로젝트에서 사용하기 적합하므로, 웬만하면 Logstash 사용을 권고한다.

 

 

3. 데이터 전송 방법 선택하기

 

ⓐ Logstash 설정하기

 

logstash.conf 파일을 수정해주면 된다.

options input example 설명
jdbc_connection_string jdbc:postgresql://localhost:5432/db database 연결 정보를 입력하는 부분.
연결할 DB 정보에 맞게 입력
jdbc_user user database user 입력
jdbc_password password database password 입력
jdbc_driver_class org.postgresql.Driver driver class 입력
jdbc_driver_library /usr/share/logstash/logstash-core/lib/jars/postgresql.jar 4-2 에서 copy한 jar 경로 입력
사용 할 driver jar 의 경로가 입력되야함.
statement select * from table 저장할 data query 입력
jdbc_paging_enabled true 페이징을 사용하여 데이터를 저장할 경우 사용
jdbc_page_size 10000 페이지 사이즈 지정
jdbc_pool_timeout 300 jdbc timeout 지정
schedule */1 * * * * 스케쥴 지정 linux cron형식으로 스케쥴 지정

 

예시.

input {
    jdbc {
        jdbc_driver_library => "/usr/share/logstash/drivers/mysql-connector-java-8.0.23.jar" # MySQL JDBC 드라이버 경로
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://mysql:3306/your_database"
        jdbc_user => "your_user"
        jdbc_password => "your_password"
        statement => "SELECT * FROM your_table"
        schedule => "* * * * *" # 매 분마다 실행
    }
}

output {
    elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        index => "your_index_name-%{+YYYY.MM.dd}"
    }
}

 

 

 


 

 

 

 

 

ⓑ Filebeat 세팅하기

 

 1. filebeat 설치 및 압축해제

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.1-darwin-x86_64.tar.gz
tar xzvf filebeat-7.10.1-darwin-x86_64.tar.gz
cd filebeat-7.10.1-darwin-x86_64/

 

 


 

 

2. configuration 파일 수정

sudo vi filebeat.yml

 

위 명령어 실행 후 아래와 같이 ELK의 정보를 입력해주면 된다.

보통 기본 정보가 입력되어 있으나 주석 처리가 되어있기 때문에 주석 해제 후 알맞은 값을 기입해주면 된다.

username과 password는 따로 정해진 값이 없으니 원하는 아이디와 패스워드를 입력해주면 된다.

 

output.elasticsearch:
    hosts: ["logstash:5044"]
    username: "elastic"
    password: "<password>"
setup.kibana:
    host: "<kibana_url>"




 

 

3. filebeat의 mysql 설정 수정

cd modules.d/
vi mysql.yml

 

위 명령어는 sudo su 를 통해 root 권한을 받았을 때를 가정하여 실행한 것이다.

아까 위에서 설정한 MySQL 로그 출력 위치를 설정해주면 된다.

 

- module: mysql
    # Error logs
    error:
        enabled: true
        var.paths: ["/var/log/mysql/error.log"]


    # Slow logs
    slowlog:
        enabled: true
        var.paths: ["/var/log/mysql/mysql_slow.log"]

  general:
      enabled: true
      var.paths: ["/var/log/mysql/mysql.log"]  # 일반 로그 파일 경로




 

 

4. MySQL 모듈 활성화

cd ..
./filebeat modules enable mysql

 

 


 

 

5. filebeat 시작

./filebeat setup
./filebeat -e

 

 

 

 


 

 

 

 

4. ELK 시작하기

docker-compose build && docker-compose up -d

 

위 명령어를 실행한 후 kibana 홈페이지에 접속 후 확인해보면 된다.

 

 

 

 


참고사이트

DOCKER에서 ELK 설치 및 사용하기

 

 

728x90