본문 바로가기

데이터베이스/ELK

[Elasticsearch] 다른 서버에서 클러스터 구성 (노드 연동) with. docker-compose

요구사항에서 3개의 서버의 엘라스틱서치 서버를 구동하고 각 엘라스틱서치 서버에는 싱글 노드로 운영되고 있다.
3개의 서버 엘라스틱서치의 각 노드들을 하나의 클러스터로 묶어서 수명 주기 정책을 적용하려고 한다.

그러기 위해서는 먼저 각각의 싱글노드 3개를 하나의 클러스터로 연동시켜야 하는데, 여러 에러를 많이 만났다. 이러한 에러를 사전에 방지하고 실수를 회고하고자 글을 쓰려고 한다.

 

 

먼저, 본인은 3개의 엘라스틱서치 서버를 열어야 하지만 연동 테스트하기 위해서 먼저 두 개의 서버를 먼저 연동시키려고 한다.

클라우드 환경은 GCP를 이용하였고, 서비스 출시를 목표로 하는 것이기 때문에 docker-compose를 이용하였다.

 

여러 서버에서 하나의 클러스터로 실행하기 위해서는 엘라스틱서치 포트에 대해서 이해하고 있어야 한다. 

각 서버의 노드는 9200이고, 클러스터는 9300 포트이다. 즉, 연동하기 위해서는 클러스터 포트인 9300으로 연동해야하고 클러스터 네임은 같아야 한다.

 

Elasticsearch의 노드들은 클라이언트와의 통신을 위한 http 포트(9200~9299), 노드 간의 데이터 교환을 위한 tcp 포트 (9300~9399) 총 2개의 네트워크 통신을 열어두고 있다. 일반적으로 1개의 물리 서버마다 하나의 노드를 실행하는 것을 권장하고 있다. 3개의 다른 물리 서버에서 각각 1개 씩의 노드를 실행하면 각 클러스터는 다음과 같이 구성된다. 결론은 각각 노드와 클러스터 포트의 디폴트 값은 9200, 9300이 된다는 것이다. 

 

 

이제는 docker-compose .yml 파일을 확인해 볼 것이다.

# es-2-node
services:
  elasticsearch-2:
    restart: unless-stopped
    build: ./elasticsearch
    container_name: es-2 ## 실제로 컨테이너 이름은 elk__1_elasticsearch 로 생성된다.
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,z
      - ./elasticsearch/config/dict.txt:/usr/share/elasticsearch/config/dict.txt
      - ./elasticsearch/data:/usr/share/elasticsearch/data
    environment:
      - TZ=Asia/Seoul
      - ELASTIC_PASSWORD=elasticpassword
      - cluster.name=docker-cluster
      - node.name=es-2-node
      - node.master=true
      - node.data=true
      - network.bind_host=0.0.0.0
      - network.publish_host=사설ip(2)
      - transport.publish_port=9300
      - http.publish_port=9200
      - discovery.seed_hosts=사설ip(2),사설ip(3)
      - cluster.initial_master_nodes=es-2-node,es-3-node
      - http.port=9200
      - transport.tcp.port=9300
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300
# es-3-node
services:
  elasticsearch-3:
    restart: unless-stopped
    build: ./elasticsearch
    container_name: es-3
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,z
      - ./elasticsearch/config/dict.txt:/usr/share/elasticsearch/config/dict.txt
      - ./elasticsearch/data:/usr/share/elasticsearch/data
    environment:
      - TZ=Asia/Seoul
      - ELASTIC_PASSWORD=elasticpassword
      - cluster.name=docker-cluster
      - node.name=es-2-node
      - node.master=true
      - node.data=true
      - network.bind_host=0.0.0.0
      - network.publish_host=사설ip(3)
      - transport.publish_port=9300
      - http.publish_port=9200
      - discovery.seed_hosts=사설ip(2),사설ip(3)
      - cluster.initial_master_nodes=es-2-node,es-3-node
      - http.port=9200
      - transport.tcp.port=9300
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300

 

여기서 중요한 부분은 

discovery.seed_hosts 부분과 cluster.initial_master_nodes 옵션 부분이다.

discovery.seed_hosts은 연동할 엘라스틱서버의 사설 ip를 전부 입력한다.

cluster.initial_master_nodes은 마스터 노드의 후보를 설정하는 옵션이다.

 

 

+ 22.08.19 추가 사항

현재 엘라스틱 서버의 node 데이터 경로가 아래의 경로에 있다.

/docker_projects/elk__1/elasticsearch/data

 

이 데이터는 해당 클러스터에 연동된 노드의 데이터가 저장되어 있는데, 만약에 싱글 노드로 실행시켰었더라면 이 데이터를 삭제해서 다시 생성할 필요가 있다. 생성은 docker-compsoe.yml에 작성했으므로 연동하기 위해서는 삭제를 해야한다.

 

삭제를 하고 나서 도커 컴포즈로 엘라스틱서치를 실행시키면 데이터 파일의 권한을 부여해야 실행이 된다.

sudo chmod 777 /docker_projects/elk__1/elasticsearch/data