Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

SQL 데이터에 Elasticsearch 기반 검색 및 시각화 기능 추가하기

SQL 데이터에 Elasticsearch 기반 검색 및 시각화 기능 추가하기

최신 NoSQL 데이터 스토어가 화려하게 주목받고 있지만, 관계형·SQL 기반 데이터베이스는 여전히 건재하며 널리 활용되고 있습니다. 실제로 함께 작업하는 거의 모든 고객 환경에서 MongoDB, Redis, Elasticsearch와 더불어 MySQL, PostgreSQL 또는 MS SQL Server가 공존하고 있습니다. 관계형 데이터베이스의 데이터를 다른 데이터 스토어로 복제하는 가장 쉬운 방법에 대한 문의도 흔합니다. 마이그레이션을 위해서일 수도 있고, 관계형 데이터에 전문(Full-text) 검색이나 시각화 같은 기능을 추가하기 위해서일 수도 있습니다. 다행히도 Elasticsearch를 활용하면 이 과정이 무척 간단해집니다.

저희는 최근 『관계형 데이터베이스를 Elasticsearch에 연결하기(Connecting Relational Databases to Elasticsearch)』 백서를 통해 구체적인 절차와 고려해야 할 의사결정 사항들을 자세히 정리했습니다. 이 글에서는 그 핵심 개요를 빠르게 살펴보겠습니다.

적합한 도구 선택하기

웹에는 다양한 마이그레이션·복제 도구가 존재하고, 직접 코드를 작성하는 것도 큰 부담은 아니지만, 지금까지의 경험상 가장 뛰어난 솔루션은 단연 Logstash와 JDBC 입력 플러그인입니다.

Logstash는 만능칼처럼 다양하게 활용되는 데이터 수집기이자 변환기, 전송기입니다. Elastic Stack의 일부이기 때문에 Elasticsearch로 데이터를 손쉽게 전송하는 능력 역시 타의 추종을 불허합니다. 이렇게 Elasticsearch 전송 부분은 해결되었는데, 그렇다면 관계형 데이터베이스에서 데이터를 가져오는 일은 어떻게 할까요?

Logstash가 제공하는 여러 입력 중 하나가 바로 JDBC 입력입니다. JDBC는 자바 애플리케이션이 데이터베이스에 접근하는 방식을 정의한 표준입니다. 데이터베이스에 JDBC 호환 드라이버만 존재한다면, Logstash의 JDBC 입력을 통해 표준 SQL 쿼리로 데이터를 추출할 수 있습니다. 대부분의 관계형 데이터베이스가 무료 JDBC 드라이버를 폭넓게 지원하고 일부 비관계형 데이터베이스까지 지원하기 때문에, 다른 데이터베이스를 Elasticsearch와 연결하는 가장 쉬운 경로가 됩니다.

SQL 데이터에 Elasticsearch 기반 검색 및 시각화 기능 추가하기

연결 설정하기

JDBC 호환 데이터베이스와 호환 드라이버만 준비되어 있다면, 몇 가지 정보로 Logstash를 설정하는 것만으로 연결이 완성됩니다.

  • JDBC 구성 정보
  • 관계형 데이터베이스의 인증 정보 및 연결 정보
  • 필요한 데이터를 추출하기 위한 SQL 쿼리 또는 문장
  • Elasticsearch의 인증 정보 및 연결 정보

이 정보만 갖추면 Elasticsearch로 데이터를 옮기는 작업은 매우 간단합니다.

중요한 질문 던지기

관계형 데이터를 Elasticsearch로 복제하거나 마이그레이션할 때, A지점에서 B지점으로 데이터를 옮기는 것은 절반에 불과합니다. 더 중요하고 깊은 고민이 필요한 질문은 Elasticsearch에서 해당 데이터를 어떻게 모델링할 것인가입니다. Elasticsearch에서 관계형 데이터의 문제점은 솔직히 말해 바로 '관계' 그 자체입니다.

Elasticsearch는 무엇보다 검색 엔진이지만, 데이터 모델은 본질적으로 문서 저장소이며 문서 간 관계에 대한 지원은 최소한에 그칩니다. 따라서 Elasticsearch에서 데이터를 어떻게 모델링할지 몇 가지 결정을 내려야 합니다.

일반적으로 제시되는 세 가지 표준 옵션은 다음과 같습니다.

  • 데이터 비정규화(Denormalization): 관계를 모두 제거하고, 테이블 데이터의 모든 조합에 대해 고유한 문서를 생성하는 방식입니다.
  • 문서 내 배열(Array): Elasticsearch는 각 문서 안에 객체 배열을 생성할 수 있으며, 특수한 "nested" 데이터 타입을 제공해 일부 쿼리에서 배열의 각 멤버를 별도의 문서처럼 평가할 수 있습니다.
  • 부모-자식(Parent-Child) 관계: 마지막 옵션이자 진정한 관계형 데이터베이스에 가장 가까운 방식입니다. 특정 문서가 다른 문서의 자식임을 지정할 수 있습니다.

Elasticsearch가 데이터 처리를 위한 여러 옵션을 제공하지만, 어떤 방법이 가장 적합하고 요구사항을 충족하는지는 결국 사용자가 판단해야 합니다.

또 하나의 핵심 결정 사항은 얼마나 많은 데이터를 얼마나 자주 Elasticsearch로 복제할 것인가입니다. 마이그레이션이 목적이라면 답은 간단합니다. 한 번에 전체를 덤프하면 되기 때문입니다. 반면 Elasticsearch를 보조 리포팅 데이터 스토어로 활용하려면, 어느 범위의 데이터를 어떤 주기로 복제할지에 대한 추가 선택지가 생깁니다. 정기적인 스케줄에 따라 전체 스냅샷을 복사할 수도 있고, Logstash JDBC 입력 필터의 기능을 활용해 특정 컬럼을 기준으로 필터링하여 새로운 데이터가 발생할 때만 전송할 수도 있습니다. 역시 이 모든 것은 데이터의 성격과 활용 목적에 따라 달라집니다.

의사결정과 상세 가이드

핵심은 데이터 스토어를 연결할 수 있는 도구와 프로세스가 이미 존재하며, 실제로 여러분의 데이터에 적용하기도 꽤 쉽다는 점입니다. 다만 Elasticsearch에서 데이터를 어떻게 모델링하느냐에 따라 쿼리 방식과 시각화 방식에 트레이드오프가 발생합니다. 예를 들어 관계형 데이터를 비정규화하기로 선택하면 결과 데이터 세트의 크기, 특정 집계 수행 방식, 활용 가능한 시각화 유형 등에 영향을 미치게 됩니다.

이 과정과 의사결정 방법을 구체적으로 설명하기 위해 저희는 백서 『Connecting Relational Databases to Elasticsearch(관계형 데이터베이스를 Elasticsearch에 연결하기)』를 작성했습니다. 이 백서에는 샘플 데이터 세트를 대상으로 관계형 데이터베이스-Elasticsearch 복제를 구축하는 표준 절차, 서로 다른 모델링 결정이 결과 데이터에 미치는 영향, 그리고 자신에게 맞는 방법을 선택하기 위한 가이드라인이 체계적으로 정리되어 있습니다.

SQL 데이터에 Elasticsearch 기반 검색 및 시각화 기능 추가하기

유용하게 활용하시기 바랍니다! 추가 정보가 필요하시면 언제든지 sales@objectrocket.com으로 문의해 주세요.