mysql-replicator를 활용한 MySQL - Elasticsearch Sync
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을 통해 커스텀 이미지 빌드가 필요하다.
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
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 구성
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이 되는 시점은 훨씬 더 뒤 시점이다.
뭔가 최적화값이 더 있는 듯하다.