Tech
ELK 스택을 활용한 분산 로깅 시스템 구축 - 2
2025.03.24

ELK 스택을 활용한 분산 로깅 시스템 구축 - 2

[본문]

notion image

1. 분산 시스템에서의 로깅 문제

1.1 CAP 이론과 로깅 시스템

분산 시스템을 설계할 때 CAP 이론(일관성, 가용성, 분할 내성)을 고려하는 것은 필수적 입니다. 로깅 시스템도 예외가 아닙니다:
  • 일관성(Consistency): 모든 노드가 동일한 시점에 동일한 로그 데이터를 볼 수 있는가?
  • 가용성(Availability): 시스템 일부가 실패해도 로그 수집이 계속 되는가?
  • 분할 내성(Partition Tolerance): 네트워크 분할 상황에서도 시스템이 작동하는가?
ELK 스택은 기본적으로 AP(가용성, 분할 내성)에 중점을 둔 시스템으로, 일관성 보다는 로그 데이터의 유실 방지와 시스템 가용성을 우선시 합니다.

1.2 시간 동기화 문제

분산 환경에서 발생하는 가장 큰 기술적 도전 중 하나는 서로 다른 서버에서 생성된 로그의 타임스탬프 동기화 문제입니다.
이는 단순한 NTP 서버 설정 문제가 아닌, 분산 시스템의 본질적 특성인 '시간 동기화의 한계'와 관련이 있습니다.
시간 동기화 문제 해결 방안: 1. 모든 서버에서 NTP(Network Time Protocol) 설정 2. 로그 생성 시 타임스탬프와 함께 서버 ID 기록 3. 벡터 클럭(Vector Clock) 알고리즘 활용하여 이벤트 순서 추적
 
 

2. ELK 스택의 아키텍처와 자료구조

2.1 Elasticsearch의 인덱싱 구조

Elasticsearch는 역 색인(Inverted Index) 기반의 검색 엔진입니다.
역 색인은 특정 단어가 어떤 문서에 등장 하는지를 저장하는 자료구조로, 검색 쿼리 실행 시 O(1)에 가까운 시간 복잡도로 결과를 찾을 수 있습니다.
 
역색인(Inverted Index)의 간략한 예
{
"error": [doc1, doc3, doc7],
"warning": [doc2, doc5],
"info": [doc1, doc4, doc6]
}
 
그러나 역색인 구조는 쓰기 작업에서 상대적으로 비용이 높습니다.
각 용어가 역색인에 추가될 때마다 인덱스를 재구성해야 하기 때문입니다. (B-Tree 기반 자료구조로 구현된 데이터 베이스의 인덱스도 비슷한 문제를 가지고 있죠)
이러한 특성을 이해하고 적절한 샤딩(Sharding) 전략을 수립하는 것이 중요합니다.

2.2 Elasticsearch의 샤딩과 레플리케이션

Elasticsearch는 대용량 데이터를 분산 저장하기 위해 샤딩(Sharding)과 레플리케이션(Replication) 메커니즘을 사용합니다:
  • 샤딩: 인덱스를 여러 조각(샤드)으로 분할하여 수평적 확장 가능
  • 레플리케이션: 각 샤드의 복제본을 생성하여 가용성과 내결함성 향상
이러한 분산 저장 방식은 이진 탐색 트리(BST)와 해시 테이블의 개념이 결합된 형태로 볼 수 있으며, 일관된 해싱(Consistent Hashing) 알고리즘을 사용해 데이터 분산을 관리합니다.
 
Elasticsearch 인덱스 설정 예시
{
"settings":
{
"number_of_shards": 5,
"number_of_replicas": 1
}
}
 
 

3. 로그 수집 파이프라인과 네트워크 고려사항

3.1 Logstash의 처리 파이프라인과 병렬성

Logstash는 입력(Input) → 필터(Filter) → 출력(Output)의 파이프라인 구조로 로그를 처리합니다.
이 과정에서 Producer-Consumer 패턴이 적용됩니다:
  1. 입력 플러그인이 로그를 수집하여 큐에 저장 (Producer)
  1. 워커 스레드가 큐에서 로그를 꺼내 필터 처리 후 출력 (Consumer)
 
Logstash 처리 모델:입력 → [내부 큐(병목 지점)] → 워커 스레드 풀(필터링) → 출력
 
이 구조에서 내부 큐는 잠재적 병목 지점이 될 수 있으며, 메모리 압박 상황에서는 Backpressure 문제가 발생할 수 있습니다.
이를 해결하기 위해 Persistent Queue 설정이 중요합니다:
 
logstash.yml 설정
queue.type: persistedqueue.max_bytes: 4gb
 

3.2 네트워크 고려사항과 TCP/IP 최적화

로그 시스템은 네트워크 의존도가 높은 시스템으로, TCP 연결 관리와 네트워크 파티션에 대한 이해가 필수적입니다:
  1. 연결 유지(Keep-Alive): TCP 연결 재사용으로 핸드셰이크 오버헤드 감소
  1. 타임아웃 설정: 네트워크 불안정성 대비를 위한 적절한 타임아웃 구성
  1. TCP 버퍼 크기: 높은 처리량을 위한 버퍼 최적화
 
this.logstashTransport = new winston.transports.Http ( { host: logstash_host, port: logstash_port, path: '/', ssl: use_ssl, agent: new https.Agent ( { rejectUnauthorized: false, keepAlive: true, keepAliveMsecs: 10000, maxSockets: 100 } ), timeout: 5000 } );
 
 

4. 운영체제 수준의 최적화

4.1 파일 디스크립터 한계

Elasticsearch와 Logstash는 많은 수의 파일과 소켓 연결을 사용하므로, 운영체제의 파일 디스크립터 한계를 적절히 설정해야 합니다:
 
/etc/security/limits.confelasticsearch soft nofile 65536elasticsearch hard nofile 65536
 
이는 운영체제의 자원 할당 메커니즘에 직접적으로 관련되며, 이해하지 못하면 "Too many open files" 에러로 이어질 수 있습니다.

4.2 메모리 관리와 가상 메모리

JVM 기반 애플리케이션인 Elasticsearch와 Logstash는 메모리 관리가 중요합니다:
  1. 힙 메모리 설정: 적절한 JVM 힙 크기 설정
  1. 가상 메모리 설정: vm.max_map_count 증가
  1. 스왑 비활성화: 성능 저하 방지
가상 메모리 설정:
sysctl -w vm.max_map_count=262144
ES_JAVA_OPTS="-Xms1g -Xmx1g"
 
 

5. 데이터 라이프사이클 관리

5.1 시계열 데이터 관리 전략

로그 데이터는 시계열 데이터의 특성을 가지며, 시간이 지날수록 가치가 감소합니다. 효율적인 데이터 관리를 위해 인덱스 라이프사이클 관리(ILM)를 구현해야 합니다:
 
ILM 정책 예시
{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50GB", "max_age": "1d" } } }, "warm": { "min_age": "2d", "actions": { "shrink": { "number_of_shards": 1 }, "forcemerge": { "max_num_segments": 1 } } }, "cold": { "min_age": "30d", "actions": { "freeze": {} } }, "delete": { "min_age": "90d", "actions": { "delete": {} } } } } }
이 정책은 B-Tree Index의 재구성과 유사한 방식으로 시간이 지남에 따라 데이터를 최적화하고 제거합니다.

5.2 쿼리 최적화와 인덱스 설계

로그 데이터에 대한 효율적인 쿼리를 위해서는 인덱스 설계가 중요합니다:
  1. 인덱스 템플릿: 필드 매핑과 설정을 사전 정의
  1. 키워드 필드 활용: 정확한 매칭을 위한 keyword 타입 사용
  1. 쿼리 캐싱: 자주 사용되는 쿼리의 결과 캐싱
 
인덱스 템플릿 예시
{ "index_patterns": ["logs-*"], "mappings": { "properties": { "@timestamp": { "type": "date" }, "service": { "type": "keyword" }, "message": { "type": "text" }, "level": { "type": "keyword" } } } }
 
 
이번 글이 마음에 드셨다면 다른 사람들과 함께 보기
editor
Chilloen Development team manager
DONG WOONG OH