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
위의 엘라스틱과 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
카프카에 관련된 설명은 이미 제 블로그에 정리해 놨으니 필요하신 분은 아래 링크를 통해 봐주시면 감사하겠습니다.
카프카를 실행하는 Docker-Compose 파일은 아래 있으니 아래 링크에 들어가셔서 확인하시기 바랍니다.
6. 영상
위의 연동이 끝나고 동작 과정을 영상으로 만들었습니다.
관심있는 분은 영상을 봐보시길 바랍니다.
Elasticsearch, Mysql, Kafka 연동
7. 프로젝트 주소
https://github.com/kang-seongbeom/ES-SpringBoot
'엘라스틱 서치' 카테고리의 다른 글
뉴스 데이터를 위한 엘라스틱 서치 쿼리 모음 (0) | 2024.05.26 |
---|---|
스프링부트로 엘라스틱서치 쿼리 날리기 (0) | 2023.06.09 |
스프링부트 테스트와 엘라스틱서치 테스트 컨테이너 (0) | 2023.05.27 |
엘라스틱서치 검색 Query DSL (0) | 2023.05.18 |
엘라스틱서치 데이터 삽입, 조회, 수정, 삭제, _bulk API (0) | 2023.05.03 |