Post

ELK 인덱스 구조와 Data streams

Datastream - 새로운 Elasticsearch 데이터 구조 이해하기

ES 저장 구조

  • 클러스터 > 노드 > 샤드
  • 하나의 인덱스가 여러 샤드에 나뉘어 저장되는 방식
    • 카프카와 비슷하게 샤드를 나누고 replica를 나눠가져서 노드 하나가 다운이 되어도 나머지 노드에서 가지고 있는 샤드로 복원이 가능한 구조.
  • 어떤 인덱스가 몇개의 샤드에 나뉘어져 저장될 것인지는 인덱스 생성 할 때 처음에만 설정 가능. (수평확장은 어렵다)

적절한 샤드 개수?

  • 샤드는 인덱스 마다 생성이 되기 때문에, 샤드를 너무 많이 생성하게 될 수도 있다는 점을 주의해야 함.
  • 특히 인덱스를 일간으로 나누는 경우, 샤드 5개이면 매일 5개의 샤드가 새로 생성되는 것.
    • 이런 인덱스패턴이 10개이면 매일 10*5 개의 샤드 생성
    • 1년 동안 10*5*365 개의 샤드가 생성됨
  • 그래서 7.x 부터는 샤드 개수 디폴트 값은 1개.

Data streams?

  • 인덱스는 보통 월간/일간으로 분리해서 쌓게 됨.
    • 검색 대상 범위를 축소 할 수 있고, 인덱스 삭제 시 유리하기 때문

logstash 설정

1
2
3
4
5
6
output {
  elasticsearch {
    ...
    index => '%{[@metadata][target_index]}-%{+YYYY.MM}'
  }
}
  • 월간/일간 인덱스로 분리되어 있는 상황에서 rw를 편하게 하려면 alias가 필요함.
    • 클라이언트에서 직접 log-2024.01 에 대고 작업 하는 것은 월이 바뀌었을 때 대응이 안되므로, 인덱스 패턴 log-* 에 대해서 alias 생성.
  • 단점1 ) 하지만 여전히 r용 alias(log)와 w용 alias(log-{최신})를 분리해야 하는 불편.
    • 읽기는 전체에 대해서 검색해야 하지만, 쓰기는 최신 인덱스에 대해서만 발생해야 하기 때문.
  • 단점2 ) 월간/일간 인덱스로 분리하긴 했지만 시간으로 끊으면 인덱스 용량이 들쭉날쭉 할 수 있음.
    • 인덱스가 일정 크기가 되었을 때 인덱스 분리하기 위한 기능인 rollover가 있긴 하지만…
    • rollover하기 위해서는 alias에 대고 rollover API를 직접 트리거해야 하는 불편.

이 단점을 해소하기 위해 나온 것이 => Data streams
Index Lifecycle Policy 기반으로 자동으로 인덱스 쪼개주고, 클라이언트에서 접근은 Data streams로만 하면 됨.

This post is licensed under CC BY 4.0 by the author.