mysql과 Elasticsearch간의 데이터 동기화를 위해
mysql connector와 logstash를 사용하였다.
간단한 실험을 위해 docker-compose를 사용했다.
version: "3.7"
services:
mysql:
image: mysql:5
container_name: mysql
restart: always
platform: linux/amd64
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: test
MYSQL_USER: kim
MYSQL_PASSWORD: test1234
healthcheck:
test:
["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"]
interval: 30s
timeout: 10s
retries: 5
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
elasticsearch:
image: elasticsearch:7.16.1
container_name: elasticsearch
restart: always
environment:
- node.name=elasticsearch
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9200"]
interval: 30s
timeout: 10s
retries: 5
depends_on:
mysql:
condition: service_healthy
ports:
- "9200:9200"
ulimits:
memlock:
soft: -1
hard: -1
mem_limit: 1g
logstash:
image: logstash:7.16.1
container_name: logstash
restart: always
volumes:
- ./mysql-connector-java-8.0.26.jar:/usr/share/logstash/mysql-connector-java-8.0.26.jar
- ./logstash:/usr/share/logstash/pipeline
depends_on:
elasticsearch:
condition: service_healthy
mysql:
condition: service_healthy
environment:
LS_JAVA_OPTS: "-Xms512m -Xms512m"
kibana:
image: kibana:7.16.1
container_name: kibana
restart: always
ports:
- "5601:5601"
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200
depends_on:
elasticsearch:
condition: service_healthy
조금의 시행착오 끝에 위 모든 컨테이너가 실행이 되었고
컨테이너들의 실행 순서도 보장하였다.
실행된 logstash는 매 5초마다 mysql에 폴링을 하여 es에 동기화를 하였고
키바나를 통해 확인이 가능했다.
mysql 데이터에 대한 삽입과 수정에 대해 es에 동기화가 잘되는 것을 확인을 하였는데
로그스태쉬의 이상현상을 알게되었는데
계속 반복되는 shut down과 restart 였다.
컴포즈의 설정에 따라 계속 restart가 되는 것은 알수 있지만 왜 종료
가 되는지 찾아보았다.
JVM 스택 답게 환경변수를 통해 메모리 설정을 할수 있었는데
기존 LS_JAVA_OPTS: "-Xms256m -Xms256m"
가 부족한가 싶어
512로 수정하여 재실행 하였지만
위 문제가 아니었다.
logstash 도커 설정 중에
볼륨 마운트를 통한 conf 주입이 있고
command: ["logstash", "-f", "/usr/share/logstash/pipeline/logstash.conf"]
과 같이 해당 실행에 대한 커맨드가 설정되어 있었다.
하지만 해당 실행이 없어도 docker entry point로
/usr/share/logstash/pipeline/logstash.conf
위치로 파일이 마운트가 되면
실행되는 것을 알고 위 command를 지우고 재실행하였다.
그치만 여전히 계속 shut down..
엉뚱맞게도 mysql의 healthcheck 문제였다.
test 필드에 작성한 핑 커맨드에서 p1234
패스워드가 올바르게 작성이 안되어 있었다.
그로인해 mysql condition을 바라보고 있는 logstash에서
계속 재실행을 한 것이다.
참고
https://docs.docker.com/compose/compose-file/05-services/
https://www.paulsblog.dev/how-to-successfully-implement-a-healthcheck-in-docker-compose/
https://docs.docker.com/compose/startup-order/
https://docs.docker.com/engine/reference/builder/#healthcheck
yaml 설정을 잘 하자
https://stackoverflow.com/questions/31746182/docker-compose-wait-for-container-x-before-starting-y
스택오버플로를 보니 v3에서 depends_on 스펙이 삭제되었다가 나중에 다시 추가된 것으로 보인다.
https://github.com/compose-spec/compose-spec/blob/master/spec.md#long-syntax-1
의문점
헬스체크가 통과 되지 않았는데도 어떻게 es와 logstash가 실행된거지 ??