brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Sep 23. 2020

Elasticsearch with MySQL

#MySQL #Elasticsearch #Docker #DataTrans

목적은 심플함.

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 로 묶어서 사용.

하기를 추천.


끝.

작가의 이전글 React 오랜만에.
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari