강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

sugmug님의 프로필 이미지
sugmug

작성한 질문수

실리콘밸리 엔지니어와 함께하는 Elasticsearch

Replication 설정 후에도 node가 1개만 조회됩니다.

해결된 질문

작성

·

55

0

안녕하세요. 강사님,

 

"Elasticsearch Replication(복제)에 대해 알아보자" 강의에서 동일하게

'docker-compose-mult.yml' 파일을 작성하고 compose 실행까지는 성공했는데

노드의 숫자가 1개이고 shard도 P인 것들만 나옵니다. 이유가 뭘까요? ㅠ

compose파일내용 공유드립니다.

 


version: "3.8"

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local
  # metricbeatdata01:
  #   driver: local
  # filebeatdata01:
  #   driver: local
  # logstashdata01:
  #   driver: local

networks:
  default:
    name: elastic
    external: false

services:
  setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
      bash -c '
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo "Set the KIBANA_PASSWORD environment variable in the .env file";
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo "Creating CA";
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          "  - name: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          "  - name: kibana\n"\
          "    dns:\n"\
          "      - kibana\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          > config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
      '
    healthcheck:
      test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
      interval: 1s
      timeout: 5s
      retries: 120

  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    labels:
      co.elastic.logs/module: elasticsearch
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      # - discovery.type=single-node
      - discovery.seed_hosts=es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${ES_MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120
  es02:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    labels:
      co.elastic.logs/module: elasticsearch
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata02:/usr/share/elasticsearch/data
    # ports:
    #   - ${ES_PORT}:9200
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      # - discovery.type=single-node
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${ES_MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120
  es03:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    labels:
      co.elastic.logs/module: elasticsearch
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata03:/usr/share/elasticsearch/data
    # ports:
    #   - ${ES_PORT}:9200
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      # - discovery.type=single-node
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${ES_MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  kibana:
    depends_on:
      es01:
        condition: service_healthy
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    labels:
      co.elastic.logs/module: kibana
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
      - XPACK_SECURITY_ENCRYPTIONKEY=${ENCRYPTION_KEY}
      - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=${ENCRYPTION_KEY}
      - XPACK_REPORTING_ENCRYPTIONKEY=${ENCRYPTION_KEY}
    mem_limit: ${KB_MEM_LIMIT}
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

답변 2

1

미쿡엔지니어님의 프로필 이미지
미쿡엔지니어
지식공유자

안녕하세요 sugmug님,

제가 자료실에 있는 파일이 혹시 문제 있나 싶어 해봤는데 문제 없이 잘 되는 것 확인했습니다. 혹시 안되신다면, Docker Desktop UI로 가셔서 기존의 ContainerVolume을 지워보시고 다시 시작해보세요.

지우시기 전에는 일단 디렉토리에서 docker compose down을 하신다음에 지우시면 UI 에서 컨테이너에 볼륨이 걸려있다는 에러가 안납니다.

Screenshot 2025-05-07 at 8.27.05 PM.pngScreenshot 2025-05-07 at 8.27.16 PM.png

 

Screenshot 2025-05-07 at 8.29.31 PM.png
sugmug님의 프로필 이미지
sugmug
질문자

container와 volume 모두 삭제하고 다시 compose up 하니 node 3개로 잘 나옵니다!

감사합니다~!

sugmug님의 프로필 이미지
sugmug
질문자

제가 질문을 남기기전 gpt답변 참고해서 docker container prune 과 docker network prune 명령어를 사용했었는데 이게 원인이었을까요?

미쿡엔지니어님의 프로필 이미지
미쿡엔지니어
지식공유자

아닙니다. 그건 관련이 별로 없는 명령어였습니다. 잘되서 다행이네요

0

안녕하세요, 인프런 AI 인턴입니다. sugmug님.

Elasticsearch의 Replication 설정 후 노드의 숫자가 1개만 조회되신다는 문의를 주셨네요. 이 문제는 여러 가지 원인에 의해 발생할 수 있습니다. 주의 깊게 확인해 보아야 할 사항을 아래에 안내해 드리겠습니다.

1. 환경 변수 체크

  • 설정 파일에서 ${STACK_VERSION}, ${CLUSTER_NAME}, ${ES_PORT}, ${ELASTIC_PASSWORD}와 같은 환경 변수들이 모두 올바르게 설정되어 있는지 확인하세요.

2. 네트워크 설정 확인

  • docker-compose에서 network 구성이 있는데, 클러스터 내의 모든 노드가 동일한 네트워크 설정을 참조하고 있는지 확인해 보세요. 모든 노드가 기본적으로 같은 elastic 네트워크에 연결되어야 합니다.

3. 건강 상태 확인

  • 각 Elasticsearch 노드의 healthcheck가 제대로 통과되는지도 확인해 보세요. 각 노드의 로그를 확인하여 연결 또는 설정 문제를 나타내는 오류 메시지가 있는지 검토하시기 바랍니다.

4. 클러스터 초기 설정 확인

  • cluster.initial_master_nodes 설정이 올바르게 포함되어 있는지 확인해 보세요. 이 설정은 클러스터 초기에 어떤 노드들이 마스터 노드 후보가 될지를 정합니다. es01, es02, es03이 모두 포함되어 있어야 합니다.

5. 인증서 및 보안 설정 확인

  • 인증서 생성과 관련된 오류가 발생할 수 있습니다. setup 서비스에서 인증서가 올바르게 생성되고 있는지 체크하고, 필요한 모든 인증 파일이 존재하는지 확인해 보세요.

6. 로그 확인

  • docker logs 컨테이너_ID 명령을 사용하여 각 컨테이너의 로그를 확인하고, 오류 메시지를 찾아보세요. 이는 문제 해결에 도움이 될 수 있습니다.

이와 관련하여 도움이 될 만한 기존 질문과 답변을 확인하실 수 있습니다:

위의 점검사항들을 확인하며 문제 해결에 도움이 되었기를 바랍니다. 추가적인 질문이나 문제가 발생하면 언제든지 말씀해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

sugmug님의 프로필 이미지
sugmug

작성한 질문수

질문하기