๐ ์๋ผ์คํฑ์์น(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 |