온라인 서비스를 위한 빅데이터 플랫폼
비즈스프링의 여러 제품에서는 데이터를 이용하기 위한 목적에 따라 다양한 데이터 엔진을 사용하고 있습니다. 텍스트 데이터를 저장하는 파일 스토리지에서부터 MySQL과 같은 RDBMS(관계형데이터베이스), MongoDB / elasticsearch와 같은 document 기반의 NoSQL 엔진, BigQuery와 같은 DW/DL 등 데이터를 처리하기 위해 가장 적절한 엔진을 필요한 위치에 배치하여 이용하고 있습니다. 오늘은 그중에서도 elasticsearch에 대해 장/단점, 특이점을 알아보겠습니다.
위의 도식은 비즈스프링에서 제공 중인 여러 제품에서 데이터의 입력(source), 가공, 리포팅 및 출력(destination) 간 흐름과 데이터를 처리하는 툴/엔진을 간단하게 그린 것입니다.
웹분석, 광고 성과 분석 등 여러 제품의 니즈에 따라 수집된 원천 데이터는 1차적으로 (로그/텍스트) 파일로 적재됩니다. 물리적인 디스크 공간의 제약을 빼면 가장 안전하고 빠르기 때문입니다. 하지만 텍스트파일 형태의 데이터는 바로 서비스가 불가능하므로 조회할 수 있는 형태의 데이터 엔진으로 전달되어야 합니다. 이때 사용되는 엔진은 MySQL, Elasticsearch, BigQuery 등 여러 가지가 있으며, 목적에 따라 적합한 엔진이 사용됩니다.
Raw(원천) 데이터를 이용하는 경우 실시간으로 적재되는 시점의 데이터를 바로 서비스할 수 있다는 장점이 있지만, 압축된 한 줄의 결과를 도출하기 위해 소비해야 하는 자원 소모가 매우 큽니다. 데이터의 양이 클수록 처리 시간도 많이 걸릴 뿐만 아니라, 처리에 들어가는 프로세싱(CPU, 메모리) 자원이 비싸고, 또한 매번 조회가 1회 성으로 수행되므로 조회 때마다 동일한 작업이 반복되어 자원의 낭비가 심해집니다. 따라서, 고객에게 제공할 데이터는 아래의 도식처럼 정제(refine)라고 불리는 가공 과정을 거쳐 압축되고, 서비스할 준비가 됩니다.
위 도식에는 여러 가지 데이터 엔진이 있습니다만, 주로 많이 사용하는 엔진인 BigQuery와 elasticsearch의 특징을 간략히 살펴보고, elasticsearch가 어떤 장점을 가지고 있어서 실제 리포팅 엔진으로 사용되게 되었는지 설명해 보려고 합니다.
빅쿼리는 구글 클라우드에서 사용 가능한 데이터 엔진입니다. 매우 큰 규모의 데이터를 RDB의 테이블과 같은 구조로 저장이 가능하고, ANSI SQL을 이용하여 데이터의 질의가 가능합니다. 단일 쿼리에 대하여 필요한 자원을 스스로 프로비저닝하여 분산 처리하고 결과를 반환해 줍니다. RDB에서처럼 그룹 함수를 이용하여 원천 데이터를 가공, 정제된 결과물을 구하는 작업 시 뿐만 아니라, 다수의 테이블을 JOIN 하여 속성을 연결하거나, 다수의 쿼리를 시계열로 구성하여 프로그램처럼 구성할 수 있는 장점이 있습니다.
엘라스틱서치(Elasticsearch)는 apache lucene을 기반으로 한 검색엔진으로 개발되었습니다. 텍스트 검색에 매우 뛰어난 검색 성능을 보여주는데, 비교적 저사양의 노드로 구성된 클러스터로도 매우 많은 양의 텍스트를 빠르고 안정적으로 서비스가 가능합니다. JSON 문서 기반으로 데이터가 작성되며, 데이터 저장 시에 미리 정의하지 않은 컬럼도 인덱싱이 가능하여 스키마의 변경이 자유롭습니다. 검색엔진이 기반이기 때문에 키워드/결과 차원에 대한 스코어링이 기본적으로 탑재되어 있습니다. 따라서 원래 목적인 검색 결과/차원(dimension)에 따라 분류/집계(aggregation) 하고, 통계 값을 매기는 스코어링을 할 수 있어 리포트 – 통계를 내는 목적으로도 이용이 가능합니다.
여러 가지 엔진이 있음에도 불구하고, Elasticsearch를 온라인 서비스용 데이터 엔진으로 사용한 가장 큰 이유는 ‘매우 빠르다’라는 것과 ‘실시간 리포팅에 강하다’는 것입니다.
아래의 두 예제에서 동일한 데이터를 BigQuery와 Elasticsearch 엔진을 통해 조회해 보겠습니다.
BiqQuery에서 데이터를 조회하는데 3초의 시간이 걸렸습니다. 이미 압축된 형태의 전체 데이터 양은 30만 건 내외로 빅데이터 세상에서는 매우 작은 크기입니다. BigQuery에서는, 작은 크기의 데이터일지라도 처리를 위해 처리할 데이터를 분배할 서버 자원을 내부적으로 프로비저닝 후, 데이터를 로드하고, 맵/리듀스 과정을 거처 결과가 나오기까지의 시간을 다수 소모합니다. 따라서 리포트 화면과 같은 서비스에 직접 연결하여 사용할 경우 데이터 로딩이 느려져 답답함을 느낄 수 있습니다.
따라서, 빅쿼리는 아래와 같이 성능/기능면에서 뚜렷한 장점이 있음에도 불구하고, 서비스용 데이터 엔진으로 사용하기는 어려움이 있습니다.
데이터양에 따라 처리에 필요한 자원을 알아서 늘리므로, 매우 큰 사이즈의 데이터를 조회하더라도 적정한 시간 내에서 처리가 완료될 수 있습니다.
쿼리를 유연하게 작성 가능하여, 매우 복잡한 쿼리도 수행이 가능합니다.
동일한 데이터를 조회하는데 elasticsearch는 14밀리초가 걸렸습니다.
Elasticsearch의 장점은 여러가지가 있지만 대표적으로
REST 기반 인터페이스로 사용이 편리하고, JSON 형태의 데이터를 사용하므로 스키마에서 자유롭습니다. 즉, 정의한 데이터가 누락되어도 잘 작동하고, 정의하지 않은 데이터도 입력(인덱싱)이 가능합니다.
분산처리(클러스터링)으로 대량의 데이터도 빠르게 처리합니다. sharding에 따라 처리 속도를 높일 수 있으며, 데이터노드를 추가하면 알아서 shard를 재분배하여 최적의 성능을 내줍니다.
실시간 데이터 처리가 가능합니다. 원천(raw) 데이터 레벨에서 데이터 조회가 필요한 경우, 입력과 거의 동시에 바로 조회가 가능합니다.
대부분 광고 매체사에서, 위 화면과 같은 광고 성과 리포트는 일 단위로만 제공됩니다. 즉, 오늘 자 광고 집행 결과는 내일이 되어야 확인이 가능합니다. 실시간으로 광고 성과 측정값을 제공하는 곳은 비즈스프링의 AMP(Ad Management Platform)나 CTS 외에는 찾아보기 어렵습니다. 비즈스프링에서 실시간 리포팅이 가능한 이유는 elasticsearch 엔진을 리포팅 엔진으로 사용하고 있기 때문입니다.
Logstash를 이용하여, 로그파일을 실시간 인덱싱하고, Elasticsearch는 준비된 데이터를 매우 빠르게 검색/집계하고 응답하므로, (특히 실시간) 서비스용 데이터 엔진에 최적이라고 봐도 좋겠습니다.
여기까지 비즈스프링에서 실제로 사용하는 데이터 엔진 중 Elasticsearch에 대해 알아보았습니다.
이와 관련한 궁금한 점이 있다면 언제든지 비즈스프링으로 문의해 주세요.
문의 02-6919-5516 / ad@bizspring.co.kr