기존에는 MongoDB의 변경 로그를 감지하고, 변경된 데이터를 Elasticsearch 에 실시간 색인하는 monstache 를 사용하였다. 그러나 여러 이슈로 인해 MySQL 에 있는 데이터를 Elasticsearch 에 색인하는 방법으로 변경해야 했다.
이때 방법으로 Logstash 을 통해 로그를 수집하고 Elasticsearch 에 색인시켰다. 참고로 데이터는 실시간으로 보낼 필요가 없어 filebeat 를 따로 사용하지 않았고, schedule
옵션을 통해 주기적으로 작업을 실행시켰다.
version: "3"
services:
elasticsearch:
container_name: elasticsearch
restart: always
image: docker.elastic.co/elasticsearch/elasticsearch:8.8.1
ports:
- "9200:9200"
- "9300:9300"
environment:
- ES_JAVA_OPTS=-Xms2048m -Xmx2048m
- discovery.type=single-node
- xpack.security.enabled=false
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./elk/elasticsearch/data:/usr/share/elasticsearch/data
networks:
- default_bridge
logstash:
container_name: logstash
image: docker.elastic.co/logstash/logstash:8.8.1 # elasticsearch 와 같은 버전
build:
context: ./elk # mysql-connector-java 를 설치하기 위해 Dockfile 빌드
volumes: # input conf 설정파일을 컨테이너 내부 경로에 볼륨마운트
- ./elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
environment:
- "xpack.monitoring.enabled=false"
depends_on:
- elasticsearch
networks:
- default_bridge
networks:
default_bridge:
ipam:
driver: default
config:
- subnet: 172.16.1.0/24
경로: ./elk/Dockerfile
FROM docker.elastic.co/logstash/logstash:8.8.1
ENV MYSQL_CONNECTOR_J_VERSION 8.0.23
ENV MYSQL_CONNECTOR_J_URL <https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION.tar.gz>
# 드라이버 다운로드 및 복사
RUN curl -L -O $MYSQL_CONNECTOR_J_URL
RUN tar -xvf mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION.tar.gz
RUN cp mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION/mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION.jar /usr/share/logstash/mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION.jar
RUN rm -rf mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION.tar.gz mysql-connector-java-$MYSQL_CONNECTOR_J_VERSION
CMD ["logstash", "-f", "/usr/share/logstash/pipeline/logstash.conf"]
Logstash 는 DB 와 연결하기 위해선 connector 가 꼭 필요하다!
협업 프로젝트이므로 로컬에 다운 받는 방식은 지양했고, Dockerfile 로 설치했다.
빌드하면 다음과 같이 설치된다.