여러분이 개발 초보시절 열심히 print를 찍어가며 열심히 변수를 확인할때를 생각해봐라.
지금은 물론 logger 의 도움을 받아 너무나도 편하게 log.debug();를 사용하고 있겠지만, 그만큼 나의 행동 혹은 프로그램의 행동을 기록으로 남기는 것은 지금에서도, 나중에 있어서 이 데이터를 활용할때 있어서도 너무 중요하다.
그래서 log를 쌓아주는 ELK 스택에 대해서 쓴다.
사실 뭔가 공감되는 말을 쓰고 싶었는데, 야근하고 오니까 정신이 없다.
바로 본론으로 가자.
E : ElasticSearch(적재)
L : Logstash(수집)
K : Kibana(시각화)
log를 수집 및 가공, 시각화 해주는 든든한 3형제이다.
이 사슴 3형제가 바로 ELK이다.
블랙모드 쓰는 개발자들은 그림이 잘 안보일것이다.
ElasticSearch 공홈에서 svg로 사진을 주었다.
미안하다.
뭐 아무튼 각각 로그를 수집 적재 시각화 하는 툴인데, 많은 사람들이 정말 사랑하지 않을 수 없는 툴이다.
ES를 쓰는 이유는 정말 다양하다.
그 중 정말 눈에 띄는 장점을 뽑자면 다음과 같다.
흔히 대용량 데이터 처리 및 분석하면 Spark, Hadoop Eco System을 떠올린다.
위의 기술은 데이터를 수집하고, 적재하고, 꺼내서 분석하는 단계적인 성질을 가지고 있다.
그런데 ELK는 수집과 적재, 분석이 거의 동시에 이루어진다.
그것이 가능한 이유는 (2) 역 인덱스 때문이다.
나머지는 밑에서 설명하도록하겠다.
따라서 데이터를 실시간으로 받고 분석이 이루어져야 하는 시스템에서 매우 적합한 분산 검색 및 분산 엔진이다!
인덱스라 함은 주로 데이터에 번호를 매긴다고 보면 된다.
그런데 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)하여 사용하게 때문에 설명을 위해서 띄어쓰기를 했다)을 찾아본다고 하자.
이것이 ES의 검색 process이다.
여기서 알아두어야할 것 은 inverted index와 Document Storage가 따로 있다는 것이다!
그래서 ES에는 검색 점수인 score을 이용한다. 뭐 이건 밑에서 설명하도록 하겠읍니다.
아니 그래서 왜 쓰냐구요;
그래 왜 쓰냐.
왜 쓰냐면 이게 위의 예시는 단어 자체도 3개밖에 안되고, 전체 데이터가 5개밖에 안되기 때문에 모든 인덱스를 돌면서 찾는 방법과 많이 차이 나지 않을 수 있다.
그러나 전체 데이터가 1억개 라고 해보자.
(로그 수준의 데이터라면 사실 1억개도 정말 상당히 적은 데이터이다)
1억개의 단어 중 "elasticsearch"라는 단어를 찾을때,
index로 찾으면 1억개를 모두 돌아야하지만,
inverted index로 찾으면 O(1)으로 단 한번에 찾을 수 있다.
물론 예시를 정말 쉽게 들었지만, 그렇다 하더라도 key,value 값으로 대조해서 찾는 것과 모든 인덱스를 비교하는 것들 생각하면, 진짜 어마어마한 차이이다.
ES는 위에서 말한것 처럼 inverted index를 지원하는데, 분산 아키텍처(Distributed Architecture)에서 이를 나누어서 지원한다.
무슨뜻이냐면, 3개의 노드에
1번 노드 : "가" ~ "하" 까지 들어있음
2번 노드 : "a" ~ "z" 까지 들어있음
3번 노드 : "1" ~ "9" 까지 들어있음
이라고 가정해보자.
만약 "h"를 찾으려고 할 때, 1번,2번,3번 노드에 동시에 "h"를 찾는 작업을 수행하게 된다.
이렇게 되면 단일 노드로 처리할 때보다 일반적으로 더 빠른 시간안에 수행을 할 수 있다.
또한, 분산처리의 장점인 병렬처리, 부하분산, 확장성, 고가용성(하나의 노드가 죽을 경우, 다른 노드에 미리 데이터를 분할 저장해서 작업을 정상적으로 진행하게 함!), 지리적 분산(가까운 곳에 있으면 빠름!)을 모두 사용할 수 있다.
분산처리는 매우 중요하기도 하면서 Spark의 탄생, 존재이유와 같기 때문에 추후 글로써 정리하고 링크를 달아두겠읍니다.
ES는 캐싱 및 메모리 사용을 지원한다.
크게 5가지 캐싱 및 메모리 사용을 지원하는데,
ES는 다양한 검색을 지원한다.
이게 원인과 결과의 선순환이지만, 매우 좋은 점이다.
사람들이 많이 쓰니, 더욱 편한 툴, 쿼리 등 많은 것이 있고, Stackoverflow 혹은 ChatGPT에게 물어보면 아주 쉽게 Debug을 할 수 이따!
오늘은 여기까지!
다음에는 index, shard, 설치 방법에 대해서 알아보겠다!