스프링부트/ELK

[ELK]엘라스틱 서치, 키바나 도커로 다운로드

삼록이 2025. 9. 18. 22:17

엘라스틱 서치란?

하나의 데이터베이스다. 다만, 단순한 데이터베이스라기보다는 빠른 검색을 위해 특화된 엔진이자 데이터베이스라고 보면 된다.

엘라스틱 서치는 JSON문서 단위로 데이터를 저장하고 이를 역색인(Invered Index)구조로 관리한다.

 

*역색인(Inverted Index)란?

일반적인 데이터베이스는 row 단위로 데이터가 저장되고, 전체를 스캔하여 검색한다.

그러나 엘라스틱 서치는 '단어'중심으로 인덱스를 만들어 놓는다.

(우리가 db를 사용할 때 인덱스를 설정할 수도 있으나 그것은 필드(컬럼)에다 인덱스를 거는 것이다.)

그래서 특정 단어로 검색할 때 , 해당 단어를 가진 문서  ID를 바로 찾을 수 있어 검색이 매우 빠르다.

 

 

키바나란?

엘라스틱 서치에 저장된 데이터를 검색,탐색,시각화할 수 있도록 해준다.

마치 mySQL에 GUI로 SQL벤치나 디비버를 사용하는 것처럼,

엘라스틱서치에 대한 GUI로 키바나를 사용하는 것이다.


docker-compose.yml파일을 만들고 아래를 복사한다.

 

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true 
      - ELASTIC_PASSWORD=changeme123
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      //여기에는 나중에 토큰을 넣을 것임//
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

volumes:
  es_data:
    driver: local

아래는 각 코드에 대한 설명이다.

위의 코드는 보안모듈을 true로 해놓았고 아래 설명에 적은 코드는 false로 해놓았다.

만약 간단한 테스트를 위해서라면 아래 코드로 복사하여 설명부분 지우고 docker compose up을 하면 한번에 엘라스틱서치와 키바나가 다운될 것이다.

 

그러나 본 포스트에서는 운영까지 고려하여 보안모듈을 true로 해놓은 상태(xpack.security.enabled부분)로 진행하고자한다. 

services: //아래에 실행할 컨테이너들을 정의(엘라스틱 서치와 키바나)
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0 (사용할 도커이미지)
    container_name: elasticsearch (컨테이너 이름)
    environment: (컨테이너 안에서 실행할 때 필요한 환경변수 설정)
      - discovery.type=single-node (단일 노드 모드)
      - xpack.security.enabled=false  (보안모듈 비활성화 false는 아이디/비번없이 접근가능, 운영에서는 true)
      - ES_JAVA_OPTS=-Xms1g -Xmx1g (자바 힙메모리 크기 설정 최소(Xms)-1GB, 최대(Xmx)-1GB고정
    ports:
      - "9200:9200" (호스트 PC의 9200포트를 컨테이너의 9200포트에 연결)
    volumes:
      - es_data:/usr/share/elasticsearch/data(컨테이너 안의 /usr~경로(데이터저장소)를 로컬 볼륨(es-data)에 연결
											(컨테이너 지워도 데이터는 유지됨)			

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 (키바나가 연결할 엘라스틱 서치 주소. 같은 네트워크에 있으니 localhost:9200이 아닌 elasticsearch:9200 사용)
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch (elasticsearch 컨테이너가 먼저 실행된 다음 kibana실행)

volumes:    //es_data라는 이름의 볼륨을 정의해서 위에서 정의한 elasticsearch서비스의 데이터 저장소와 연결됨)
  es_data:
    driver: local

 

 

-왜 자바 힙메모리 설정을 할까?

 

ElasticSearch는 자바 기반으로 만들어져서, 실행시 JVM 힙 메모리를 사용.

데이터를 메모리에 올려두고 검색/인덱싱 속도를 빠르게 하기 위해 사용하는 것인데

기본 설정값이 작으면 데이터가 많아질 때 OutOfMemeory 에러가 발생하게 되고

너무 크게 잡아도 OS캐시를 쓰지 못해 오히려 느려진다.

 

따라서 전체 메모리(RAM)의 50% 정도만 할당하는 것이 권장된다

ex.서버 RAM이 8GB면 -Xms4g -Xmx4g

 

-볼륨이란?

 

기본적으로 도커는 컨테이나 안에서 생상된 파일이나 데이터는 컨테이너가 삭제되면 같이 사라진다.

그런데 컨테이너를 실제 서비스에 사용하려면 DB데이터라든가 로그 파일 같은 건 컨테이너와 독립적으로 영구히 저장되어야할 필요가 있다. 그래서 필요한 것이 볼륨이다.

볼륨은 컨테이너 내부의 특정 디렉토리를 호스트 OS의 파일 시스템과 연결하는 것이다. 즉, 컨테이너 안에서 파일을 쓰더라고 실제로는 OS디스크에 기록되어 컨테이너를 삭제해도 데이터는 사라지지 않게 하는 것이다.

 

 


 

보안모듈 = true인 버전으로 진행한다면 docker compose up 명령어로 한번에 다운받지 말고

docker compose up -elasticsearch로 엘라스틱서치만 먼저 다운받는다.

 

보안모듈을 true로 해놓았기 때문에 키바나가 엘라스틱서치에 대한 토큰값이 없다면 연결이 되지 않는다.

따라서, 엘라스틱서치 컨테이너에 들어가서 아래 명령어로 키바나용 토큰을 발급받는다.

(그래서 엘라스틱 서치 먼저 따로 다운받은 것이다)

docker exec -it es01 bin/elasticsearch-service-tokens create elastic/kibana kibana-service

 

AAEAAWVsYXN0aWMva2liYW5hL2tpYmFuYS1zZXJ2aWNlOllWYkxLeVRpVFJDM0wwMi1Nc3hST3c 그러면 이런 토큰 값이 생긴다. 이걸 복사!

 

그런다음 아까 처음 작성했던 도커파일을 보면 //여기 나중에 토큰 넣을 것//이란 부분이 있다. 거기에 아래처럼 넣어주면 된다

(ELASTICSEARCH_SERVICEACCOUNTTOKEN 부분)

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=changeme123
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_SERVICEACCOUNTTOKEN=AAEAAWVsYXN0aWMva2liYW5hL2tpYmFuYS1zZXJ2aWNlOllWYkxLeVRpVFJDM0wwMi1Nc3hST3c
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

volumes:
  es_data:
    driver: local

 

그런다음 docker compose up -d kibana로 키바나도 다운받아준다.

 

 

그런다음 localhost:5601을 들어가면 로그인 페이지가 뜰것이다.

 

userName에는 elastic 입력하고

패스워드는 엘라스틱 서치 컨테이너를 처음 띄울 때 로그에 자동으로 생성된 비밀번호가 출력된다.

그러나 찾을 수 없어 그냥 새로 발급받았다.

 

윈도우 파워쉘에서 아래 명령어를 입력하면 아래 사진처럼 New value값이 나온다. 이것이 비밀번호다.

docker exec -it elasticsearch bin/elasticsearch-reset-password -u elastic

 

 

그러면 아래처럼 화면이 뜬다면 엘라스틱서치와 키바나가 잘 설치되고 연결된 것이다!