데이터 저장 - EFK 스택 사용방법

[컴퓨터월드]

▲ 이동균 버즈니 리서치 엔지니어

1. 데이터 수집 - 크롤링 소개, Scrapy 및 BeautifulSoup 사용방법
2. 데이터 저장 - EFK 스택 사용방법
3. 데이터 가공 및 분석(1)
4. 데이터 가공 및 분석(2)
5. 데이터 가공 및 분석(3)

 

지난 글에서는 빅데이터 분석의 시작으로 파서와 크롤러를 만들어 원하는 데이터를 수집하는 방법을 알아봤다. 이미 수집한 데이터를 우리가 갖고 있는 멋들어진 알고리즘으로 분석하기 전에, 잠깐 다음과 같은 상황을 생각해보자.

현재 우리는 목적에 맞는 분석 알고리즘을 갖췄으며, 모든 데이터는 평소 익숙하게 사용하던 RDBMS에 저장한 상태다. 어느 날 갑자기 수집하는 데이터의 종류가 늘어나거나 변경돼 데이터의 스키마가 변경된다면 어떨까? 며칠에 한 번씩 없던 컬럼이 생기거나 있던 컬럼이 없어진다면? 컬럼의 데이터 형태가 변경된다면 어떨까? 아마 데이터 분석과 스키마 유지보수를 하느라 하루가 어떻게 지나가는지도 모를 것이다.

또, 사업이 급속도로 성장하는 통에 분석을 요구하는 데이터의 종류가 하루가 다르게 늘어난다면? 데이터가 하루에도 최소 수 기가바이트씩 쌓이고 있다면? 변화무쌍한 스키마 덕에 분석에 필요한 데이터를 검색하는데 수 십초씩 걸린다면 어떨까? 필시 데이터 시각화 도구와 대시보드를 유지보수를 위한 전담팀을 꾸려야 할 수도 있다.

일견 극단적인 상황들만 나열한 것처럼 보이지만 사실 위에 언급한 일들은 상당히 일반적이다. 일주일에도 몇 번씩 벌어지곤 하는 다양한 데이터 재앙을 ‘EFK 스택’을 이용해 효과적으로 극복해오고 있다.

이번 글에서는 EFK 스택을 이루고 있는 ▲데이터 저장소이자 검색엔진인 ‘엘라스틱서치(ElasticSearch)’ ▲로그 파싱/수집기 ‘플루언티드(Fluentd)’ ▲데이터 시각화도구이자 엘라스틱서치의 대시보드인 ‘키바나(Kibana)’를 소개하고, ‘엔진X(NginX)’ 웹서버를 위한 로그 수집 시스템을 직접 구축해보도록 한다.


‘EFK 스택’이란

시작하면서 잠깐 언급했듯 EFK 스택은 엘라스틱서치, 플루언티드, 키바나의 3개 툴로 이뤄져있으며, 각각의 첫 글자를 따서 만든 합성어다.

엘라스틱서치는 루신(Lucene)을 기반으로 한 분산 검색 시스템으로, ‘쿼리를 통한 질의가 가능한 JSON 문서 기반 NoSQL 저장소’라고 설명할 수 있다. 엘라스틱서치를 사용하는 가장 큰 이유는 설정과 사용의 용이함이다. 설치에서 실행까지 5분도 걸리지 않으며, 각 엘라스틱서치 노드의 설정파일에서 true, false 값만 몇 개 조정해주면 마스터노드, 데이터노드, 서치노드로 구성된 클러스터를 구축할 수 있다.

최고의 오픈소스 검색엔진인 루신을 기반으로 하고 있으므로 루신의 고급 검색기능 외에도 인덱스에 대한 멀티테넌시나 JSON을 통한 쿼리 DSL(Query DSL), 퍼컬레이션(Percolation) 같은 기능들도 추가로 제공하고 있으며, 플러그인을 통해 원하는 기능을 어렵지 않게 추가할 수 있다.

플루언티드는 로그 수집기로, 사용자의 로그를 다양한 형태로 입력받아 JSON 포맷으로 변환한 뒤 다양한 형태의 출력방법을 통해 쌓을 수 있도록 해준다. 일반적으로 플루언티드 대신 로그스태시(Logstash)를 이용한 ‘ELK 스택’이 더 많이 알려졌는데, 로그스태시가 엘라스틱서치, 키바나와 같은 회사인 엘라스틱(Elastic)의 제품군에 들어가기 때문이다. 둘의 차이에 대해 아래 표에 간단히 정리해봤다.

▲ 로그스태시 vs 플루언티드

ELK와 EFK 중 어떠한 스택을 사용해도 무방하지만, 최근에는 운영과 설정상의 단순화를 위해 ELK보다 EFK 스택을 선택하는 추세다. 본 글에서도 상대적으로 설정이 간단하고 직관적인 플루언티드를 이용해 로그 분석 시스템을 구축해본다.

마지막으로 키바나는 데이터 시각화 도구로, 엘라스틱서치에 쌓인 데이터를 시각적으로 볼 수 있도록 대시보드를 제공한다. SQL의 WHERE 절 모양의 간단한 형태의 질의부터 JSON을 이용한 복잡한 쿼리 DSL 질의를 통해 사용자가 원하는 형태의 데이터를 쉽게 볼 수 있도록 도와준다.


버즈니 활용사례 - 로그 분석 시스템

국내 모든 홈쇼핑 상품을 한눈에 모아 볼 수 있는 ‘홈쇼핑모아’를 서비스 중인 버즈니에서도 사용자 로그 분석 시스템, 검색 시스템, 실시간 모니터링 시스템 등에 EFK 스택을 적극적으로 활용하고 있다.

로그 분석 시스템의 경우 하루에 수 기가씩 쌓이는 사용자의 요청을 4대의 웹서버를 통해 수집한 뒤 플루언티드를 통해 엘라스틱서치에 전달하고, 해당 정보를 추천 푸시 대상 추출이나 검색어 추천 등에 이용하고 있으며, 데이터의 부정확성이나 이상패턴을 파악해 슬랙(Slack)을 통해 알람을 해주는 실시간 모니터링 서비스와도 연동하고 있다.

이뿐만 아니라 키바나를 통해 누구든 즉시 서비스의 모든 데이터를 쉽게 확인할 수 있게 되면서 마케팅팀에서도 프로모션이나 마케팅 효과를 수치와 그래프를 통해 직접 확인할 수 있게 돼 효율적인 리소스 사용이 가능해졌다.

▲ 버즈니 로그 분석 시스템 구조도


EFK 설치 및 설정

EFK를 설치하고 엔젠X 로그 데이터를 플루언티드를 이용해 엘라스틱서치에 쌓는 방법에 대해서 알아보도록 한다. 설치와 설정은 리눅스-우분투(Ubuntu) 환경에서 진행된다고 가정하겠다. 각 도구의 설치는 너무 간단하다. 다운받고 압축을 풀면 바로 실행할 수 있다. 웹상에도 수많은 한글 문서가 있으므로 본 글에서는 설치에 대해서는 다루지 않겠다. 대신 로그스태시, 플럼(Flume) 등 다른 도구로 언제든 대체할 수 있으며, 독특한 구조로 돼있는 플루언티드의 개념 설명과 설정에 대해 좀 더 자세히 다뤄본다.

플루언티드 설치 및 설정

플루언티드는 로그 파서 겸 수집기로, 플러그인 방식으로 입력, 전달, 출력을 제어할 수 있다. 직관적인 구조로 설정이 매우 간편하지만, 로그스태시에 비해 유연성이 부족하기 때문에 복잡한 형태의 데이터를 수집해야 할 때는 로그스태시를 이용하는 것이 나을 수도 있다.

버즈니에서는 엔진X 로그 및 자체 규격의 서비스 로그를 수집하는데 해당 로그들의 형태가 정형화돼있고 크게 복잡하지도 않기 때문에 플루언티드를 사용해 로그를 수집하고 있으며, 운영 면에서 상당히 만족스럽게 생각하고 있다.

▲ 플루언티드 구조

플루언티드의 이벤트 처리방식은 독특하지만 이해하기 어렵진 않다. 플루언티드에서 모든 데이터는 태그를 갖고 있고 데이터를 처리하는 각 단계는 태그를 기준으로 구분된다. 각 단계를 지날 때마다 데이터에 달려있던 태그를 수정할 수 있으며, 이를 이용해 다양한 형태의 데이터를 효과적으로 가공할 수 있다. 실제 사용할 설정파일을 보면서 흐름을 따라가 보자.

▲ 플루언티드 설정파일

설정파일의 섹션은 source와 match로 나눠진다. 모든 섹션은 플러그인을 이용해 처리되며, 각 섹션의 type 필드를 통해 어떠한 플러그인을 사용할지 선언해줄 수 있다.

먼저 source는 데이터를 입력받을 방법을 지정하는 부분으로, 여기서는 tail 플러그인을 통해 입력을 받는다. tail 플러그인은 파일의 마지막 10줄을 읽어 들이는데, 리눅스의 ‘tail -F’와 마찬가지로 추가된 내용을 지속적으로 추적해 읽어 들인다.

이때 입력받은 데이터에는 source 섹션의 tag 필드에 의해 grep이라는 태그가 달리며, 데이터는 이제 grep 태그를 처리하는 10~15번 라인의 match 섹션으로 전달된다. 해당 섹션에서 사용하는 플러그인은 fluent-plugin-grep이라는 서드파티 플러그인으로, 따로 설치해야 한다.

플루언티드의 플러그인 설치 역시 간단하다. ‘gem install fluent-plugin-grep’(td-agent를 쓴다면 ‘td-agent install fluent-plugin-grep’)만 입력하면 바로 설치가 완료된다. grep 플러그인은 JSON 데이터에서 지정한 문자열이 포함된 키값(key-value)을 필터링해준다. 예제에서는 key가 path이며, value에 ‘/static’으로 시작하는 데이터는 삭제해준다.

grep 플러그인의 처리가 끝난 데이터의 태그는 이제 es.ouput으로 변경되며, 13~18번 라인의 es로 시작하는 모든 태그를 처리하는 match 섹션으로 데이터가 전달된다. 해당 섹션은 엘라스틱서치 플러그인을 통해 ‘localhost:9200’에 설치된 엘라스틱서치에 데이터를 쌓는다.

위 설정파일로 플루언티드를 실행하고, 설정파일이 있는 폴더에 실제 엔진X 로그파일을 nginx.log.1이라는 이름으로 복사해 넣으면 플루언티드가 자동으로 추가된 파일을 인식하고 처리하는 것을 확인할 수 있다.

▲ 플루언티드 통해 쌓인 엔진X 데이터를 키바나로 확인하는 화면

참고: 테스트용 더미데이터 쌓기

엔진X 로그파일이 없다면 cUrl을 이용해 데이터를 직접 추가할 수 있다.

▲ cUrl 이용해 customer 인덱스에 문서 추가

http로 입력하는 방식이 편하긴 하지만, 하나하나 입력하기에는 시간과 노력이 너무나 아깝다. 좀 더 복잡하고 많은 더미데이터를 자동으로 추가할 방법이 없을까? 만약 현재 작업환경에 노드JS(Node.js)와 NPM이 설치돼있다면 makelogs 프로그램을 이용할 수 있다. ‘npm install -g makelogs’ 명령을 통해 설치할 수 있으며, 이를 이용하면 복잡한 더미데이터를 원하는 만큼 자동으로 생성할 수 있다.

▲ makelogs 이용해 더미데이터 쌓기

파이썬(Python)으로 데이터 제어하기

마지막으로 엘라스틱서치에 쌓은 데이터를 파이썬을 통해 객체로 가져와보자. 파이썬 환경에서 엘라스틱서치의 데이터를 가져오는 방법으로는 크게 urllib, pycurl, requests 등의 라이브러리를 이용해 직접 http 요청을 생성하는 방법과, 엘라스틱서치에서 공식적으로 지원하는 파이썬 라이브러리를 설치해 사용하는 방법이 있다.

개인적으로는 공식 라이브러리를 이용하는 것을 추천하는데, 코드 양과 가독성에서 현격한 차이를 보이기 때문이다. 아래 그림에서 볼 수 있듯이, py-elasticsearch 라이브러리를 이용하면 단 2줄의 코드로 데이터를 쌓고 가져올 수 있다.

▲ py-elasticsearch 이용해 엘라스틱서치에 데이터 쌓고 가져오기

 

이번 글에서는 엘라스틱서치, 플루언티드, 키바나로 이뤄진 EFK 스택을 이용해 엔진X 데이터를 쌓고, 파이썬을 이용해 쌓아둔 데이터들을 가져오는 방법에 대해 알아봤다.

솔라(Solr), 스핑크스(Sphinx) 등 엘라스틱서치를 대체할 수 있는 다양한 공개SW 솔루션들이 존재하고 있지만, 최근 검색과 관련된 모든 분야에서 엘라스틱서치가 빠지지 않고 언급되는 이유는 쉬운 사용성 때문일 것이다.

엘라스틱서치를 사용하면 5분 만에 검색엔진을 바로 이용할 수 있고, 각 노드마다 설정 몇 개만 조정해주면 멋지게 동작하는 분산 검색 클러스터를 가질 수 있으며, 여기에 도커(Docker)나 베이그런트(Vagrant)와 같은 가상화 기술을 이용하면 클러스터의 노드를 줄이고 늘이는 것조차 자동화할 수 있다.

엘라스틱서치, 플루언티드에 대해 간단한 플러그인도 만들어보고, 엘라스틱서치 클러스터의 노드도 늘렸다 줄였다 하다보면 하루 수십 기가 정도의 데이터는 더 이상 ‘빅(big)’하게 느껴지지 않게 될 것이다.

저작권자 © 아이티데일리 무단전재 및 재배포 금지