본문 바로가기

엘라스틱 서치

ELK, Mysql, Kafka 구축 및 연동

0. 개요

ELK란 Elsaticsearch + Logstash + Kibana를 통합해서 부르는 말입니다.

 

이 글에서는 ELK, Mysql, Kafka를 구축해서 연동할 것입니다.

프로젝트 구조도는 아래와 같습니다.

아래는 ELK를 구축하기 위한 프로젝트 구조입니다.

ES-springBoot:.
└─es
  ├─docker-compose.yml
  │
  ├─elasticsearch
  │  │  Dockerfile
  │  │
  │  ├─config
  │  │      elasticsearch.yml
  │  │
  │  └─settings
  │      ├─stop
  │      │      english.txt
  │      │
  │      └─synonym
  │              english.txt
  │
  ├─kibana
  │  │  Dockerfile
  │  │
  │  └─config
  │          kibana.yml
  │
  └─logstash
      │  Dockerfile
      │  mysql-connector-j-8.0.33.jar
      │
      ├─config
      │      logstash.yml
      │      pipelines.yml
      │
      └─pipeline
              logstash.conf

 

1. Elasticsearch

ES-springBoot:.
└─es
  ...
  └─elasticsearch
    │  Dockerfile
    │
    ├─config
    │      elasticsearch.yml
    │
    └─settings
        ├─stop
        │      english.txt
        │
        └─synonym
                english.txt

1.1 Dockerfile

ARG ELK_VERSION
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
COPY ./settings ./config/settings
RUN elasticsearch-plugin install analysis-nori

1.2 elasticsearch.yml

cluster.name: "ksb-cluster"
network.host: 0.0.0.0

1.3 stop/english.txt

the, a

1.4 synonym/english.txt

good, well
hello, hi

 

2. Logstash

ES-springBoot:.
└─es
  ...
  └─logstash
      │  Dockerfile
      │  mysql-connector-j-8.0.33.jar
      │
      ├─config
      │      logstash.yml
      │      pipelines.yml
      │
      └─pipeline
              logstash.conf

2.1 Dockerfile

ARG ELK_VERSION
FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}

2.2 config/logstash.yml

http.host: "0.0.0.0"

2.3 config/piplines.yml

- pipeline.id: ksb_logstash
  path.config: "/usr/share/logstash/pipeline/logstash.conf"

2.4 pipeline/logstash.conf

input {
    http {
        port => 9900
        tags => [ "web" ]
    }
    jdbc {
        jdbc_validate_connection => true
        jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-j-8.0.33.jar"
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://host.docker.internal:3306/es_connect_db?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true"
        jdbc_user => "root"
        jdbc_password => "1234"
        schedule => "*/5 * * * *"
        statement => "select * from loging" # loging이라는 테이블이 만들어져있어야 함
        tags => [ "mysql" ]
    }
    kafka {
        bootstrap_servers => "host.docker.internal:29092, host.docker.internal:29093, host.docker.internal:29094"
        topics => [ "ksb-es-kafka" ] # 카프카는 점(.)과 언더바(_) 불가능
        group_id => "ksb-group"
        tags => [ "kafka" ]
        # consumer_threads => 3
        # auto_offset_reset => "latest"
    }
}

filter {
    if "mysql" in [tags]{
        mutate {
            add_field => {
                "doc_id" => "%{id}%{name}"
            }
        }
    }
}

output {
    if "mysql" in [tags]{
        elasticsearch {
            index => "ksb-mysql-logs-%{+yyyy.MM.dd}"
            document_id => "%{doc_id}" # 데이터 중복 제거를 위함
            hosts => [ "host.docker.internal:9200" ]
        }
    }
    if "kafka" in [tags]{
        elasticsearch {
            index => "ksb-kafka-logs-%{+yyyy.MM.dd}"
            hosts => [ "host.docker.internal:9200" ]
        }
    }
}

💡 Mysql 사용자의 정보를 jdbc_user와 jdbc_password에 넣어야 합니다.

 

3. Kibana

ES-springBoot:.
└─es
  ...
  └─kibana
    │  Dockerfile
    │
    └─config
            kibana.yml

3.1 Dockerfile

ARG ELK_VERSION
FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}

3.2 config/kibana.yml

server.name: ksb_kibana
server.host: 0.0.0.0
elasticsearch.hosts: ["<http://host.docker.internal:9200>"]
monitoring.ui.container.elasticsearch.enabled: true

 

4. Mysql

아래 링크로Mysql 버전 8.0.33을 로컬에 다운받습니다.

MySQL :: Download MySQL Installer

 

MySQL :: Download MySQL Installer

Select Operating System: Select Operating System… Microsoft Windows Select OS Version: All Windows (x86, 32-bit) Windows (x86, 32-bit), MSI Installer 8.0.33 2.4M (mysql-installer-web-community-8.0.33.0.msi) MD5: 2a330cf24915964cca87e04dbb34e5d3 | Signatu

dev.mysql.com

위의 엘라스틱과 Docker-Compose로 묶어서 실행하지 않은 이유는,

보통 DB의 서버와 엘라스틱 서버와 다른 위치에 있기 때문입니다.

Mysql을 설치하고 아래의 명령어로 DB, Table을 만들고 데이터를 삽입합니다.

create database es_connect_db default CHARACTER SET UTF8; 

use es_connect_db;

CREATE TABLE loging (
	id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20),
    log VARCHAR(20),
    PRIMARY KEY(id)
);

insert into loging(name, log) values ('ksb', '1번 데이터');
insert into loging(name, log) values ('kkk', '2번 데이터');
insert into loging(name, log) values ('ksb', '3번 데이터');
-- 원하는 데이터를 추가하면 됩니다.

use es_connect_db;

select * from loging;

💡 저의 경우 Id는 root, Password는 1234의 사용자가 이미 생성되어 있습니다. [2.4 참고]

 

5. Kafka

카프카에 관련된 설명은 이미 제 블로그에 정리해 놨으니 필요하신 분은 아래 링크를 통해 봐주시면 감사하겠습니다.

'카프카' 카테고리의 글 목록

 

'카프카' 카테고리의 글 목록

 

ksb-dev.tistory.com

카프카를 실행하는 Docker-Compose 파일은 아래 있으니 아래 링크에 들어가셔서 확인하시기 바랍니다.

카프카 클러스터 docker compose로 구축하기

 

카프카 클러스터 docker compose로 구축하기

1. 왜 docker compose를 사용하는가? docker compose는 여러 개의 컨테이너가 동시에 동작할 때 필요합니다. 위 그림과 같이 카프카 클러스터를 구축할 때 보통 한 개의 주키퍼, 세 개의 카프카 브로커가

ksb-dev.tistory.com

 

6. 영상

위의 연동이 끝나고 동작 과정을 영상으로 만들었습니다.

관심있는 분은 영상을 봐보시길 바랍니다.

Elasticsearch, Mysql, Kafka 연동

 

7. 프로젝트 주소

https://github.com/kang-seongbeom/ES-SpringBoot

 

GitHub - kang-seongbeom/ES-SpringBoot

Contribute to kang-seongbeom/ES-SpringBoot development by creating an account on GitHub.

github.com