본문으로 건너뛰기

Elasticsearch 설정

이제 모든 관련 문서를 확인했습니다. 종합적인 답변을 작성하겠습니다.


exemONE Elasticsearch 설치 및 설정 가이드

exemONE에서 Elasticsearch는 로그 데이터 저장소외부 리소스 모니터링 대상으로 사용됩니다. 아래에 설치부터 설정까지 단계별로 설명합니다.


1. Elasticsearch 설치 (Binary 모드)

참고: 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 수집 모듈과 연동해야 합니다.

참고: Elasticsearch Logging Trend 데이터 수집

적용 최소 버전

모듈최소 버전
exemone-apiv3.0.506.15.50
exemone-ingesterv3.0.506.15.29
exemone-host-agent3.0.25.1
exemone-k8s-agent3.0.11.1
exemone-container-agent3.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 옵션 설정

참고: 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-timeout5000ms (5초)서버에 처음 연결 시도 시 최대 대기 시간
socket-timeout30000ms (30초)쿼리 요청 후 서버 응답 대기 최대 시간
connection-request-timeout2000ms (2초)커넥션 풀 부족 시 새 커넥션 대기 시간

설정 후 API 재구동:

{EXEM_HOME}/scripts/restart api

4. exemONE UI에서 로그 수집 Path 설정

참고: Elasticsearch Logging Trend 데이터 수집

단계 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: 연결 정보 입력

순번항목내용
1Name타겟의 별명 지정
2Description타겟에 대한 설명 입력
3URLElasticsearch 접속 정보 입력
4Skip TLS certificate validationTLS 인증 검증 Skip 여부
5Auth Method인증 유형 선택
6Index Name데이터 검색할 Index Name (정규표현식 가능)
7Time Field NameTime Field 이름 입력

6. 인덱스 보관 주기 변경

참고: Elasticsearch 인덱스 보관 주기 변경 가이드

단계 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. 인덱스 템플릿 업데이트

참고: Elasticsearch 인덱스 템플릿 업데이트 가이드

현재 템플릿 확인

# 사용 중인 템플릿 확인
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"

주의사항

  1. Elasticsearch 버전: exemONE은 8버전 이상만 지원합니다
  2. SSD 권장: Elasticsearch 공식 권장은 SSD이며, HDD 환경에서도 동작하지만 성능이 저하될 수 있습니다
  3. 메모리 설정: JVM 힙 메모리는 가용 물리 메모리의 절반으로 설정합니다
  4. 인덱스 패턴: exemone-ingester에서 사용하는 인덱스 패턴은 exemone-log-v1*이며, 템플릿 이름은 exemone-log-v1-template입니다
  5. 데이터 특성: External Resource로 등록한 Elasticsearch 모니터링은 실시간 휘발성 데이터를 출력하며 데이터를 별도 저장하지 않습니다
  6. root 실행 불가: Elasticsearch는 보안상 root 유저로 직접 실행할 수 없으므로, 별도 사용자(예: exemone)로 실행해야 합니다 💬 답변이 도움되셨나요? 이 메시지에 Reaction을 남겨주세요! 👍 ❤️ 👎 | ⏱️ 응답 시간: 109.4초