[ELK] # 1 ELK스택이 뭔데. 그거 어떻게 하는건데.

송명규·2023년 4월 25일
0

무친단어장시리즈

목록 보기
3/4

여러분이 개발 초보시절 열심히 print를 찍어가며 열심히 변수를 확인할때를 생각해봐라.

지금은 물론 logger 의 도움을 받아 너무나도 편하게 log.debug();를 사용하고 있겠지만, 그만큼 나의 행동 혹은 프로그램의 행동을 기록으로 남기는 것은 지금에서도, 나중에 있어서 이 데이터를 활용할때 있어서도 너무 중요하다.

그래서 log를 쌓아주는 ELK 스택에 대해서 쓴다.

사실 뭔가 공감되는 말을 쓰고 싶었는데, 야근하고 오니까 정신이 없다.
바로 본론으로 가자.

정의(ELK가 뭐냐구 도덕책)

E : ElasticSearch(적재)
L : Logstash(수집)
K : Kibana(시각화)

log를 수집 및 가공, 시각화 해주는 든든한 3형제이다.

이 사슴 3형제가 바로 ELK이다.
블랙모드 쓰는 개발자들은 그림이 잘 안보일것이다.
ElasticSearch 공홈에서 svg로 사진을 주었다.
미안하다.

뭐 아무튼 각각 로그를 수집 적재 시각화 하는 툴인데, 많은 사람들이 정말 사랑하지 않을 수 없는 툴이다.

이유(왜 기업들이 이런거를 쓰나요)

ES를 쓰는 이유는 정말 다양하다.
그 중 정말 눈에 띄는 장점을 뽑자면 다음과 같다.

(1) 실시간 검색

흔히 대용량 데이터 처리 및 분석하면 Spark, Hadoop Eco System을 떠올린다.
위의 기술은 데이터를 수집하고, 적재하고, 꺼내서 분석하는 단계적인 성질을 가지고 있다.

그런데 ELK는 수집과 적재, 분석이 거의 동시에 이루어진다.
그것이 가능한 이유는 (2) 역 인덱스 때문이다.
나머지는 밑에서 설명하도록하겠다.

따라서 데이터를 실시간으로 받고 분석이 이루어져야 하는 시스템에서 매우 적합한 분산 검색 및 분산 엔진이다!

(2) 역 인덱스(inverted index)

인덱스라 함은 주로 데이터에 번호를 매긴다고 보면 된다.
그런데 ES는 번호에 데이터를 매긴다.
예를 들어, 식당을 번호 매긴다고 하자.

{
1:"하남 돼O 집", 
2:"청 O와", 
3:"금O 맥주", 
4:"금 O지 맥주 식당", 
5:"홍 O와"
}

일반적인 인덱스 구조라면 이렇게 매길 것이다.

그러나 ES의 경우,

// 역색인(inverted indexing)
{
"돼지":[1,4], 
"기와":[2,5], 
"맥주":[3,4], 
"하남":[1], 
"청":[2],
"집":[1]... 
}
// Documnet storage
{
1:"하남 돼O 집", 
2:"청 O와", 
3:"금O 맥주", 
4:"금 O지 맥주 식당", 
5:"홍 O와"
}

이렇게 구조를 가져간다.

왜 굳이 반대로 인덱스를 가지는 검색 엔진을 구성했나요?

말 그대로 "검색" 시스템이기 때문이다.

저기서 "하남 돼지 집"(원래 띄어쓰기가 없지만 ES의 경우 띄어쓰기를 기반으로 단어를 분할(tokenize)하여 사용하게 때문에 설명을 위해서 띄어쓰기를 했다)을 찾아본다고 하자.

  1. 입력된 검색어 "하남 돼지 집"이 Elasticsearch로 전달된다.
  2. Elasticsearch는 역색인을 활용하여 "하남", "돼지", "집" 각각의 단어에 대해 문서 위치를 확인한다.
  3. inverted index에서 검색(Document Storage에서 검색하는거 아님)
    3-1. "하남"에 해당하는 문서 위치 "1"을 확인한다.
    3-2. "돼지"에 해당하는 문서 위치 "1, 4"를 확인한다.
    3-3. "집"에 해당하는 문서 위치 "1"을 확인한다.
  4. Elasticsearch는 문서 위치 "1"과 "1, 4", "1"를 교차하여 공통으로 포함된 문서 번호 "1"을 찾고 inverted index 검색 결과를 반환한다.
  5. Doocument Storage에서 문서 번호 "1"에 해당하는 "하남 돼지 집"을 최종 검색 결과로 반환한다.

이것이 ES의 검색 process이다.

여기서 알아두어야할 것 은 inverted index와 Document Storage가 따로 있다는 것이다!

그래서 ES에는 검색 점수인 score을 이용한다. 뭐 이건 밑에서 설명하도록 하겠읍니다.

아니 그래서 왜 쓰냐구요;

그래 왜 쓰냐.
왜 쓰냐면 이게 위의 예시는 단어 자체도 3개밖에 안되고, 전체 데이터가 5개밖에 안되기 때문에 모든 인덱스를 돌면서 찾는 방법과 많이 차이 나지 않을 수 있다.
그러나 전체 데이터가 1억개 라고 해보자.
(로그 수준의 데이터라면 사실 1억개도 정말 상당히 적은 데이터이다)

1억개의 단어 중 "elasticsearch"라는 단어를 찾을때,

index로 찾으면 1억개를 모두 돌아야하지만,
inverted index로 찾으면 O(1)으로 단 한번에 찾을 수 있다.

물론 예시를 정말 쉽게 들었지만, 그렇다 하더라도 key,value 값으로 대조해서 찾는 것과 모든 인덱스를 비교하는 것들 생각하면, 진짜 어마어마한 차이이다.

(3) 분산 아키텍처

ES는 위에서 말한것 처럼 inverted index를 지원하는데, 분산 아키텍처(Distributed Architecture)에서 이를 나누어서 지원한다.

무슨뜻이냐면, 3개의 노드에

1번 노드 : "가" ~ "하" 까지 들어있음
2번 노드 : "a" ~ "z" 까지 들어있음
3번 노드 : "1" ~ "9" 까지 들어있음

이라고 가정해보자.

만약 "h"를 찾으려고 할 때, 1번,2번,3번 노드에 동시에 "h"를 찾는 작업을 수행하게 된다.

이렇게 되면 단일 노드로 처리할 때보다 일반적으로 더 빠른 시간안에 수행을 할 수 있다.

또한, 분산처리의 장점인 병렬처리, 부하분산, 확장성, 고가용성(하나의 노드가 죽을 경우, 다른 노드에 미리 데이터를 분할 저장해서 작업을 정상적으로 진행하게 함!), 지리적 분산(가까운 곳에 있으면 빠름!)을 모두 사용할 수 있다.
분산처리는 매우 중요하기도 하면서 Spark의 탄생, 존재이유와 같기 때문에 추후 글로써 정리하고 링크를 달아두겠읍니다.

(4) 캐싱 및 메모리 사용 지원

ES는 캐싱 및 메모리 사용을 지원한다.

크게 5가지 캐싱 및 메모리 사용을 지원하는데,

  1. Field data Cache
    • 여기서 Field Data란 index(ES에서 데이터를 저장하는 단위, 하위로 shard, segment 등이 있지만 다음글에서 설명하겠읍니다.. 미안합니다..) 내의 데이터를 가져와 Caching 하는 것이다.
    • 데이터를 넣을때, "fielddata": true 로 설정하여 Caching 할 수 있다! 예시는 다음글에서 설명할께요.. ㅜㅜ 여기 너무 많음
  2. Request Cache
    • 요청이 들어온 쿼리를 Caching 하여 "요청"과 "결과값"을 저장한다.
  3. Filter Cache
    • 적용한 필터를 Caching 하여 "Filter"와 "결과값"을 저장한다.
  4. Field Data Memory
    • ES의 기본 설정은 메모리를 사용하지 않고, 필요할 때 마다 데이터를 I/O를 수행하여 가져온다.
    • 하지만 메모리에 올리면 빠른 응답이 가능!
  5. Index Buffer
    • Storage에 한 번에 너무 많은 데이터를 넣어버리면, 부하도 걸리고, Lock이 걸려 전체적으로 느려진다.
    • 이때 작업의 효율을 위하여 Index Buffer는 Indexing 되는 Data가 아니라 작업 중 생성되는 문서들을 메모리에 올려놓는다.
    • 메모리에 올려 놓은 데이터들을 순차적으로 사용하면서 3가지의 이점을 가진다.
      - 디스크 I/O 최소화 :
      다량의 데이터, 다량의 클라이언트를 효율적으로 관리
      - 작업 배치 처리 :
      thresh hold를 넘지 않는 선에서 작업 배치 처리
      - Lock 최소화 :
      한 클라이언트가 Index, Segment에 I/O 작업을 할 때, 다른 클라이언트는 접근할 수 없음
    위와 같은이유로 Caching 및 메모리 지원을 사용한다!

(4) 다양한 검색 기능

ES는 다양한 검색을 지원한다.

  • Full text 검색
  • DSL(Domain Specific Lauguage)지원 일치(match), 범위(range), 접두사(prefix), 정규 표현식(regexp) 등등
  • 필터링
  • 집계
  • 자동완성(치다 보면 알아서 완성됨. 개꾸르)
  • 지리 검색(지리 정보를 주고 "가까운 순서로 배열해!" 하면 해줌. Wow)

(5) 사람들이 많이 씀

이게 원인과 결과의 선순환이지만, 매우 좋은 점이다.
사람들이 많이 쓰니, 더욱 편한 툴, 쿼리 등 많은 것이 있고, Stackoverflow 혹은 ChatGPT에게 물어보면 아주 쉽게 Debug을 할 수 이따!

오늘은 여기까지!
다음에는 index, shard, 설치 방법에 대해서 알아보겠다!

reference

https://suyeon96.tistory.com/38

profile
안녕하세요

0개의 댓글