logstash - shut down and restart

00_8_3·2023년 7월 29일
0

엘라스틱서치

목록 보기
2/4

logstash

mysql과 Elasticsearch간의 데이터 동기화를 위해
mysql connector와 logstash를 사용하였다.

간단한 실험을 위해 docker-compose를 사용했다.

docker-compose.yaml

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

조금의 시행착오 끝에 위 모든 컨테이너가 실행이 되었고
컨테이너들의 실행 순서도 보장하였다.

  1. mysql 실행 및 데이터 삽입
  2. es 실행
  3. logstash 실행 및 kibana 실행

실행된 logstash는 매 5초마다 mysql에 폴링을 하여 es에 동기화를 하였고
키바나를 통해 확인이 가능했다.

mysql 데이터에 대한 삽입과 수정에 대해 es에 동기화가 잘되는 것을 확인을 하였는데

로그스태쉬의 이상현상을 알게되었는데

계속 반복되는 shut down과 restart 였다.

컴포즈의 설정에 따라 계속 restart가 되는 것은 알수 있지만 왜 종료가 되는지 찾아보았다.

1 메모리 부족?

JVM 스택 답게 환경변수를 통해 메모리 설정을 할수 있었는데

기존 LS_JAVA_OPTS: "-Xms256m -Xms256m"가 부족한가 싶어
512로 수정하여 재실행 하였지만
위 문제가 아니었다.

2 중복 실행?

logstash 도커 설정 중에

볼륨 마운트를 통한 conf 주입이 있고

command: ["logstash", "-f", "/usr/share/logstash/pipeline/logstash.conf"] 과 같이 해당 실행에 대한 커맨드가 설정되어 있었다.

하지만 해당 실행이 없어도 docker entry point로
/usr/share/logstash/pipeline/logstash.conf 위치로 파일이 마운트가 되면
실행되는 것을 알고 위 command를 지우고 재실행하였다.

그치만 여전히 계속 shut down..

3 health check 문제 [해결]

엉뚱맞게도 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가 실행된거지 ??

0개의 댓글