백과 블로그
홈블로그소개

백과의 개인 블로그 입니다. Contact : ksu9801@gmail.com

Spring BootElasticSearchKibanaLogstashBits

[TECH SERIES] 엘라스틱 스택 시작! 도입과 설치

백과
2025년 7월 30일
5분 읽기
목차
📦 엘라스틱 스택
🎯 목표
📚 시리즈 목표
🚀 도입
📝 엘라스틱 서치를 사용하는 이유
📝 엘라스틱 스택 개요
🛠️ 설치하기
📌 도커 네트워크 생성
📌 Elastic Search 이미지 풀
📌 Elastic Search 컨테이너 생성
📌 Kibana 설치
📌 Kibana 접속
📌 ElasticSearch 힙 메모리 설정
📌 힙 메모리 설정 주의사항
⏭️ NEXT

목차

📦 엘라스틱 스택
🎯 목표
📚 시리즈 목표
🚀 도입
📝 엘라스틱 서치를 사용하는 이유
📝 엘라스틱 스택 개요
🛠️ 설치하기
📌 도커 네트워크 생성
📌 Elastic Search 이미지 풀
📌 Elastic Search 컨테이너 생성
📌 Kibana 설치
📌 Kibana 접속
📌 ElasticSearch 힙 메모리 설정
📌 힙 메모리 설정 주의사항
⏭️ NEXT

시리즈 링크

  • [TECH SERIES] 엘라스틱 스택 시작! 도입과 설치
  • 임시2

image

📦 엘라스틱 스택

  • 해당글은 시작하세요! 엘라스틱 스택 8 책과, 김종민님의 Elastic Search 가이드북, 공식문서를 기반으로 학습과 동시에 정리됩니다.
  • 따라서, 보다 효율적인 접근 방식이 있을 수 있고 정답이 아닐 수 있습니다.

🎯 목표

📚 시리즈 목표


  • 해당 시리즈에서는, ELK 스택에 대한 전반적인 내용을 학습합니다.
    • ELK 스택을 통한 검색 엔진 개발
    • ELK 스택을 활용한 로깅 시스템 개발
  • 두가지 목표 모두, SpringBoot 기반으로 진행 될 예정입니다.

🚀 도입

📝 엘라스틱 서치를 사용하는 이유


  • 엘라스틱 서치는 중앙집중식 로깅 및 빅테이터 관련 유스케이스 처리의 표준처럼 자리잡게 되었습니다.
  • 많은 국내 기업과 다양한 해외 기업들에서 많이 사용되고 있습니다.
  • 검색 엔진으로써는 부동의 1위이며, 데이터베이스 측면에서도 상당히 높은 점유율을 가지고 있습니다.

image

📝 엘라스틱 스택 개요


  • 엘라스틱 스택은 4가지 제품으로 구성되어있습니다.
  • 엘라스틱 서치
    • 전문 검색 엔진이자, 데이터 저장소 입니다. 대용량 데이터를 저장하고 검색과 집계를 신속하게 처리할 수 있습니다.
  • 키바나
    • 사용자용 인터페이스 입니다.
    • 시각화 자료를 검색하고 생성할 수 있고, 엘라스틱 서치를 관리할수도 있습니다.
    • 검색, 보안, 가관측성 같은 유스케이스를 위해 바로 사용 가능한 솔루션도 제공합니다.
  • 비츠
    • 비츠는, 다양한 소스 시스템에서 데이터를 수집하고 곧바로 로그스테이시나 엘라스틱 서치로 전송합니다.
  • 로그스테이시
    • 로그 스테이시는 ETL(추출, 변환, 저장) 도구로서 다양한 소스의 데이터를 가공해 엘라스틱 서치로 수집합니다.
  • 즉, 로그스테이시와 비츠를 통해 데이터를 가져와 엘라스틱 서치에 저장하고, 조회를 위해 엘라스틱 서치를 활용하거나, 키바나를 활용해 시각화 하여 확인하는 구조입니다.

더 깊이 들어가면, 내부 구조 등도 담을 수 있지만, 분석의 글이 아닌, 활용법에 대한 시리즈이기 때문에 최대한 관련 있거나 알아야 되는 내용만 담을 예정입니다.

🛠️ 설치하기

  • 엘라스틱 스택 설치는 다양한 플랫폼(윈도우, 리눅스, 컨테이너)에서 설치할 수 있습니다.
  • 또한, 클라우드 기반으로 지원해주거나 Ansible 을 인프라 도구를 활용해 설치할 수도 있습니다.
  • 모든 내용을 소개할 수 없기 때문에, 해당 과정에서는 Docker기술을 활용해 설치를 진행하겠습니다.
  • 모든 내용은, 공식 문서 를 기반으로 작성됩니다.
  • Docker와 Docker-compose, Gitbash 와 같은 Shell 터미널이 설치되어야 합니다.

대신, 링크를 공유드립니다

  • Mac, 리눅스 설치 가이드
  • RPM 기반 설치 가이드
  • 윈도우 설치 가이드

📌 도커 네트워크 생성


  • Elastic Stack 끼리 원할한 통신을 위해서 network 를 하나 생성해줍니다.
$ docker network create elastic
  • 정상적으로 생성이 되었다면, 다음 명령어를 통해 생성 확인을 해줍니다.
$ docker network ls | grep 
f64e96347415   elastic                   bridge    local

📌 Elastic Search 이미지 풀


  • ElasticSearch 의 Docker 공식 이미지를 pull 받아 줍니다.
  • ElasticSearch Dockerhub에서 가장 최신버전의 태그를 사용하겠습니다. (9.0.4)

항상 최신버전이 좋은 선택은 아닙니다. 학습 목적임으로, 최신버전으로 채택하여 사용하도록 하겠습니다.

$ docker pull elasticsearch:9.0.4
  • 마찬가지로, 잘 다운로드 되었는지 명령어를 통해 확인합니다.
$ docker images | grep elasticsearch
elasticsearch                   9.0.4     088eded016ff   7 days ago      1.37GB
  • 최근에는 이러한 도커 이미지또한, 정식적으로 해당 회사에서 배포되었는지 확인하기 위해 디지털 서명을 검사합니다.
  • 해당 포스트에서는 다루지 않으나, 필요하신 분은 공식문서의 Cosign 부분을 통해 진행하시면 됩니다.

📌 Elastic Search 컨테이너 생성


  • 다운로드 된 이미지를 활용해 컨테이너를 생성해줍니다.
docker run --name es01 --net elastic -p 9200:9200 -d elasticsearch:9.0.4
  • 잠시 기다리면, 컨테이너가 생성되며 초기화를 자동으로 진행합니다.
  • 공식 홈페이지에서는 -it 옵션을 사용해 접속 및, -m 옵션으로 최대 메모리를 지정하도록 설정되어있습니다.
  • 정상적으로 기동이 되었다면, https://localhost:9200 으로 접근합니다.

image

  • 다음과 같이 사용자 이름과 비밀번호를 입력하도록 나오게 되는데, 사용자 이름은 elastic 입니다.
  • 최초 기동 시, docker logs es01 명령어를 통해 초기 비밀번호가 나옵니다.
  • 만약 로그로 확인이 되지 않으면 reset을 한번 해줘야 합니다.
$ docker exec -it es01 bin/elasticsearch-reset-password -u elastic
 
WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
 
 
Password for the [elastic] user successfully reset.
New value: _-nfLi4d5zXTBwrTmY4T
  • 이제 그대로 사용자 이름에 elastic 과 새로 설정된 비밀번호를 넣으면 다음과 같이 정상 동작이 됨을 확인할 수 있습니다.

image

📌 Kibana 설치


  • 시각화 도구인 Kibana 를 설치합니다.
  • 먼저 도커 이미지를 pull 해줍니다.
  • 마찬가지로 Kibana dockerhub를 확인하고 진행합니다.
$ docker pull kibana:9.0.4
  • 다음으로, 컨테이너를 실행해줍니다.
  • 이때, elasticsearch와 동일하게 같은 도커 네트워크에 넣어 줍니다.
$ docker run --name kibana01 --net elastic -p 5601:5601 -d kibana:9.0.4
  • 실행이 완료 되었다면, 명령어를 통해 실행 상태를 확인합니다.
$ docker ps | grep kibana01
54ba0271f5da   kibana:9.0.4          "/bin/tini -- /usr/l…"   About a minute ago   Up About a minute   0.0.0.0:5601->5601/tcp             kibana01

📌 Kibana 접속


  • Kibana는 앞서 사용자용 인터페이스라고 설명하였습니다.
  • Kibana를 통해, Elastic Search를 제어하고, 데이터를 시각화하여 볼 수 있습니다.
  • 5601 포트로 실행하였기 때문에, http://localhost:5601 로 접속합니다.

image

  • 다음과 같이, Enrollment token을 요구합니다.
  • Enrollment Token은 ElasticSearch와 Kibana를 연결해주는 1회용 인증 토큰입니다.
  • ES 에 명령어를 사용하여 enrollment token 을 발급받도록 하겠습니다.
$ docker exec -it es01 bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTcyLjE4LjAuMjo5MjAwIl0sImZnciI6IjkxN2ZhOWZmYzE3N2U5YjIzNDcyMDYzM2JmZjBhOGUzNDEyYTMyZjBkYmNiZjY0MzllYTEwY2RjNWZiMjNiNzciLCJrZXkiOiJEVjl6V3BnQnVwMVMxUnBSMn
dzRDpyZlBDRUY0ZERvTDlQeVh2X25qVDVBIn0=

공식 홈페이지에서는 다음과 같은 명령어를 제공합니다. docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana 윈도우 환경에서는 shell 환경 차이로 인해, 해당 명령어가 경로 문제로 실행되지 않을 수가 있습니다. 핵심은, es01 컨테이너의 bin 폴더 안의 저 실행 파일을 실행하는게 목적이므로, 위의 명령어로 대체하여 사용합니다.

  • 명령어가 정상적으로 실행되면, 30분간 유효한 토큰을 발행해주는데 이를 복-붙 해줍니다.

image

  • 다음으로 또 인증을 해줘야 합니다.
  • bin/kibana-verfication-code.bat을 실행시켜 코드를 확인합니다.
docker exec -it kibana01 bin/kibana-verification-code
Your verification code is:  455 931

image

  • 정상적으로 등록이 되었다면, 다음과 같이 초기화를 진행한 후, username과 password 를 입력하여 실행합니다.
  • 위에서 알아봤던 es 의 아이디/비밀번호 입니다.

image

  • 다음 화면이 나오면 Explore on my own 을 눌러 넘어가줍니다.
  • 현재 설정이 완료되었고, 외부 데이터 소스를 연결해서 데이터를 관리 하라는 메시지 입니다.

📌 ElasticSearch 힙 메모리 설정


  • 엘라스틱 서치는 JVM(자바 가상 머신)에서 실행됩니다.
  • 대부분의 JVM 설정은 거의 변경할 필요가 없지만, 프로덕션 클러스터 힙 크기는 거의 항상 설정해야 합니다.
  • 엘라스틱 서치는, 데이터를 색인하고 검색하는데 많은 힙 메모리를 사용하게 됩니다.
  • 최소 2GB RAM 용량을 사용하고, 최소 힙 사이즈는 1GB 이상을 필요합니다.
    • 이후 상세하게 포로덕션 용도에 맞게 엘라스틱서치 클러스터의 크기를 조정하는 방법은 별도의 포스팅으로 다루겠습니다.
  • 노드 작업 중, 리소스를 많이 소모하는 메모리 할당 프로세스를 방지하려면 최소 힙 크기와 최대 힙 크기를 동일한 값으로 설정하는 것이 좋습니다.
  • 또한, 노드에서 사용 가능한 메모리의 절반 정도를 JVM 힙에 할당하는 것 또한 best practice 입니다.

  • 다음 명령어를 사용하여, elasticsearch컨테이너에 접근해서, jvm.options 파일을 변경합니다.
  • 마찬가지로 공식문서의 메뉴얼 힙메모리 설정 파트와 공식문서의 설정 방법 등을 참고하여 작성하였습니다.
# es01 컨테이너 bash 접근
$ docker exec -it es01 bash
# 최소/최대 힙 사이즈 1GB 로 고정
$ echo -e "-Xms1g\n-Xmx1g" > /usr/share/elasticsearch/config/jvm.options.d/heap.options
 
# 컨테이너 접속 해제 후, 컨테이너 재시작
$ exit
$ docker restart es01
 
# 메모리 설정 확인
$ docker exec -it es01 ps aux | grep java
# 윈도우 환경에서 git bash 를 사용한다면
$ docker exec es01 ps aux | grep java

📌 힙 메모리 설정 주의사항


  • 인터넷에 있는 많은 글을 보면, 환경변수로 ES_JAVA_OPTS 을 많이 소개합니다.
  • 공식문서에서는 테스트 시에 해당 방법을 추천하고, 배포/운영 환경에서는 위와 같은 jvm.options.d와 같은 파일 기반 설정을 권장합니다.
  • 관리, 변경, 이력 추적 등 부분에 대해 더 이득이 있기 때문이겠죠

image

⏭️ NEXT

  • 다음으로는, ElasticSearch를 활용하여 데이터를 인덱싱하고 조회하는 방법에 대해서 간략하게 확인해보겠습니다.
  • elasticsearch.yml, kibana.yml 등 구성 옵션에 대한 설명은 별도의 포스팅으로 진행 할 예정입니다.
  • docker-compose 로의 구성 또한, 위 yml 등을 통한 설정이 많아지면 바인드 마운트를 사용하며 처리하지 않을까 싶습니다.