๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ ๊ณต๋ถ€

Elasticsearch์จ๋ณด์ž(1)

๐Ÿ” ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜(Elasticsearch)๋ž€?

Elasticsearch๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์ž…๋‹ˆ๋‹ค. ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, JSON ๊ธฐ๋ฐ˜์˜ RESTful API๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ฃผ์š” ํŠน์ง•

  • ๊ณ ์† ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„: ์ •ํ˜•, ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ถ„์‚ฐ ๊ตฌ์กฐ: ์ˆ˜ํ‰ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ˆ˜๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  • RESTful API: ๊ฐ„๋‹จํ•œ HTTP ์š”์ฒญ์œผ๋กœ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์กฐํšŒ, ์‚ญ์ œ ๋“ฑ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
  • ELK ์Šคํƒ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ (Elasticsearch, Logstash, Kibana ์ค‘ E)

๐Ÿ“ฆ ์–ด๋””์— ์“ฐ์ผ๊นŒ?

  • ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ (ex. ์„œ๋ฒ„ ๋กœ๊ทธ)
  • ๊ฒ€์ƒ‰ ์—”์ง„ (ex. ์‡ผํ•‘๋ชฐ, ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰)
  • ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” (Kibana์™€ ์—ฐ๋™)
  • ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ (APM, ์‹œ์Šคํ…œ ์ƒํƒœ ์ฒดํฌ)

๐Ÿ›  ์„ค์ • ์‹œ์ž‘ํ•˜๊ธฐ

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Elasticsearch๋ฅผ Docker๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์—ฌ nori ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋ฅผ ํฌํ•จ์‹œํ‚ค๊ณ , ์ดํ›„ docker-compose๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงฑ Step 1: Dockerfile๋กœ Elasticsearch ์ปค์Šคํ…€ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ

 
ARG ELK_VERSION
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
# nori ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
RUN elasticsearch-plugin install analysis-nori --batch

์ด Dockerfile์€ ELK_VERSION์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ํ•ด๋‹น ๋ฒ„์ „์˜ Elasticsearch ์ด๋ฏธ์ง€๋ฅผ ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๊ณ ,
ํ•œ๊ตญ์–ด ๋ถ„์„์— ํŠนํ™”๋œ nori ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ Step 2: docker-compose๋กœ Elasticsearch + Kibana ๊ตฌ์„ฑํ•˜๊ธฐ

version: '3.8'

services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        ELK_VERSION: ${ELK_VERSION}  # .env์—์„œ ์ฝ์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ „๋‹ฌ
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=${ES_JAVA_OPTS}
      - xpack.security.enabled=false
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - ELASTICSEARCH_PLUGINS=analysis-nori  # ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ๋ช…์‹œ
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
      - ./elasticsearch/data:/usr/share/elasticsearch/data
    ports:
      - "${ELASTIC_PORT}:9200"
      - "9300:9300"
    networks:
      - elk-network
    healthcheck:
      test: ["CMD-SHELL", "curl -s http://localhost:9200 || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5

  kibana:
    image: kibana:${ELK_VERSION}
    container_name: kibana
    depends_on:
      - elasticsearch
    ports:
      - "${KIBANA_PORT}:5601"
    networks:
      - elk-network
    environment:
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200

networks:
  elk-network:
    driver: bridge

๐Ÿงพ Docker Compose ๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…

Docker Compose ํŒŒ์ผ์—์„œ ์ •์˜๋œ ๊ฐ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค:


๐Ÿ”น services

Docker์—์„œ ์‹คํ–‰ํ•  ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ •์˜ํ•˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.
์ด๋ฒˆ ์„ค์ •์—์„œ๋Š” elasticsearch์™€ kibana ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”ธ Elasticsearch

  • build
    • ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ(.)๋ฅผ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Dockerfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ฉฐ, .env์—์„œ ์„ค์ •ํ•œ ELK_VERSION์„ ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • container_name
    • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ elasticsearch๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • environment
    • discovery.type=single-node: ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ์—†์ด ๋‹จ์ผ ๋…ธ๋“œ๋กœ ์‹คํ–‰
    • ES_JAVA_OPTS: ์ž๋ฐ” ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜ต์…˜์„ .env์—์„œ ์ฃผ์ž…
    • xpack.security.enabled=false: ๊ธฐ๋ณธ ๋ณด์•ˆ ์ธ์ฆ ๋น„ํ™œ์„ฑํ™”
    • ELASTIC_PASSWORD: ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ํŒจ์Šค์›Œ๋“œ ์„ค์ •
    • ELASTICSEARCH_PLUGINS=analysis-nori: nori ํ•œ๊ตญ์–ด ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
  • volumes
    • ์„ค์ • ํŒŒ์ผ(elasticsearch.yml)๊ณผ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ
  • ports
    • ํ˜ธ์ŠคํŠธ์˜ ${ELASTIC_PORT}๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 9200๋ฒˆ ํฌํŠธ์— ๋ฐ”์ธ๋”ฉ (REST API์šฉ)
    • 9300 ํฌํŠธ๋Š” ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์šฉ
  • networks
    • ์‚ฌ์šฉ์ž ์ •์˜ ๋„คํŠธ์›Œํฌ elk-network์— ์—ฐ๊ฒฐํ•˜์—ฌ Kibana์™€ ํ†ต์‹  ๊ฐ€๋Šฅ
  • healthcheck
    • ์ฃผ๊ธฐ์ ์œผ๋กœ Elasticsearch์˜ REST API์— curl์„ ๋‚ ๋ ค ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ

๐Ÿ”ธ Kibana

  • image
    • ๊ณต์‹ Kibana ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ELK_VERSION์— ๋”ฐ๋ผ ๋ฒ„์ „ ๊ณ ์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • depends_on
    • elasticsearch ์„œ๋น„์Šค๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ ํ›„ Kibana๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •
  • ports
    • ํ˜ธ์ŠคํŠธ์˜ ${KIBANA_PORT}๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 5601 ํฌํŠธ(Kibana ๊ธฐ๋ณธ ํฌํŠธ)์— ๋ฐ”์ธ๋”ฉ
  • environment
    • ELASTICSEARCH_HOSTS: Kibana๊ฐ€ ์—ฐ๊ฒฐํ•  Elasticsearch ์ฃผ์†Œ๋ฅผ http://elasticsearch:9200๋กœ ์„ค์ •
  • networks
    • Elasticsearch์™€ ๋™์ผํ•œ elk-network ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ํ†ต์‹  ๊ฐ€๋Šฅ

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ

์ด์ œ ์ปค์Šคํ…€๋œ Elasticsearch์™€ Kibana๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kibana๋Š” Elasticsearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ UI ์ƒ์—์„œ ์‰ฝ๊ฒŒ ์กฐํšŒํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ, ์ด์ œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘, ๊ฒ€์ƒ‰, ๋ถ„์„, ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ํ™˜๊ฒฝ์ด ๋กœ์ปฌ์—์„œ ๋ฐ”๋กœ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

docker-compose up --build

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:5601๋กœ ์ ‘์†ํ•ด Kibana UI๋ฅผ ํ™•์ธํ•˜๊ณ ,
http://localhost:9200์—์„œ๋Š” Elasticsearch ์ƒํƒœ๋ฅผ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฒ˜์Œ ์ ‘ํ•˜๋Š” Elasticsearch์™€ Kibana๋ฅผ ํ•จ๊ป˜ ์„ค์ •ํ•˜๊ณ  ์—ฐ๊ฒฐํ•ด๋ณด๊ธด ํ–ˆ์ง€๋งŒ, ์•„์ง Kibana ํ™”๋ฉด์— ํŠน๋ณ„ํžˆ ๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ๋„ ์—†๊ณ , ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์‰ฝ๊ฒŒ ๊ทธ๋ ค์ง€์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ตํžˆ๊ณ , ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋ณด๋ฉฐ ์ฒดํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ Elasticsearch๊ฐ€ ๋‹จ์ˆœํ•œ ๊ฒ€์ƒ‰์—”์ง„์„ ๋„˜์–ด์„œ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ฒ˜๋Ÿผ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์„์ง€, ๊ทธ ๊ตฌ์กฐ์™€ ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์ดํ•ดํ•ด๋ณด๊ณ  ์‹ถ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ์˜ ์‹ค์Šต๊ณผ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๊ทธ ๊ถ๊ธˆ์ฆ์„ ํ•˜๋‚˜์”ฉ ํ’€์–ด๊ฐ€๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

'๊ฐœ๋ฐœ ๊ณต๋ถ€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

.equals(), == ๋น„๊ต  (0) 2025.09.26
Elasticsearch ์จ๋ณด์ž(2)  (0) 2025.04.23
TPS(Transaction Per Second)  (0) 2025.03.28
WebSocket๊ณผ STOMP  (0) 2025.03.26
WebSocket ํ†ต์‹  ๋ฐฉ์‹์ด๋ž€?  (0) 2025.03.26