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

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

· 수정 · 📖 약 1분 · 436자/단어 #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 / 글로벌 분석.

흔한 함정

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, 무한 확장. 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 = 닫기