brunch

Elasticsearch with MySQL

#MySQL #Elasticsearch #Docker #DataTrans

by 유윤식

목적은 심플함.

MySQL에 쌓은 또는 쌓이는 데이터를.

Elasticsearch에 주기적으로 옮기기.


왜 옮겨야 하는가?

이게 중요한데, 단순 Sync의 목적도 있지만!

Kibana 연동을 통해서 보고서를 대체(?)하기 위함이 큼.


Logstash 가 필요함.

다른 data shipper 가 있기는 하지만.

Elasticsearch와 연계가 되었다면 그냥.

Logstash를 사용하기를 권함.


우선.

Elasticsearch, Kibana 두 프로세스가 Docker로 실행되고 있다는 가정하에.


Logstash Docker --> pipeline --> logstash.conf 정보를 수정.



input {

jdbc {

jdbc_driver_library => "/usr/share/logstash/config/mysql-connector-java-5.1.39.jar"

jdbc_driver_class => "com.mysql.jdbc.Driver"

jdbc_connection_string => "jdbc:mysql://DB_URI:3306/DB_NAME"

jdbc_user => "USER_NAME"

jdbc_password => "PASSWORD"

jdbc_paging_enabled => true

type => "stats_test"

tracking_column => "utime"

use_column_value => true

tracking_column_type => "numeric"

schedule => "0 * * * * *"

statement => "SELECT *, UNIX_TIMESTAMP(gen_time) as utime FROM table1 WHERE (UNIX_TIMESTAMP(gen_time) > :sql_last_value AND gen_time < NOW()) ORDER BY gen_time ASC"

}

}

output {

# stdout { codec => "rubydebug"}

if [type] == "10" or [type] == "20" {

elasticsearch {

hosts => ["IP_ADDR:9200"]

index => "my_real_idx"

}

} else {

elasticsearch {

hosts => ["IP_ADDR:9200"]

index => "my_exp_idx"

}

}

}


실행하면 알아서 데이터를 가져옴.

1시간에 1번씩!


너무 자주(예로 1초에 1번?) 실행하면.

DB가 힘들어함.


위의 statement의 SQL에 대한 설명은 인터넷에 많이 존재함.

간단히 설명하자면.

최신의 데이터 && 아직 한 번도 옮겨지지 않은 데이터 를 가져오겠다는 구문.


Docker 쓰시는게 맘이 편함.

Elasticsearch, Kibana, Logstash --> docker compose 로 묶어서 사용.

하기를 추천.


끝.

keyword
작가의 이전글React 오랜만에.