본문으로 건너뛰기
김신건의 로그

[Search] ES 인프라: cluster, shard, replica, ELK

· 수정 · 📖 약 2분 · 804자/단어 #elasticsearch #cluster #shard #infrastructure #elk
ES cluster, ES shard, ES replica, node role, ILM, ELK Stack, Elastic Stack, Beats, Elastic Agent, Fleet, Logstash, Kibana

정의

ES 는 분산 시스템. cluster + multiple nodes + shards + replicas + Elastic Stack 보조 도구.

Cluster 구조

flowchart TB
    subgraph Cluster["Elasticsearch Cluster"]
        N1["Node 1 (master + data)"]
        N2["Node 2 (data + ingest)"]
        N3["Node 3 (data)"]
        N4["Node 4 (master eligible)"]
        N5["Node 5 (coord only)"]
    end
    Client --> N5
    N5 --> N1 & N2 & N3
    N1 -.gossip.-> N4

Node Role

Role의미
mastercluster state 관리
master_eligiblemaster 후보
datashard 보관 + 쿼리
data_hot / data_warm / data_cold / data_frozentier 별
ingestingest pipeline 실행
coordinating_only라우팅 + 합치기만
mlML 전용
remote_cluster_clientcross-cluster search
transformcontinuous transform

IMPORTANT

production = 분리된 dedicated master 3노드 + data nodes + coordinating-only (큰 환경). 작은 환경은 master+data 결합 OK.

Shard + Replica

flowchart TB
    Idx["Index: products<br/>(3 primary shards, 1 replica)"]
    Idx --> S0["Shard 0 (primary, Node 1)"]
    Idx --> S1["Shard 1 (primary, Node 2)"]
    Idx --> S2["Shard 2 (primary, Node 3)"]
    S0 -.replica.-> R0["Shard 0 (replica, Node 2)"]
    S1 -.replica.-> R1["Shard 1 (replica, Node 3)"]
    S2 -.replica.-> R2["Shard 2 (replica, Node 1)"]
개념의미
Primary shardwrite 의 주체
Replica shard읽기 분산 + HA
Routinghash(routing) % primary_shards
primary 다운replica → primary 자동 승격

Shard 수 결정

flowchart TD
    Q1{인덱스 크기}
    Q1 -->|< 50GB| Small[1-3 primary shard]
    Q1 -->|50-500GB| Med[3-10]
    Q1 -->|500GB+| Big[10+, 시계열 분할]
    Note["권장: 1 shard 당 20-50GB"]

너무 많음 = cluster state 비대 + 리밸런싱 비용. 너무 적음 = 노드 추가해도 분산 안 됨.

ILM (Index Lifecycle Management)

flowchart LR
    Hot["HOT<br/>(SSD, 활발한 write/read)"] --> Warm["WARM<br/>(읽기 위주, 적은 replica)"]
    Warm --> Cold["COLD<br/>(searchable snapshot, 가끔 검색)"]
    Cold --> Frozen["FROZEN<br/>(객체 스토리지, 거의 검색 X)"]
    Frozen --> Delete["DELETE"]
PUT _ilm/policy/logs-policy
{
  "policy": {
    "phases": {
      "hot":    { "actions": { "rollover": { "max_size": "50gb", "max_age": "1d" } } },
      "warm":   { "min_age": "7d",  "actions": { "shrink": { "number_of_shards": 1 }, "forcemerge": { "max_num_segments": 1 } } },
      "cold":   { "min_age": "30d", "actions": { "searchable_snapshot": { "snapshot_repository": "s3-repo" } } },
      "frozen": { "min_age": "90d", "actions": { "searchable_snapshot": { "snapshot_repository": "s3-repo" } } },
      "delete": { "min_age": "365d", "actions": { "delete": {} } }
    }
  }
}

로그 / 메트릭 / APM 의 표준. 비용 차감 + 성능 유지 의 핵심.

Elastic Stack (옛 ELK)

flowchart LR
    Source[Apps / Servers / Containers] --> Agent["Elastic Agent<br/>(또는 Beats)"]
    Agent --> Fleet["Fleet Server<br/>(중앙 관리)"]
    Agent --> ES[(ElasticSearch)]
    Source --> LS["Logstash<br/>(복잡 변환)"]
    LS --> ES
    ES --> Kibana["Kibana<br/>(UI, alert, ML)"]
컴포넌트의미
Elastic Agent통합 shipper (옛 Beats 통합)
Beats (Filebeat, Metricbeat, Packetbeat, …)가벼운 단일 목적 shipper
Logstash강력 변환, Elastic Agent + Ingest pipeline 으로 대부분 대체 진행 중
FleetElastic Agent 의 중앙 관리 + policy 배포
Kibana시각화 + dev tools + alerting + ML UI

2026 시점: Elastic Agent + Fleet 이 표준. Beats 는 legacy (지원 계속).

Snapshot / Restore

# Repository 등록 (S3)
PUT _snapshot/my_s3_repo
{
  "type": "s3",
  "settings": { "bucket": "es-snapshots", "region": "us-east-1" }
}

# Snapshot
PUT _snapshot/my_s3_repo/snap-2026-06-25?wait_for_completion=true
{
  "indices": "products,logs-*",
  "include_global_state": false
}

# Restore
POST _snapshot/my_s3_repo/snap-2026-06-25/_restore
{
  "indices": "products",
  "rename_pattern": "(.+)",
  "rename_replacement": "restored-$1"
}

Searchable Snapshot

ILM 의 cold / frozen tier 에서 사용.
S3 의 snapshot 을 *직접 검색* (로컬 복원 없이).

비용 대폭 절감. cold 는 부분 mount, frozen 은 완전 S3 기반 + small local cache.

Cross-Cluster Search / Replication

flowchart LR
    EU[EU Cluster] -.CCR.-> US[US Cluster]
    Search[Search Query] -->|CCS| EU
    Search -->|CCS| US
  • CCR (Cross-Cluster Replication): leader → follower 비동기 복제.
  • CCS (Cross-Cluster Search): 동시에 여러 cluster 검색.
  • DR / 글로벌 분석.

모니터링 핵심 지표

운영 중 최우선으로 관찰해야 할 지표:

범주지표임계치/설명
클러스터 상태cluster.health statusGREEN 목표, YELLOW 주의, RED 즉각 대응
JVM 힙jvm.mem.heap_used_percent75% 초과 시 GC 압력 증가, 85% 이상 위험
GC 시간jvm.gc.collectors.old.collection_timeold GC 200ms 이상이면 조사
Search 지연indices.search.query_timep99 기준 200ms 이상이면 조사
Index 속도indices.indexing.index_rate피크 처리량 대비 70% 이상 지속 시 조사
Disk 사용률fs.total.available85% 초과 시 shard allocation 중지
Thread poolthread_pool.write.queue큐 적체 = 인덱싱 병목 신호
# 클러스터 상태 한눈에 보기
GET _cluster/health?pretty

# 노드별 JVM / 디스크 현황
GET _cat/nodes?v&h=ip,name,heapPercent,diskUsedPercent,cpu,load_1m

용량 계획 가이드라인

스토리지 계산

실제 필요 디스크 = 원본 데이터 크기
                  x 인덱싱 오버헤드 (1.1-1.5x)
                  x (replica 수 + 1)
                  + safety buffer (20-30%)

예시: 100 GB 원본 + replica 1 = 100 x 1.2 x 2 x 1.25 = 약 300 GB

JVM 힙 설정

# jvm.options
-Xms16g
-Xmx16g     # 힙은 전체 RAM 의 50%, 최대 32 GB (Compressed OOPs 한계)

32 GB 초과 시 Compressed OOPs 가 비활성화되어 오히려 메모리 효율이 떨어집니다.

노드 역할 분리 권장 규모

flowchart LR
    small["소형 (5노드 미만)"]
    medium["중형 (5-20노드)"]
    large["대형 (20+ 노드)"]

    small -->|all-in-one| A["master + data + ingest 결합"]
    medium -->|분리 시작| B["dedicated master 3개 + data nodes"]
    large -->|완전 분리| C["master / data-hot / data-warm / coord"]

성능 튜닝 체크리스트

인덱싱 속도 향상:

  • refresh_interval: 30s (기본 1s, 실시간 검색 불필요 시)
  • number_of_replicas: 0 (초기 대량 인덱싱 후 복구)
  • bulk API 사용: 배치당 5-15 MB, 500-1000 docs
  • 클라이언트 스레드 수 = data node 수 x 2

검색 속도 향상:

  • filter context 최대 활용 (score 불필요 조건은 반드시 filter)
  • fielddata 비활성화 (집계에는 keyword 필드 사용)
  • 결과 크기 제한 (size: 10, _source includes/excludes 활용)
  • Shard 크기 20-50 GB 유지

흔한 함정

WARNING

  1. Master node 분리 안 함 + 데이터 폭증 = master 가 GC pause → split brain.
  2. Shard 수 영구 고정 = 만들 때 결정. 늘리려면 reindex.
  3. ILM 없는 로그 = 수 TB 누적 → cluster 다운. ILM 필수.
  4. Replica 0 in production = 노드 다운 시 데이터 손실. 최소 1.

관련 위키

이 글의 용어 (6개)
[AWS] S3: object storage, storage classes, lifecyclecloud
정의 S3 = AWS 의 object storage. bucket + key + object. 11 9's durability (99.999999999%), 무한 확장. 2026…
[DevOps] 무중단 배포: Blue-Green, Canary, Rolling, Expand-Contractdevops
정의 무중단 배포 (Zero-Downtime Deployment) 는 서비스 가동을 멈추지 않고 새 버전을 배포하는 일련의 전략. 핵심 도전 4가지: 1. 트래픽 전환: 어떻게 …
[Observability] OpenTelemetry: 표준화된 trace/metric/logdevops
정의 OpenTelemetry (OTel) = observability 의 vendor-neutral 표준. CNCF. trace + metric + log 의 SDK + pro…
[Observability] Prometheus: pull 기반 메트릭, PromQLdevops
정의 Prometheus = pull 기반 시계열 metric 시스템. PromQL 로 쿼리. CNCF graduated. 2026 클라우드 네이티브 메트릭 표준. 아키텍처 Pu…
[Search] ElasticSearch 기본 원리: Inverted Index, Segment, Lucenesearch
정의 ES 의 모든 동작 은 Lucene 의 inverted index 위에 얹혀있다. 문서 단위 저장 + term 단위 검색 의 분리. Inverted Index (역색인) 위…
[Search] ElasticSearch: Lucene 위 분산 검색 엔진search
정의 ElasticSearch = Apache Lucene 위의 분산 RESTful 검색/분석 엔진. 2010 출시. Logstash + Kibana + Beats 와 함께 El…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기