포스트

(멋쟁이사자처럼_백엔드스쿨플러스) Day17 엘라스틱 서치

logstash

logstash 특징

  • logstash는 데이터 수집, 변환, 저장, 전송을 위한 오픈소스 도구
  • DB에서 주기적으로 최신화된 데이터를 받아 elsaticsearch로 전송한다.

Image

logstash 구현하기

compose.yml 파일 수정

  • docker에서 logstash image를 받아오기 위해 compose.yml 파일을 수정한다.
  • docker에서 사용할 볼륨마운트를 로컬 디렉토리와 연결한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
logstash:
    image: docker.elastic.co/logstash/logstash:8.3.3
    container_name: logstash
    environment:
      - LS_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      ## "로컬:./logstash/pipeline, 컨테이너:/usr/share/logstash/pipeline:ro
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro
      ## "로컬:./logstash/lib/mysql-connector-j-9.2.0.jar, 컨테이너:/usr/share/logstash/logstash-core/lib/jars/mysql-connector-j-9.2.0.jar:ro
      - ./logstash/lib/mysql-connector-j-9.2.0.jar:/usr/share/logstash/logstash-core/lib/jars/mysql-connector-j-9.2.0.jar:ro
    ports:
      - "5001:5001"
      - "5044:5044"
    depends_on:
      - elasticsearch
    networks:
      - elastic

pipeline.conf 파일 수정

  • 도커 compose를 실행하면 pipeline.conf 파일을 읽어 logstash가 실행된다.
  • pipeline.conf 파일을 수정하여 logstash가 실행될때 어떤 동작을 할지 설정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  input {
    jdbc {
      jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-j-9.2.0.jar"
      jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
      jdbc_connection_string => "jdbc:mysql://host.docker.internal:3306/es_dev" #배포환경 172.17.0.1
      jdbc_user => "llddlocal"
      jdbc_password => "1234"
      # 실행할 SQL 쿼리
      statement => "SELECT * FROM post"
      # 30초 마다 실행
      schedule => "*/30 * * * * *"
      # SQL 로깅 관련 설정
      sql_log_level => "debug"  # SQL 쿼리 로깅 레벨
      tracking_column => "id"   # 추적할 컬럼
      use_column_value => true  # 컬럼 값 사용
      record_last_run => true   # 마지막 실행 기록
      last_run_metadata_path => "/usr/share/logstash/last_run_metadata"  # 메타데이터 저장 경로
    }
  }
  filter {
    mutate {
      remove_field => ["@version", "jdbc_connection_string", "jdbc_user", "jdbc_password"]
    }
  }
  output {
    elasticsearch {
      hosts => ["elasticsearch:9200"]
      index => "app1_posts"
      document_id => "%{id}"  # 고유 ID 필드명을 지정
    }
    # 디버깅을 위한 콘솔 출력 (SQL 쿼리 포함)
    stdout {
      codec => rubydebug { metadata => true }
    }
  }
  • jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-j-9.2.0.jar" 파일 경로에 JDBC 드라이버 탐색
  • 해당 경로는 로컬에서 ./logstash/lib/mysql-connector-j-9.2.0.jar으로 볼륨 마운트가 되어 있음
  • ./logstash/lib/mysql-connector-j-9.2.0.jar 경로에 mysql-connector-j-9.2.0.jar 파일을 넣어두어야 한다.
1
curl -o ./logstash/lib/mysql-connector-j-9.2.0.jar https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/9.2.0/mysql-connector-j-9.2.0.ja

참고 jar파일 인식 오류

  • 파일 인식오류는 읽기/쓰기 권한으로 인해 발생한다.
  • 파일을 읽을 수 없는 경우 권한을 변경해준다.
1
chmod 644 ./logstash/lib/mysql-connector-j-9.2.0.jar

logstash 구동 과정

  1. logstash가 실행되면 pipeline.conf 파일을 읽어 logstash가 실행된다.
  2. 설정된 경로에서 JDBC 드라이버를 탐색한다.
  3. 주어진 host.docker.internal(localhost)에 3306 포트로 user와 password를 입력하여 DB에 접속한다.
  4. 쿼리를 통해 데이터를 가져온다.
  5. 9200 포트로 elasticsearch에 접속한다.
  6. 가져온 데이터를 elasticsearch에 저장한다.

Image

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.