로플랫은 오프라인 매장 방문자의 체류시간, 유입경로, 교차방문, 경쟁사 분석 등을 분석하여 인사이트를 도출하는 기업이다. 다양한 오프라인 데이터를 보유하고 있기 때문에 쌓이는 데이터 양만 월간 4.5TB라고 한다. 이렇게 방대한 양의 데이터를 로플랫은 어떻게 처리하는지 알아보자.
기술 블로그 출처
대용량 데이터 활용
로플랫은 사용자에게 다양한 오프라인 기반 인사이트를 제공하기 위해 현재 위치 인식 기술을 기반으로 하는 'loplat X'와 방문객의 동선을 기반으로 하는 'loplat i'를 제공하고 있다. 이를 통해 방대한 양의 데이터를 추출하고 가공하여 사용자에게 제공함으로써, 오프라인 환경에서의 마케팅 및 분석을 지원한다.
사용자의 니즈에 따라 필요한 기간별로 오프라인 데이터 검색 결과를 보고 싶다면 어떻게 시스템을 구성해야 할까?
대용량 데이터 처리의 어려움
대용량 데이터 처리는 엔지니어에게도 쉽지 않은 일이다. 현실적으로 학교나 책에서 배운 내용은 입문 위주이거나 구현에 초점을 두는 경우가 많아서 실제 처리 과정에서 예상치 못한 난관을 겪을 때가 많다. 이로 인해 개발자들은 마치 돌도끼로 바퀴를 발명하는 듯한 상황에 처한 것처럼 느낄 수 있다. 또한, 개발한 제품이 서비스되고 사용자가 생겨 트래픽이 발생하기 시작하면, 개발 또는 데이터베이스 처리 등의 문제가 발생할 수 있다. 이러한 문제는 사용자 수가 적거나 트래픽이 낮은 경우에는 발생하지 않을 수 있지만 대용량 데이터를 처리하는 과정에서는 어려움이 생긴다. 결국 대용량 데이터 처리 기술은 시행착오를 겪으며 얻어지는 경험을 통해 터득되기 때문에 다양한 사례를 통해 어떤 점을 고려해야 하는지 알아보자.
1. 설계 단계
대용량 데이터를 처리하기 위해 구글 클라우드의 BigQuery를 사용한다. BigQuery는 쿼리를 분산 처리하여 높은 확장성을 제공하고, 인프라 관리 부담이 없어 비즈니스 로직에 집중할 수 있도록 도와준다.
* Google BigQuery: 빅쿼리(Big Query)는 머신러닝, 지리정보 분석, 비즈니스 인텔리전스와 같은 기본 제공 기능을 이용해 데이터를 관리하고 분석할 수 있게 해주는 데이터 웨어하우스이다.
클라우드 서비스를 통하여 제공되기 때문에 설치하지 않아도 되고 익숙한 RDBMS에서 사용되던 SQL 쿼리를 그대로 사용하여 접근성이 좋다. 또한, 테라바이트(Terabyte)급 쿼리를 초 단위로 수행하고 페타바이트(Petabyte)급에 달하는 쿼리도 분 단위로 쿼리할 수 있을 정도로 빠른 성능을 가지고 있다.
2. 구현 단계
구현 단계에서도 최적화를 통해 부담을 줄이는 것이 중요하다. 보통 관계형 데이터베이스에서 부분 검색을 하려면 LIKE 검색을 사용하지만, 데이터 양이 많아지면 인덱스를 활용하지 못해 데이터베이스 부하가 발생할 수 있다. 이를 해결하기 위해 Full Text Search(FTS) 인덱스나 Elasticsearch를 사용할 수 있다.
또한, 로그 데이터의 시간별, 일별 집계 메타 데이터나 중복되지 않는 유일한 값의 메타 데이터를 조회해야 할 때는 COUNT, GROUP BY, DISTINCT 키워드를 조합하여 집계할 수 있다. 하지만 실시간으로 로그 데이터가 생성되고 업데이트되는 상황에서는 이를 실시간으로 처리하는 것은 쉽지 않다.
이를 해결하기 위해 집계 데이터를 실시간으로 생성하는 것보다는 일정 주기로 미리 만들어 보여주거나, Redis와 같은 인메모리 데이터 스토어를 활용하는 것이 좋다. 이를 통해 데이터 처리 부하를 줄이고 실시간으로 집계된 데이터를 제공할 수 있다.
3. 운영 단계
실제로 운영할 때는 대용량 데이터 특성에 맞는 상황을 고려해야 한다. BigQuery를 사용하여 대규모 데이터를 처리하고 있지만, 모든 정보가 필요하지 않을 때는 최적화된 데이터만을 분석에 활용한다. 또한, 주기적으로 일정 기간이 지난 데이터는 저렴한 스토리지로 옮기거나 쿼리 시에 와일드 카드 검색을 자제하고 필요한 필드와 기간만을 조회하여 효율적인 운영을 추구해야 한다.
4. 장애 발생 시 대응
Bigquery와 같은 SaaS를 사용할 때는 100% SLA를 보장받지 않기 때문에, 예기치 못한 문제 상황에 대비하여 구성해야 한다. 이를 위해 이중화 구성이나 실패 시 알림을 설정하여 장애 발생 시 신속하게 대응할 수 있도록 해야 한다. 또한, 우회하거나 재시도할 수 있는 로직이나 프로세스를 추가로 고려하고, 최악의 경우엔 수동으로 처리할 수 있도록 대비해야 한다.
* SLA(Service Level Agreement): 서비스 제공자와 이용자 간에 서비스 수준에 대한 합의를 나타내는 문서나 계약이다. 일반적으로 SLA는 서비스 제공자가 제공하는 서비스의 품질, 가용성, 성능 등과 관련된 목표를 정의하고, 이를 이용자에게 보장한다는 내용을 포함한다.
카오스 엔지니어링
이에 방법론으로는 카오스 엔지니어링이 있다. 카오스 엔지니어링이란, 시스템의 안정성과 견고성을 향상시키기 위해 의도적으로 시스템에 장애를 유발하고 그 상황을 모니터링하며 대응하는 과정이다. 이는 시스템에 예기치 않은 상황에서 어떻게 동작하는지 이해하고 잠재적인 결함을 발견한 후 수정하는 데 도움이 된다. 카오스 엔지니어링은 시스템이 실제 운영 환경에서 직면할 수 있는 여러 장애에 대한 대비를 강화하기 위해 사용된다.
카오스 엔지니어링은 넷플릭스에서 처음 도입되었으며, 현재는 많은 기업들이 안정성과 회복력을 강화하기 위해 활발히 채택하고 있다.