인프라,데이터/Elasticsearch, Logstash, Kibana

도커로 ELK 환경 만들기 - 멀티 노드

AimB 2021. 7. 2. 21:15

Docker-compose.yml

version: '2.2'
services:
# master-node의 Docker 서비스입니다.
# Kibana에서 기본적으로 호출하는 ES host주소가 'http://elsaticsearch:9200'이기 때문에 서비스명은 elasticsearch로 쓰시는게 편합니다. 
# 다른 서비스명을 사용시 Kibana ES host 설정도 같이 추가해주어야 정상 동작합니다.
  elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    environment:
# ES Cluster명입니다. ES 서비스마다 동일한 명칭을 사용해야합니다.    
      - cluster.name=docker-cluster
# ES Node명을 설정합니다.
      - node.name=master-node1
# ES운영중 메모리 스왑을 막기 위한 설정을 추가합니다.
# 자세한 설명은 페이지 하단의 [Disable swapping]을 참고하세요.
      - bootstrap.memory_lock=true
# JVM Heap메모리 설정입니다. Xms/Xmx 옵션은 항상 같게 설정합니다.  
# 자세한 설명은 페이지 하단의 [Setting the heap size]을 참고하세요.
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 리눅스 시스템 자원제한 관련 옵션입니다.
# ES는 많은 파일디스크립터와 핸들러를 사용하기 때문에 제한 해제가 필요합니다.
# 자세한 설명은 페이지 하단의 [File Descriptors]을 참고하세요.
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es1:/usr/share/elasticsearch/data
# Kibana에서 본 노드를 호출하기 때문에 외부 9200포트는 master-node에 연결해줍니다.
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - esnet
# 컨테이너에 bash로 붙고 싶을경우 아래 두 옵션을 추가해주면 됩니다.
    stdin_open: true
    tty: true
# data-node의 Docker 서비스입니다.
# 대부분의 내용이 master-node와 동일하나 몇가지 차이점이 있습니다.
  elasticsearch2:
    container_name: elasticsearch2
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    environment:
      - cluster.name=docker-cluster
      - node.name=data-node1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 다른 Cluster내 노드를 발견하기 위한 설정입니다.
      - "discovery.zen.ping.unicast.hosts=elasticsearch"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es2:/usr/share/elasticsearch/data
# 외부 연결포트가 master-node와 겹치기 때문에 다르게 설정했습니다.
    ports:
      - 9301:9300
    networks:
      - esnet
    stdin_open: true
    tty: true
# 각 서비스를 순차적으로 실행하기 위해 설정해주었습니다. (필수아님) 
    depends_on:
      - elasticsearch

  elasticsearch3:
    container_name: elasticsearch3
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    environment:
        - cluster.name=docker-cluster
        - node.name=data-node2
        - bootstrap.memory_lock=true
        - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 다른 Cluster내 노드를 발견하기 위한 설정입니다.
        - "discovery.zen.ping.unicast.hosts=elasticsearch"
    ulimits:
        memlock:
            soft: -1
            hard: -1
    volumes:
        - es3:/usr/share/elasticsearch/data
# 외부 연결포트가 master-node와 겹치기 때문에 다르게 설정했습니다.
    ports:
        - 9302:9300
    networks:
        - esnet
    stdin_open: true
    tty: true
# 각 서비스를 순차적으로 실행하기 위해 설정해주었습니다. (필수아님) 
    depends_on:
        - elasticsearch
        
# Kibana 설정입니다.
  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:6.3.2
    ports:
      - 5601:5601
    networks:
      - esnet
    depends_on:
      - elasticsearch
      - elasticsearch2
      - elasticsearch3


  logstash:
    container_name: logstash
    image: docker.elastic.co/logstash/logstash:6.3.2
    ports:
        - 5000:5000
    networks:
        - esnet
    depends_on:
        - elasticsearch
        - elasticsearch2
        - elasticsearch3

volumes:
  es1:
    driver: local
  es2:
    driver: local
  es3:
    driver: local
networks:
  esnet:

 

추가

curl 명령어로 json 파일 elasticsearch에 넣기

다음과 같은 형태의 json 파일을 준비한다.

 

file.json

{ "create": { "_index": "dog1", "_type": "blog", "_id": "123" }}
{ "title":    "bark" }
{ "index":  { "_index": "dog2", "_type": "blog", "_id": "123" }}
{ "title":    "barkbark" }

 

docker-compose up 으로 도커 컨테이너가 구동되면 다른 터미널을 열고

curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/x-ndjson' --data-binary @'file.json'

명령어를 입력한다.

그리고 Elasticsearch Head 크롬 플러그인을 설치해 확인하면

인덱스와 Document가 들어간 것을 확인할 수 있다.