Elasticsearch 설정
이제 모든 관련 문서를 확인했습니다. 종합적인 답변을 작성하겠습니다.
exemONE Elasticsearch 설치 및 설정 가이드
exemONE에서 Elasticsearch는 로그 데이터 저장소와 외부 리소스 모니터링 대상으로 사용됩니다. 아래에 설치부터 설정까지 단계별로 설명합니다.
1. Elasticsearch 설치 (Binary 모드)
지원 환경
- OS: Linux 환경
- 권한: root 권한 필요 (일부 설정 시)
- 구성: 단일 노드 설정 기준
- Elasticsearch 버전: 8버전 이상 필수
단계 1: 설치 파일 준비
# Elasticsearch 다운로드 (예: 8.0.1 버전)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.0.1-linux-x86_64.tar.gz
단계 2: 압축 해제 및 디렉토리 생성
# 압축 해제
tar -xzf elasticsearch-8.0.1-linux-x86_64.tar.gz
# 데이터/로그 디렉토리 생성
mkdir -p /home/exemone/elasticsearch/data
mkdir -p /home/exemone/elasticsearch/logs
# (선택사항) 디렉토리 권한 변경
sudo chown -R some_group:some_user /opt/elasticsearch-8.0.1
단계 3: JVM 옵션 설정
config/jvm.options.d/heap_gc.options 파일을 생성합니다:
cd elasticsearch-8.0.1/config/jvm.options.d
touch heap_gc.options
아래 내용을 작성합니다:
# 힙 메모리 설정: 가용 물리 메모리 중 절반을 사용합니다
# (변경 필요) 가용 메모리가 32gb라면 16g 설정
-Xms16g
-Xmx16g
# G1 GC 사용
-XX:+UseG1GC
# JVM 초기 힙 점유(pre-touch)
-XX:+AlwaysPreTouch
# G1 GC 튜닝
-XX:InitiatingHeapOccupancyPercent=75
-XX:G1ReservePercent=25
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
# GC 로깅
# (변경 필요) <logs 디렉토리 경로>를 실제 경로로 변경
-Xlog:gc*,gc+age=trace,safepoint:file=/home/exemone/elasticsearch/logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
# 메모리 잠금 (bootstrap.memory_lock: true와 함께 사용)
-XX:+UnlockExperimentalVMOptions
-XX:+DisableExplicitGC
단계 4: elasticsearch.yml 설정
cluster.name: exemone-cluster
node.name: node-1 # (변경 필요) 노드마다 다르게 설정
node.roles: [ master, data, ingest ]
# (변경 필요) 물리 서버 IP
network.host: 10.10.xx.xxx
http.port: 9200
transport.port: 9300
# (변경 필요) 앞서 생성한 디렉토리 경로
path.data: /home/exemone/elasticsearch/data
path.logs: /home/exemone/elasticsearch/logs
# 단일 노드 설정 시
discovery.type: single-node
# systemd 등록 시 주석 해제 (optional)
# bootstrap.memory_lock: true
# https 비활성화
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
# https 사용 시 (위 3줄 대신 아래 사용)
# xpack.security.enabled: true
# xpack.security.transport.ssl.enabled: true
# xpack.security.http.ssl.enabled: true
단계 5: OS 커널 파라미터 변경
sudo 권한이 필요합니다:
sudo vi /etc/sysctl.conf
# 추가
vm.max_map_count=262144
# 적용 및 확인
sudo sysctl --system
단계 6: Elasticsearch 실행
ES_HOME="/home/exemone/elasticsearch-8.0.1" ES_PATH_CONF="/home/exemone/elasticsearch-8.0.1/config" ./home/exemone/elasticsearch-8.0.1/bin/elasticsearch
참고: 삼성전자 설치 사례에서 systemd 등록은 실패하였고, 바이너리 직접 실행으로 성공한 사례가 있습니다. 참고: 삼성전자 Elasticsearch 설치 사례
2. exemONE 모듈에서 Elasticsearch 연동 설정
Elasticsearch 설치 후 exemONE 수집 모듈과 연동해야 합니다.
적용 최소 버전
| 모듈 | 최소 버전 |
|---|---|
| exemone-api | v3.0.506.15.50 |
| exemone-ingester | v3.0.506.15.29 |
| exemone-host-agent | 3.0.25.1 |
| exemone-k8s-agent | 3.0.11.1 |
| exemone-container-agent | 3.0.6 |
단계 1: PostgreSQL에서 Elasticsearch 로그 활성화 쿼리 실행
exemONE Repository DB(PostgreSQL)에서 아래 쿼리를 실행합니다:
insert into xm_global_properties (props_id, name, value)
(
select uuid_generate_v4() as props_id, 'useESLog' as name, 'true' as value
where not exists (
select 1 from xm_global_properties where "name" = 'useESLog'
)
);
단계 2: exemone-api 설정
수정 파일: {EXEM_HOME}/containers/exemone-api/configs/application.yml
spring 하단에 elasticsearch 내용을 추가합니다:
elasticsearch:
username:
password:
hostname: 10.10.49.180 # (변경 필요) Elasticsearch IP
port: 9200
connection-timeout: 30000
enable: true

API 재시작:
$ {EXEM_HOME}/scripts/restart api
단계 3: exemone-ingester 설정
수정 파일: {EXEM_HOME}/containers/exemone-ingester/configs/ingester.yaml
global 하단에 elasticsearch 내용을 추가합니다:
elasticsearch:
enabled: true
addresses:
- http://10.10.49.180:9200 # (변경 필요) Elasticsearch 주소
username:
password:

Ingester 재시작:
$ {EXEM_HOME}/scripts/restart ingester
3. Elasticsearch Timeout 옵션 설정
네트워크 지연이나 대용량 쿼리 처리 시 Timeout 에러를 방지하기 위해 옵션을 조정할 수 있습니다.

수정 파일: {EXEM_HOME}/containers/exemone-api/configs/application.yml
elasticsearch:
host: localhost
port: 9200
timeout:
connection-timeout: 10000 # 연결 타임아웃 (기본 5초, 예: 10초)
socket-timeout: 60000 # 응답 타임아웃 (기본 30초, 예: 60초)
connection-request-timeout: 5000 # 커넥션 풀 대기 타임아웃 (기본 2초, 예: 5초)
| 옵션 | 기본값 | 용도 |
|---|---|---|
| connection-timeout | 5000ms (5초) | 서버에 처음 연결 시도 시 최대 대기 시간 |
| socket-timeout | 30000ms (30초) | 쿼리 요청 후 서버 응답 대기 최대 시간 |
| connection-request-timeout | 2000ms (2초) | 커넥션 풀 부족 시 새 커넥션 대기 시간 |
설정 후 API 재구동:
{EXEM_HOME}/scripts/restart api
4. exemONE UI에서 로그 수집 Path 설정
단계 1: Path 설정
Setting > Log > Path 메뉴에서:
- Add/Edit Path >
Log Repository > Elasticsearch선택 - Elasticsearch로 로그 저장 시, 키워드 필터 없이 모든 데이터를 저장합니다
- Exclude Filter Key 적용하여 로그 제외 가능합니다

Path List에서 Log Repository 정보로 Elasticsearch와 Clickhouse 저장소를 구분합니다:

단계 2: Logging 설정
Setting > Log > Logging 추가 메뉴에서:
- Add/Edit Logging > Path Setting >
Log Repository > Elasticsearch선택

5. Elasticsearch 외부 리소스 모니터링 타겟 등록
Elasticsearch 자체를 모니터링 대상으로 등록하여 Dashboard에서 데이터를 조회할 수 있습니다.
참고: Elasticsearch Dashboard 데이터 모니터링 방법 | External Resource 타겟 서버 추가 (Elasticsearch)
단계 1: 타겟 서버 추가
Setting > External Resource > [Add Target Server] 버튼 클릭

단계 2: Elasticsearch 선택

단계 3: 연결 정보 입력

| 순번 | 항목 | 내용 |
|---|---|---|
| 1 | Name | 타겟의 별명 지정 |
| 2 | Description | 타겟에 대한 설명 입력 |
| 3 | URL | Elasticsearch 접속 정보 입력 |
| 4 | Skip TLS certificate validation | TLS 인증 검증 Skip 여부 |
| 5 | Auth Method | 인증 유형 선택 |
| 6 | Index Name | 데이터 검색할 Index Name (정규표현식 가능) |
| 7 | Time Field Name | Time Field 이름 입력 |
6. 인덱스 보관 주기 변경
단계 1: 현재 정책 확인
# 인덱스 템플릿에 적용된 정책 확인
curl -X GET "http://<ip>:<port>/_index_template/exemone-log-v1?pretty"
# 정책 보관 주기 확인
curl -X GET "http://<ip>:<port>/_ilm/policy/exemone-log-v1-policy?pretty"
단계 2: 정책 파일 저장 및 수정
# 결과를 파일로 저장
curl -X GET "http://<ip>:<port>/_ilm/policy/exemone-log-v1-policy?pretty" -o policy.json
파일에서 "policy" 값만 남기고 in_use_by, version, modified_date 등을 제거합니다. delete 단계의 min_age 값을 변경합니다:
{
"policy" : {
"phases" : {
"hot" : {
"min_age" : "0ms",
"actions" : {
"rollover" : {
"max_age" : "1d",
"max_size" : "25gb"
}
}
},
"delete" : {
"min_age" : "30d",
"actions" : {
"delete" : {
"delete_searchable_snapshot" : true
}
}
}
}
}
}
단계 3: 변경 반영 및 확인
# 정책 반영
curl -X PUT "http://<ip>:<port>/_ilm/policy/exemone-log-v1-policy" -H "Content-Type: application/json" -d @policy.json
# 변경 확인
curl -X GET "http://<ip>:<port>/_ilm/policy/exemone-log-v1-policy?pretty"
7. 인덱스 템플릿 업데이트
현재 템플릿 확인
# 사용 중인 템플릿 확인
curl http://localhost:9200/_cat/templates/exemone-log*
# 템플릿 상세 정보 조회
curl http://localhost:9200/_index_template/exemone-log-v1?pretty

템플릿 업데이트 실행
curl -X PUT http://localhost:9200/_index_template/exemone-log-v1 -H 'Content-Type: application/json' -d @<업데이트 파일>.json
새 인덱스에 적용 (rollover)
업데이트된 인덱스 템플릿은 새로 생성되는 인덱스부터만 반영됩니다.
# rollover로 즉시 적용
curl -X POST "http://localhost:9200/exemone-log-v1/_rollover"
# 새로 생성된 인덱스 확인
curl "http://localhost:9200/_cat/indices/exemone-log-v1*?v&s=creation.date:desc"
주의사항
- Elasticsearch 버전: exemONE은 8버전 이상만 지원합니다
- SSD 권장: Elasticsearch 공식 권장은 SSD이며, HDD 환경에서도 동작하지만 성능이 저하될 수 있습니다
- 메모리 설정: JVM 힙 메모리는 가용 물리 메모리의 절반으로 설정합니다
- 인덱스 패턴: exemone-ingester에서 사용하는 인덱스 패턴은
exemone-log-v1*이며, 템플릿 이름은exemone-log-v1-template입니다 - 데이터 특성: External Resource로 등록한 Elasticsearch 모니터링은 실시간 휘발성 데이터를 출력하며 데이터를 별도 저장하지 않습니다
- root 실행 불가: Elasticsearch는 보안상 root 유저로 직접 실행할 수 없으므로, 별도 사용자(예:
exemone)로 실행해야 합니다 💬 답변이 도움되셨나요? 이 메시지에 Reaction을 남겨주세요! 👍 ❤️ 👎 | ⏱️ 응답 시간: 109.4초