개발놀이터

Elasticsearch 에 MySQL 데이터 동기화하기 (데이터 마이그레이션) 본문

CS 지식/데이터베이스

Elasticsearch 에 MySQL 데이터 동기화하기 (데이터 마이그레이션)

마늘냄새폴폴 2023. 5. 26. 06:11

이번 포스팅에선 Elasticsearch의 데이터와 MySQL 데이터를 동기화하는 방법에 대해서 포스팅해보도록 하겠습니다. 

 

우선 제가 이 방법이 필요했던 이유는 기존 프로젝트에서 이미 수백개의 데이터가 있는데 이걸 Elasticsearch와 연동시켜야 제가 원하는 검색성능이 나올 것 같아서 알아보게 되었습니다. 

 

마이그레이션 하느라 조금 고생했는데 한번 보시죠!

 

Elasticsearch 마이그레이션

 

Elasticsearch에서 데이터를 마이그레이션 하는 방법에는 몇가지가 있습니다. 

 

  1. 일일이 집어넣기
  2. Logstash 사용하기
  3. go-mysql-elasticsearch 사용하기

 

저야 수백개가 되는 데이터니까 잘만하면 일일이 집어넣는게 가능하겠지만 현실에선 불가능하겠죠?

 

또 logstash를 사용하는 방법이 있는데 몇가지 장단점이 있습니다. 

 

장점

  • SQL문을 작성해서 내가 원하는 데이터를 뽑아올 수 있다. 
  • 때문에 진입장벽이 낮은 편

단점

  • 메모리를 많이 잡아먹는다
  • 때문에 오래걸림

 

go-mysql-elasticsearch는 go lang을 이용해야하고 터미널 기반인 Mac에서 유용하다고 합니다. 그리고 장단점이 정확히 logstash와 정반대입니다. 저는 속도가 빠른게 장땡이 아니라고 생각하기 때문에 별로 와닿지 못했습니다. 

 

내가 빠른게 좋았으면 C언어를 했지

 

저는 데이터를 수백만행씩 마이그레이션 할 것이 아니기 때문에 logstash를 이용한 데이터 마이그레이션을 해볼겁니다. 

 

우선 자신의 Elasticsearch와 맞는 버전의 Logstash를 다운받습니다. 

https://www.elastic.co/kr/downloads/past-releases#logstash

 

Past Releases of Elastic Stack Software

Looking for a past release of Elasticsearch, Logstash, Kibana, es-hadoop, Shield, Marvel, or our language clients? You're in the right place.

www.elastic.co

 

그리고 ELK 스택이 전부 자바로 되어있기 때문에 우리는 JDBC Driver를 다운받아야합니다. 

https://mvnrepository.com/artifact/mysql/mysql-connector-java

 

JAR파일로 다운 받으셔야 합니다. 

 

이 JAR파일은 Logstash의 lib파일에 넣으시면 됩니다. 따로 법칙이 있는건 아닌 것 같고 국룰인 듯 합니다. 

 

Logstash와 MySQL Driver를 다운받았다면 이제 conf 파일을 만들어야합니다. 

 

input {
  jdbc {
    jdbc_driver_library => "D:\logstash-8.7.0-windows-x86_64\logstash-8.7.0\lib\mysql-connector-java-8.0.28.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/assignment?useSSL=false"
    jdbc_user => "MySQL 루트 유저"
    jdbc_password => "MySQL 루트 비밀번호"
    schedule => "* * * * *"
    statement => "SELECT item_id, item_url, view_name, item_name, price FROM item"
  }
}
filter {

}
output {
  elasticsearch {
    index => "item"
    document_id => "%{item_id}" 
  } stdout {
      codec => rubydebug
  }
}

 

하나씩 살펴보도록 하죠. 

 

먼저 Logstash에 대해서 대충 말씀드리자면 ELK 스택에서 L에 해당하는 데이터 집계 툴입니다. 

 

데이터 집계 툴이라는 의의답게 데이터를 마이그레이션해서 Elasticsearch에 옮기는 역할을 합니다. 

 

Logstash는 input, filter, output 이렇게 세 가지 단계로 진행됩니다. 

 

Input

  • jdbc_driver_library : 아까 저장한 MySQL Driver의 저장위치를 적으시면 됩니다. 
  • jdbc_driver_class : 이건 자바에서 JDBC를 다뤄보셨으면 한번쯤 보셨을 겁니다. 
  • jdbc_connection_string : MySQL의 위치와 데이터베이스를 적으시면 됩니다. jdbc:mysql://데이터베이스 주인/데이터베이스 이름 이렇게 적으시면 됩니다. 
  • jdbc_user : 데이터베이스 루트 사용자를 적으시면 됩니다. 
  • jdbc_password : 데이터베이스 루트 비밀번호를 적으시면 됩니다. 
  • schedule : 크론 표현식으로 얼마의 주기로 동기화를 할지를 정합니다. 
  • statement : Logstash만의 강력한 무기 중하나인 SQL문을 적는 공간입니다. 이 데이터에 따라 자동으로 마이그레이션 해줍니다. 이 옵션 덕분에 진입장벽이 굉장히 낮아집니다. 

 

Filter는 생략합니다. 원하시면 넣어보세요!

 

Output

  • index : 우리가 만든 인덱스 이름을 적어주면 됩니다. 
  • document_id : SQL의 테이블에 있는 primary key를 document id로 마이그레이션하는 과정에 필요한 옵션입니다. 

 

메모장에 적으시고 확장자를 conf 로 설정하시면 자동적으로 conf 파일이 됩니다. 

 

여기서 한글자라도 오타가 나거나 빼먹으면 작동이 안됩니다. 

 

저는 환경이 Windows였기 때문에 Windows를 기반으로 작성하도록 하겠습니다. 

 

먼저 cmd 창을 열어줍니다. 

 

Logstash가 있는 곳으로 이동합니다. bin으로 이동하면 됩니다. 

 

Logstash를 실행하기 전에 한가지 알아두셔야 할 점이 있습니다. 

 

저는 자꾸 conf 파일을 찾지 못하길래 절대경로로 때려박아서 해결했습니다. 때문에 저는 conf 파일이 있는 절대 경로를 얻어올겁니다. 

 

D:\logstash-8.7.0-windows-x86_64\logstash-8.7.0\config\logstash.conf

 

이렇게 얻어왔으면 이제 Logstash를 작동시킵니다. 

 

 

그러면 지가 알아서 작동합니다. 

 

 

데이터가 이렇게 마이그레이션 되었습니다. 

 

다만 여기서 주의해야 하는 점은 반드시 Elasticsearch가 실행중이어야 한다는 점입니다. 그 점 유의해주세요!

 

 

이렇게 데이터가 잘 들어왔습니다. 

 

 

마치며

이렇게 MySQL에서 Elasticsearch로 데이터 마이그레이션을 마쳤습니다. 마이그레이션은 처음 해보는데 정말 놀랍네요. 

 

진짜 개발자가 된 것 같아서 뭔가 멋있습니다.

 

이제 Elasticsearch를 마음대로 이용하면 됩니다. 여기까지 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~