일상/IT

확장 가능한 검색 아키텍처를 구축 : 개요, 방법, 과제, 사례

얇은생각 2023. 4. 21. 07:30
반응형

확장 가능한 검색 아키텍처를 만드는 것은 많은 시스템에서 인기 있고 중요한 작업입니다.

확장 가능한 검색 아키텍처를 만드는 것은 많은 시스템에서 인기 있고 중요한 작업입니다. 이 작업에는 여러 가지 해결 방법이 있습니다. 올바른 항목을 선택하는 것은 프로젝트의 요구 사항에 따라 다릅니다.

프로젝트가 성장하고 요구 사항이 변경되면 사용 중인 검색 아키텍처로는 해결할 수 없는 새로운 문제가 발생할 수 있습니다. 예를 들어, 검색에 동의어를 포함하여 데이터 양을 늘릴 때, 다국어 검색을 추가할 때 등입니다. 이 경우, 보다 효율적이고 확장 가능한 새로운 검색 아키텍처를 만드는 것을 고려해야 합니다.

검색 아키텍처는 대부분의 사용 사례에 필요한 신속한 읽기 및 쓰기 확장을 지원해야 합니다.

효과적인 검색 아키텍처가 해결해야 하는 주요 과제에 대해 이야기할 것입니다. 또한 이러한 아키텍처를 구현하는 주요 방법과 이를 위해 사용할 수 있는 도구에 대해서도 알아보겠습니다. 궁극적으로 검색 엔진 속도를 높일 수 있는 방법을 알려드리겠습니다.

 

 

확장 가능한 검색 아키텍처를 구축 : 개요, 방법, 과제, 사례

 

 

검색 아키텍처의 당면 과제

확장 가능한 검색 아키텍처를 구축하는 것은 다양한 크기와 복잡성을 가진 대부분의 프로그램에서 어려운 일입니다. 이를 해결하기 위해 몇 가지 다른 검색 아키텍처가 있습니다.

그러나 정보 기술의 급속한 발전, 빠르게 성장하는 새로운 시장의 창출 및 SaaS 애플리케이션으로 인해 기존 솔루션이 더 이상 모든 요구사항을 충족할 수 없습니다. 따라서 현대적인 문제를 해결할 수 있는 효율적이고 확장 가능한 새로운 아키텍처를 구축할 필요가 있습니다.

확장 가능한 검색 아키텍처의 개발자들이 현재 직면하고 있는 과제를 살펴보겠습니다.

- 동적 확장성 : 시스템이 수신하는 검색 쿼리 수는 이벤트에 따라 크게 달라질 수 있습니다. 때로는 하루 평균 트래픽에 비해 트래픽 양이 수십 배 증가할 수 있습니다. 쿼리를 효율적으로 처리하려면 검색 엔진이 트래픽 증가를 예측하고 인프라를 확장할 수 있어야 합니다. 1분 이내에 시스템을 추가 및 제거하고 새 시스템을 사용할 수 있게 되기 전에 증가된 트래픽을 임시로 처리하는 것이 중요합니다. 동적 확장성은 비용을 절감하는 동시에 검색 엔진을 창의적으로 사용할 수 있는 새로운 기회를 제공합니다.

- 동적 샤드 수 : 시스템의 성능과 확장 기능은 이 표시기에 따라 달라집니다. 검색 엔진의 최적 성능을 위해 이 숫자는 동적이어야 합니다. 최적의 성능과 확장 기능을 갖추려면 이 값을 자동으로 조정할 수 있어야 합니다.

- 검색과 인덱싱을 구분 : 쿼리 볼륨과 데이터 볼륨을 동시에 확장하는 것은 검색 엔진의 과제입니다. 검색 또는 인덱싱 기능이 증가하면 더 많은 리소스가 필요하므로 인프라 비용이 매우 높아집니다. 검색 엔진의 성능을 최적화하고 인덱싱이 검색에 미치는 부정적인 영향을 방지하려면 인덱싱과 검색을 별도로 조정해야 합니다.

- 네트워크를 통한 병렬 데이터 전송 : 지난 10년 동안 네트워크를 통한 데이터 전송 속도는 약 100배 증가했으며 계속해서 증가하고 있습니다. 동시에 프로세서와 데이터 스토리지는 빠르게 발전하지 못하고 있습니다. 효율적인 확장을 위해서는 병렬화 비율이 높은 다른 데이터 전송 방식을 만들어야 합니다.

 

 

검색 엔진과 데이터베이스의 차이점

검색 엔진과 관계형 데이터베이스는 공통점이 많지만, 이들 사이에는 주요 차이점도 있습니다.

관계형 데이터베이스는 구조화된 데이터를 상호 연관된 테이블의 형태로 저장합니다. 검색 엔진보다 훨씬 많은 정보를 처리할 수 있습니다. 그러나 검색 엔진의 장점은 비정형 데이터를 구문 분석할 수 있다는 것입니다. 상호 연결된 테이블 대신 평평한 개체를 저장합니다. 검색 엔진을 사용하면 데이터 읽기 및 쓰기 작업을 병렬화하여 성능을 향상시킬 수 있습니다.

관계형 데이터베이스에서는 정보가 잘 구성되어 있고 더 신뢰할 수 있습니다. 대조적으로, 검색 엔진에서는 정보의 위치와 내용이 지속적으로 변경될 수 있기 때문에 정보가 체계화되지 않고 안정적이지 않습니다.

검색 엔진은 구현하기 쉽고 빠릅니다. 그러나 데이터베이스와 달리 검색 엔진은 자주 업데이트되어야 합니다. 이들의 주요 목표는 고객의 요구에 신속하게 대응하는 고품질 검색 결과 세트를 제공하는 것입니다.

 

 

아키텍처 패턴을 확장

Primary/Replica 아키텍처

기본/복제 아키텍처는 많은 수의 읽기를 지원하는 데 사용됩니다. 여기에는 기본 서버의 데이터를 여러 복제본으로 복제하는 작업이 포함됩니다. 이 아키텍처를 사용하면 한 서버에서 데이터 복사본을 하나만 사용하는 경우보다 몇 배 더 많은 요청을 처리할 수 있습니다.

예를 들어, 세 대의 서버에서 세 개의 데이터 복사본을 사용하는 경우 한 대의 서버에서 하나의 복사본을 사용하는 경우보다 세 배나 많은 요청을 처리할 수 있습니다.

더 많은 쓰기 작업을 지원하려면 데이터를 여러 개의 작은 부분으로 분할하고 CPU를 추가하여 이러한 부분을 생성해야 합니다. 또한 읽기 및 쓰기를 확장하려면 샤드를 추가하고 여러 시스템에 여러 복사본을 보유해야 합니다.

여러 복제본에 걸쳐 마스터 서버의 데이터를 복제하는 주/복제 아키텍처를 구현하려면 각 샤드에 쓰기를 허용하는 하나의 버전이 있어야 합니다. 다른 복제본은 주 복제본을 진실의 원본으로 사용합니다. 주 샤드에 저장된 로그 파일은 종종 마스터 데이터와 복제본을 동기화하는 데 사용됩니다. 이 로그 파일에는 기본 샤드가 받은 모든 쓰기가 순차적으로 포함됩니다. 각 복제본 샤드는 이 로그의 쓰기를 읽고 로컬에 적용합니다.

이 접근 방식의 주요 단점은 색인화와 검색이 동일한 시스템에서 동시에 수행된다는 것입니다. 데이터 복사본을 여러 개 만들어야 하기 때문에 CPU와 메모리 인덱싱을 복제해야 합니다. 이로 인해 비용이 크게 증가합니다. 인덱싱 및 검색을 동시에 확장해야 하는 경우 복제 팩터가 증가하고 더 많은 데이터에 적용되므로 막대한 양의 추가 리소스가 필요합니다.

동일한 컴퓨터가 인덱싱 및 검색 쿼리를 모두 처리하는 경우 인덱싱에 대한 CPU 및 메모리 사용량이 증가하면 최종 사용자 환경에도 부정적인 영향을 미칠 수 있습니다. 최종 사용자가 생성한 검색 트래픽이 크게 증가하면 인덱싱에 사용되는 리소스가 이러한 트래픽 급증을 설명하는 기능을 제한할 수 있습니다.

또한 새 복제본을 추가하려면 기존 시스템에서 데이터를 가져와야 하고, 종종 몇 시간이 걸리고, 시스템에 추가적인 부하를 추가하기 때문에 이러한 접근 방식은 자동 확장 기능을 제한합니다. 따라서 아키텍처의 크기를 크게 늘려야 하고 데이터 또는 쿼리의 상당한 증가를 기대해야 합니다.

 

 

이진 데이터 구조의 복제

확장 가능한 검색 아키텍처를 만드는 또 다른 방법은 인덱싱 작업이 완료된 후 디스크에 커밋된 이진 데이터 구조를 복제하는 것입니다.

인덱싱에 사용되는 CPU 및 메모리가 중복되지 않습니다. 그러나 모든 데이터 구조를 덮어쓰는 동안 이진수가 커서 약간의 지연이 발생할 수 있습니다.

대부분의 경우 검색 아키텍처는 1분 미만의 속도로 대량의 인덱싱 및 검색 작업을 처리합니다. 따라서 대부분의 경우 이 방법은 사용되지 않습니다.

또한 검색 엔진은 세대 데이터 구조에 의존합니다. 즉, 하나의 이진 파일 대신 파일 집합이 있습니다. 세그먼트가 새 인덱싱 작업을 수신하면 디스크의 더 작은 데이터 구조에 저장됩니다. 새 인덱싱 작업은 파일의 일부가 특정 크기에 도달할 때까지 0세대에서 수행되며 1세대와 병합되어야 합니다. 중복 항목을 제거하고 검색 효율성을 최적화하려면 이 작업이 필요합니다. 이 접근 방식의 단점은 디스크의 모든 파일이 수정되고 각 복제본은 모든 데이터 샤드가 포함된 새 버전을 가져와야 한다는 것입니다.

데이터 병합 프로세스와 복제를 위한 데이터 전송은 다음과 같은 요인에 의해 영향을 받습니다:

샤드 크기는 모든 계층이 병합된 후 전송할 최대 데이터 양을 결정합니다.

이는 모든 세대의 병합 빈도(최대 데이터 크기를 전송해야 하는 횟수)에 직접적인 영향을 미칩니다.

 

 

아키텍처 기본 서비스를 검색

검색 아키텍처를 만들려면 크롤러, 웹 페이지 프로세서 및 인덱싱의 세 가지 서비스를 사용해야 합니다.

크롤러는 웹 페이지를 방문하여 웹 페이지에 있는 모든 링크를 가져오고 해당 링크를 따르는 데 사용되는 봇입니다. 이를 통해 검색 엔진은 지속적으로 새로운 콘텐츠를 찾을 수 있습니다.

웹 페이지 프로세서는 페이지 내용 및 메타데이터를 읽습니다. 그런 다음 웹 페이지의 내용을 주제, 키워드 등에 따라 다른 기준에 따라 그룹화할 수 있는 더 간단한 형식으로 분류해야 합니다. 메타데이터에는 키워드, 설명 등과 같은 유용한 정보가 포함되어 있습니다.

색인화는 빠르고 쉽게 읽을 수 있도록 찾은 정보를 구성하는 데 사용됩니다. 키워드 및 페이지 순위를 사용할 수 있습니다. 그러나 보다 효율적인 인덱싱을 위해서는 약간의 연구와 개발이 필요합니다.

 

 

Kubernetes를 사용하여 검색 서비스를 설정

Kubernetes는 검색 아키텍처를 만드는 데 필요한 모든 서비스에 사용할 수 있는 확장 가능한 Docker 컨테이너 플랫폼입니다. 이 기능을 사용하면 이를 위해 사용되는 하드웨어에 관계없이 작동하는 방식으로 서비스를 구성할 수 있습니다. 또한 필요에 따라 각 서비스를 개별적으로 확장할 수 있습니다.

Kubernetes를 사용하면 서비스를 생성하고 고유한 IP 주소를 할당할 수 있습니다. 이렇게 하면 서비스가 특별한 연결을 만들지 않고도 서로 통신할 수 있습니다. 또한 서비스의 보안을 보장합니다.

Kubernetes를 사용하면 다음과 같은 주요 이점이 있습니다:

자동화된 운영 : Kubernetes에서는 애플리케이션 관리와 관련된 많은 복잡한 작업이 내장된 명령에 의해 자동으로 수행됩니다.

인프라 추상화 : Kubernetes는 워크로드를 대신하여 계산, 네트워킹 및 스토리지를 처리합니다. 이를 통해 프로그래머는 기본 환경 설정에 대해 걱정하지 않고 애플리케이션 개발에 집중할 수 있습니다.

서비스 상태 모니터링 : Kubernetes는 서비스의 상태를 지속적으로 확인합니다. 충돌하거나 중지된 컨테이너를 다시 시작하고 사용자가 작업을 확인한 후에만 서비스를 사용할 수 있도록 합니다.

 

 

멤피스로 데이터 흐름을 제어

멤피스는 실시간 데이터 처리 플랫폼입니다. 스트리밍 데이터로 작업할 수 있으며 비동기화를 지원합니다. 많은 양의 데이터를 처리하고 많은 양의 복잡한 코드를 작성해야 하는 엔지니어에게 적합합니다.

멤피스 플랫폼은 고성능이며 내결함성이 뛰어납니다. 또한 모니터링 기능이 내장되어 있어 문제 해결에 매우 유용합니다.

멤피스를 사용하면 검색 아키텍처를 구축할 때 직면하는 대부분의 데이터 흐름 제어 문제를 해결할 수 있습니다. 그 중에는 다음이 포함됩니다:

 - 많은 수의 데이터 소스는 처리하기가 매우 어렵습니다.

- 각 소스에 대한 스트리밍 데이터 분석입니다.

- 릴레이, 실패 및 모니터링 부족으로 인해 메시지가 손실됩니다.

- 스트리밍 데이터 처리에는 여러 애플리케이션의 통합이 필요하므로 데이터 처리 프로세스가 크게 느려지고 실시간으로 데이터를 분석할 수 없습니다.

- 기존의 다른 데이터 처리 시스템을 배포, 관리, 보호, 업데이트, 통합 및 구성하는 데 어려움이 있습니다.

 

멤피스는 생산자-소비자 패턴을 사용하며 검색 아키텍처에서 사용하는 서비스에 대한 전체 데이터 흐름을 제어합니다. 멤피스의 주요 이점을 나열해 보겠습니다. 

- 팀 배포 : 모든 Kubernetes 및 Docker 환경에서 기본적으로 실행되며 처음부터 완전히 최적화됩니다.

- 복원력 : 코드 변경 없이 즉시 사용할 수 있는 데드레터 큐, 리소스 최적화 및 이벤트 복구 기능을 제공합니다.

- 사용 용이 : 멤피스는 데이터 엔지니어와 개발자가 실시간으로 데이터 문제를 해결하고 추적할 수 있는 간단하고 사용하기 쉬운 사용자 인터페이스를 갖추고 있습니다.

- 고유한 스키마 제어 : 멤피스는 내장된 스트리밍 데이터 변환을 통해 신뢰할 수 있고 사용하기 쉬운 고유한 스키마 제어 기능을 제공합니다.

 

 

엘라스틱서를 사용하여 검색 색인을 작성

엘라스틱검색은 검색 색인을 만들 수 있는 응용 프로그램입니다. 로그 분석, 전체 텍스트 검색, 지능형 보안 시스템, 비즈니스 인텔리전스, 진행 중인 프로세스 모니터링 등에 자주 사용됩니다.

API를 사용하거나 Logstash와 같은 다른 도구를 사용하여 Elastic 검색에 데이터를 JSON 문서로 보낼 수 있습니다. 그런 다음 Elasticsearch는 자동으로 문서를 저장하고 검색 가능성을 포함하여 클러스터된 색인에 연결을 추가합니다. 또한 Elastic 검색 API를 사용하여 문서를 찾고 검색할 수 있습니다.

탄력적 검색은 수평적으로 확장 가능한 검색을 제공하고 멀티스레딩을 지원합니다. 또한 여러 가지 검색 필드를 사용하여 레코드가 검색과 일치하는 가장 좋은 표시기 값의 우선 순위를 지정할 수 있습니다.

 

 

파일 복제 속도

클라우드 인프라의 발전과 증가된 처리량을 통해 인덱싱 지연 시간에 부정적인 영향을 미치지 않으면서 인덱싱과 검색 사이의 격리를 개선할 수 있습니다. 이를 통해 보다 효율적이고 동적인 확장이 가능해졌습니다.

확장 가능한 아키텍처가 어떻게 작동하는지 살펴보겠습니다.

- 인덱싱 가상 시스템은 파일의 로컬 복사본을 유지합니다. 장애가 발생하면 새 시스템이 시작되어 클라우드 저장소에서 파일을 다운로드합니다.

- 인덱싱 프로세스 중에 새 파일이 메모리에서 계산됩니다.

- 클라우드 스토리지에 업로드할 때 큰 파일은 여러 개의 작은 세그먼트로 분할되어 병렬로 업로드됩니다.

- 또한 파일은 인덱싱 가상 시스템의 디스크에 로컬로 저장됩니다.

- 데이터를 전송한 후 검색 가상 시스템은 모든 파일을 다운로드합니다(클라우드를 다운로드하는 경우와 마찬가지로 파일을 세그먼트로 분할하여 병렬로 다운로드함).

- 검색에서는 새 버전의 데이터를 사용합니다.

 

이 검색 아키텍처에는 장점 목록이 있습니다.

 - 병렬 로드로 데이터 병합 속도를 높입니다.

- 세그먼트 크기와 인덱싱을 거의 실시간으로 줄일 수 있습니다.

- 검색 작업과 인덱스 작업은 별도의 가상 시스템을 사용하기 때문에 독립적으로 확장됩니다.

- 가상 시스템을 빠르게 추가/제거합니다.

- 길고 비용이 많이 드는 데이터 재조정 없이 추가 리소스를 추가/제거합니다.

- 인덱싱을 일시 중지하지 않고 비동기 프로세스를 사용하여 단일 인덱스에 대한 샤드(파일 부분) 수 변경과 같은 새로운 유형의 기능을 사용할 수 있습니다.

 

 

마무리

현대적이고 확장 가능한 검색 아키텍처의 작동 방식과 장점과 단점을 파악했습니다. 또한 검색 아키텍처가 어떤 주요 서비스로 구성되어 있으며 어떤 용도로 사용되는지도 설명했습니다. 또한 이 문서에는 확장 가능한 검색 아키텍처를 개발할 때 사용할 수 있는 유용한 도구에 대한 설명이 포함되어 있습니다.

습득한 지식을 활용하고 프로젝트를 위한 효율적이고 확장 가능한 검색 아키텍처를 설계합니다.

반응형