Data Pipeline/Fluentd

mysql-replicator를 활용한 MySQL - Elasticsearch Sync

재심 2022. 11. 23. 22:39

MySQL에 적재되는 데이터를 Elasticsearch에 복제하여 사용하려는 요구가 있다.

다양한 방법이 있는 듯하다.

 

  • logstash
    • input - jdbc plugin
    • output - elasticsearch plugin
  • fluentd
    • input - mysql-query, mysql-prepared-statement etc.. 
    • output - elasticsearch 

 

이 중 fluentd에 mysql-replicator가 있어서 이 부분에 대해서 구동해본 내용 정리.

 

[mysql-replicator?]

github: https://github.com/y-ken/fluent-plugin-mysql-replicator

 

GitHub - y-ken/fluent-plugin-mysql-replicator: Fluentd input plugin to track insert/update/delete event from MySQL databases.

Fluentd input plugin to track insert/update/delete event from MySQL databases. - GitHub - y-ken/fluent-plugin-mysql-replicator: Fluentd input plugin to track insert/update/delete event from MySQL d...

github.com

 

Fluentd input plugin to track insert/update/delete event from MySQL database server.Not only that, it could multiple table replication into single or multi Elasticsearch/Solr.It's comming support replicate to another RDB/noSQL.

Fluentd input 플러그인은 MySQL 데이터베이스 서버에서 insert/update/delete 이벤트를 추적합니다.뿐만 아니라 단일 또는 다중 Elasticsearch/Solr로 다중 테이블 복제가 가능합니다.다른 RDB/noSQL로의 지원 복제가 예정되어 있습니다.

설명에 따르면 MySQL 테이블의 CUD 이벤트를 감지하고 이를 ES에 복제까지 할 수 있다는 뜻으로 보인다.

 

[환경구성]

github: https://github.com/sjm767/docker-compose-storage/tree/main/docker/fluentd/mysql-elasticsearch

 

Fluentd 커스텀 이미지 생성

docker에서 fluentd를 구동해볼 예정이고, 해당 플러그인은 기본 설치되어있지 않기 때문에 Dockerfile을 통해 커스텀 이미지 빌드가 필요하다. 

https://github.com/sjm767/docker-compose-storage/blob/main/docker/fluentd/mysql-elasticsearch/Dockerfile

 

GitHub - sjm767/docker-compose-storage: 상황별로 필요한 docker-compose 파일 모음

상황별로 필요한 docker-compose 파일 모음 . Contribute to sjm767/docker-compose-storage development by creating an account on GitHub.

github.com

   
FROM fluent/fluentd:edge-debian
 
# Use root account to use apt
USER root
 
RUN buildDeps="sudo make gcc g++ libc-dev" \
 && apt-get update \
 && apt-get install -y --no-install-recommends $buildDeps \
 && apt-get install -y build-essential \
 && apt-get install -y libmariadb-dev \
 && apt-get update \
 && sudo gem install fluent-plugin-mysql-replicator \

플러그인 설치 확인

$ gem list
 
...
fluent-plugin-mysql-replicator (1.0.2)
fluentd (1.15.3, 1.15.2)
...

 

docker-compose.yml

https://github.com/sjm767/docker-compose-storage/blob/main/docker/fluentd/mysql-elasticsearch/docker-compose.yml

 

GitHub - sjm767/docker-compose-storage: 상황별로 필요한 docker-compose 파일 모음

상황별로 필요한 docker-compose 파일 모음 . Contribute to sjm767/docker-compose-storage development by creating an account on GitHub.

github.com

 

Fluentd conf 구성

https://github.com/sjm767/docker-compose-storage/blob/main/docker/fluentd/mysql-elasticsearch/fluentd_mysql_elasticsearch.conf

 

GitHub - sjm767/docker-compose-storage: 상황별로 필요한 docker-compose 파일 모음

상황별로 필요한 docker-compose 파일 모음 . Contribute to sjm767/docker-compose-storage development by creating an account on GitHub.

github.com

 

[서비스 체크]

MySQL

//docker exec 명령어로 해당 컨테이너 이미지로 진입
$ docker exec -it 5254ea22bb91881d9a086449c89f74b71310040c97e44c0cda9871ea547
 
sh-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 45
Server version: 8.0.31 MySQL Community Server - GPL
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>

 

Elasticsearch

sh-5.0# curl -X GET localhost:9200
{
  "name" : "single-node",
  "cluster_name" : "es-singlenode-c",
  "cluster_uuid" : "JkGI8oRDRJKIVQ1m85UpIw",
  "version" : {
    "number" : "7.17.7",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "78dcaaa8cee33438b91eca7f5c7f56a70fec9e80",
    "build_date" : "2022-10-17T15:29:54.167373105Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

 

Kibana

http://localhost:5601로 확인

 

[기능테스트]

INSERT

create database myweb;
create table search_test(id int auto_increment, text text, PRIMARY KEY (id));
 
insert into search_test(text) values('aaa');

 

fluentd 로그

...
23 23:18:34 +0000 [info]: #0 mysql_replicator: finished execution :tag=>replicator.myweb.search_test.${event}.${primary_key} :rows_count=>1 :elapsed_time=>0.00 sec
 
2022-11-23 23:18:44 +0000 [info]: #0 mysql_replicator: finished execution :tag=>replicator.myweb.search_test.${event}.${primary_key} :rows_count=>1 :elapsed_time=>0.00 sec
 
2022-11-23 23:18:54 +0000 [info]: #0 mysql_replicator: finished execution :tag=>replicator.myweb.search_test.${event}.${primary_key} :rows_count=>1 :elapsed_time=>0.00 sec
 
2022-11-23 23:19:04 +0000 [info]: #0 mysql_replicator: finished execution :tag=>replicator.myweb.search_test.${event}.${primary_key} :rows_count=>1 :elapsed_time=>0.00 sec
 
2022-11-23 23:19:14 +0000 [info]: #0 mysql_replicator: finished execution :tag=>replicator.myweb.search_test.${event}.${primary_key} :rows_count=>1 :elapsed_time=>0.00 sec
...

elasticsearch 적재 확인

dev-tools에서 API호출

GET myweb/_search

 

UPDATE

MySQL 업데이트 쿼리 

update search_test set text='ddd' where text = 'aaa';

ES 확인

GET myweb/_search

 

[소감]

플러그인 설치과정이 너무 어렵다. 

플러그인을 설치할 때 특정 패키지에 dependancy가 있는데, gem으로 설치할 때 특정 라이브러리가 없으니 그냥 오류가 발생한다. 

이 부분을 해결하는데, 매우 많은 시간이 소모되었음.

 

오류메시지가 아래와 같은 내용이라서 처음에는 ruby 버전이 이상한지 체크했고, 

그 후에는 mysql이 안깔려 있어서 나는 오류인가 싶어서 설치하고, 경로를 잡아주는식으로 해결해보려고 했었다. 

    --without-mysql-config
    --with-mysqlclient-dir
    --without-mysqlclient-dir
    --with-mysqlclient-include
    --without-mysqlclient-include=${mysqlclient-dir}/include
    --with-mysqlclient-lib
    --without-mysqlclient-lib=${mysqlclient-dir}/lib
    --with-mysqlclientlib
    --without-mysqlclientlib
/usr/lib/ruby/2.7.0/mkmf.rb:1050:in `block in find_library': undefined method `split' for nil:NilClass (NoMethodError)
    from /usr/lib/ruby/2.7.0/mkmf.rb:1050:in `collect'
    from /usr/lib/ruby/2.7.0/mkmf.rb:1050:in `find_library'
    from extconf.rb:87:in `<main>'

하지만 이슈 페이지에 동일한 문제가 있었어서 따라하니 해결되었음.

libmariadb-dev 패키지 설치 후 해결된 것으로 보아.. db연결 관련 패키지..? 쪽으로 뭔가 의존성이 있었던 듯 하다. 

https://github.com/y-ken/fluent-plugin-mysql-replicator/issues/41 

 

생각보다 느리다

interval을 10초로 주었는데, 실제로 replicating이 되는 시점은 훨씬 더 뒤 시점이다. 

뭔가 최적화값이 더 있는 듯하다. 

 

es 적재 시 document를 수정할 필요가 있을 때 어떻게 해야할지 확인이 필요함.

'Data Pipeline > Fluentd' 카테고리의 다른 글

Fluentd vs Logstash 비교해보기..?  (0) 2022.10.30
Fluentd - Kafka 로컬 파이프라인 구축해보기  (0) 2022.10.30
Fluentd란?  (0) 2022.10.29