DEV/ElasticSearch & Lucene

ElasticSearch Tutorial | 02. Cluster 구성해보기

행운개발자 2023. 10. 29. 12:40
728x90

ElasticSearch Cluster 구성하기

standalone으로 구성해볼 때 사용했던 디렉토리 구조는 아래와 같습니다.

./standalone
├── elasticsearch-7.15.0 // 이 디렉토리 전체를 복사
│   ├── LICENSE.txt
│   ├── NOTICE.txt
│   ├── README.asciidoc
│   ├── bin
│   ├── config
│   ├── data // 직전 실행 과정에서 남아있던 파일을 삭제
│   ├── jdk.app
│   ├── lib
│   ├── logs // 직전 실행 과정에서 남아있던 파일을 삭제
│   ├── modules
│   └── plugins
└── elasticsearch-7.15.0-darwin-x86_64.tar.gz

cluster로 구성하기 위해 elasticsearch-7.15.0 디렉토리 전체를 복사해서 아래와 같이 구성합니다.

hwanseok@air study % tree -L 2 ./cluster ./standalone
./cluster
├── es1
│   └── elasticsearch-7.15.0
├── es2
│   └── elasticsearch-7.15.0
└── es3
    └── elasticsearch-7.15.0

ElasticSearhc Cluster로 실행하기 :: tar 파일로 실행하기

standalone으로 실행할 때와 똑같이 ./bin.elasticsearch를 실행하면 됩니다. 별도의 설정은 필요없습니다.

이렇게 아무던 설정을 해주지 않아도, port가 9200, 9201, 9202로 자동으로 설정됩니다.

개별 노드의 정보도 확인할 수 있고

curl http://127.0.0.1:9200

클러스터 전체의 정보도 확인할 수 있습니다

// 테이블 뷰
curl http://127.0.0.1:9200/_cat/nodes?v
// json
curl http://127.0.0.1:9200/_cat/nodes?format=json&pretty

만약 3개의 ES가 하나의 cluster로 인식되지 않는다면

직전 실행에서 남아있던 잔여 파일까지 cp 된 영향일 수 있습니다. /data, /logs 디렉토리 하위의 파일을 삭제해주면 해결됩니다.

├── elasticsearch-7.15.0
│   ├── LICENSE.txt
│   ├── NOTICE.txt
│   ├── README.asciidoc
│   ├── bin
│   ├── config
│   ├── data // 직전 실행 과정에서 남아있던 파일을 삭제
│   ├── jdk.app
│   ├── lib
│   ├── logs // 직전 실행 과정에서 남아있던 파일을 삭제
│   ├── modules
│   └── plugins

/logs/gc.log 파일이 없어서 에러가 발생하는 경우 직접 생성해주시면 됩니다.

touch /logs/gc.log

cluster 구성시 필요한 설정들

설정을 지정하지 않으면 elasticsearch라는 cluster.name 이름이 설정되고 자동으로 같은 cluster로 설정됩니다.
하지만 직접 cluster의 이름, node의 이름, node의 역할을 직접 지정해주는 것이 좋습니다.

elasticsearch.yml 파일에서 설정할 수 있습니다.

클러스터의 상태를 조회해보면 node.role의 m/d가 설정된 것을 알 수 있습니다.

ElasticSearhc Cluster로 실행하기 :: docker-compose로 실행하기

docker-compose로 구성할 때에는 아래의 yml 파일을 사용할 수 있습니다. 아래 설정에서 TODO로 표기된 부분을 -01, -02, -03으로 변경해서 설정해주고 실행하면 됩니다.

version: '3.7'
services:
  es-node-01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    container_name: es-node-01 // TODO
    environment:
      - node.name=es-node-01 // TODO
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-node-01,host.docker.internal:9301,host.docker.internal:9302 // TODO
      - cluster.initial_master_nodes=es-node-01,es-node-02,es-node-03 // TODO
      - path.data=/usr/share/elasticsearch/data
      - path.logs=/usr/share/elasticsearch/logs
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nproc:
        soft: 1024000
        hard: 1024000
      nofile:
        soft: 1024000
        hard: 1024000
    sysctls:
      net.core.somaxconn: 65000
    healthcheck:
      test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cat/health || exit 1"]
      interval: 30s
      timeout: 30s
      retries: 3
    restart: always
    volumes:
      - node-data-01:/usr/share/elasticsearch/data:rw // TODO
      - node-logs-01:/usr/share/elasticsearch/logs:rw // TODO
#      - ${FULL-PATH-DATA}:/usr/share/elasticsearch/data:rw
#      - ${FULL-PATH-LOG}:/usr/share/elasticsearch/logs:rw
    ports:
      - 9200:9200 // TODO
      - 9300:9300 // TODO
    networks:
      - es-node-brodge-01
volumes:
  node-data-01: // TODO
    driver: local
  node-logs-01: // TODO
    driver: local
networks:
  es-node-brodge-01: // TODO
    driver: bridge
728x90