2012-10-04 5 views
96

이 질문은 실험 및 구현에 대한 세부 사항을 파고 들기 전에 아키텍처를 선택하는 것에 관한 것입니다. 그것은 elasticsearch v.s의 적합성, 확장 성 및 성능 측면에 관한 것입니다. 다소 특정한 목적을 위해 MongoDB.elasticsearch v.s. 필터링 응용 프로그램 용 MongoDB

필드와 값이있는 데이터 개체를 가설 적으로 저장하고 해당 개체 본문을 쿼리 할 수 ​​있습니다. 따라서 임의로 선택된 필드에 따라 객체의 하위 집합을 필터링하면 아마도 둘 다 적합합니다.

내 응용 프로그램은 기준에 따라 개체를 선택합니다. 그것은 하나 이상의 필드로 동시에 필터링하고 다른 방식으로 개체를 선택합니다. 쿼리 필터링 기준은 일반적으로 1 ~ 5 개 필드를 포함하며 경우에 따라 더 많을 수 있습니다. 반면에 필터로 선택된 필드는 훨씬 더 많은 필드의 부분 집합이됩니다. 이미 약 20 개의 필드 이름이 있으며, 각 쿼리는 전체 20 개의 필드 중 일부 필드로 개체를 필터링하려고 시도합니다 (전체 필드 이름이 20 개 미만이거나 20 개 이상일 수 있음). 필드를 모든 이산 쿼리에서 필터로 사용되는 필드로 변환). 필터링은 필드 값뿐만 아니라 선택된 필드의 존재에 의해 이루어질 수있다. 필드 A가있는 오브젝트를 필터링하고 필드 B는 x와 y 사이에 있고 필드 C는 w와 같습니다.

내 응용 프로그램에서는 이러한 종류의 필터링을 지속적으로 수행하는 반면, 어떤 필드가 언제든지 필터링에 사용된다는 측면에서 아무런 상수가 없거나 거의 없을 것입니다. 아마도 elasticsearch 인덱스를 정의 할 필요가 있을지 모르지만, 인덱스가 없어도 MongoDB의 속도와 비슷한 수준 일 수 있습니다.

데이터가 저장소에 들어갈 때마다 개체에 대한 특별한 세부 정보는 없습니다. 삽입 된 개체는 거의 변경되지 않습니다. 아마도 오래된 객체를 삭제해야 할 것입니다. 두 데이터 저장소 지원이 내부적으로 또는 응용 프로그램에서 작성한 쿼리로 데이터 삭제를 만료한다고 가정하고 싶습니다. (빈번하지 않게 특정 쿼리에 적합한 객체도 삭제해야합니다.)

당신은 어떻게 생각하십니까? 그리고이 부분을 실험 해 보셨습니까?

저는이 두 가지 데이터 저장소 각각의 성능과 확장성에 관심이 있습니다. 이것은 건축 학적 문제의 일종이며, 상점 별 옵션이나 쿼리 스톤 스톤에 대한 세부 사항은 잘 설계된 것으로 만들어야합니다. 완전히 고려한 제안을 시연하는 것으로 환영합니다.

감사합니다.

+0

나는 이것이 투표를 계속하는 이유에 대해 잘 모르겠다. 오랜 시간이 지난 후에 그러한 저명한 옵션입니까? – matanster

답변

245

먼저 여기에 중요한 차이점이 있습니다. MongoDB는 범용 데이터베이스이고 Elasticsearch는 Lucene이 지원하는 분산 텍스트 검색 엔진입니다. 사람들은 Elasticsearch를 범용 데이터베이스로 사용하는 것에 대해 이야기 해 왔지만 그것이 원래의 디자인이 아니라는 것을 알고 있습니다. 일반적인 용도의 NoSQL 데이터베이스와 검색 엔진은 통합을 지향하지만 두 개의 다른 캠프에서 온 것으로 보입니다.

우리 회사에서 MongoDB와 Elasticsearch를 사용하고 있습니다. 우리는 우리의 데이터를 MongoDB에 저장하고 Elasticsearch를 독점적으로 '전체 텍스트 검색 기능'으로 사용합니다. 우리는 신빙성있게 질의 할 필요가있는 mongo 데이터 필드의 서브 세트만을 보냅니다. 우리의 유스 케이스는 Mongo 데이터가 항상 변경된다는 점에서 당신과 다릅니다 : 레코드 또는 레코드 필드의 서브 세트는 하루에 여러 번 업데이트 될 수 있으며, 이는 해당 레코드를 다시 인덱싱하여 신축성있게 호출 할 수 있습니다. 그 이유만으로도 유일한 데이터 저장소로 elastic을 사용하는 것은 좋은 선택이 아닙니다. 선택 필드를 업데이트 할 수 없기 때문입니다. 우리는 문서 전체를 다시 색인화해야 할 것입니다. 이것은 탄력적 인 제한이 아니며 Lucene이 작동하는 방식으로 탄력적 인 기본 검색 엔진입니다.귀하의 경우, 일단 저장된 기록이 변경되지 않는다는 사실은 귀하가 그러한 선택을하지 않아도된다는 것을 방지합니다. 데이터 안전성이 중요하다면 Elasticsearch를 데이터의 유일한 저장 메커니즘으로 두 번 생각할 것입니다. 그것은 어느 시점에 거기에 도착할지도 모르지만 나는 아직 거기에 있는지 확신하지 못한다.

속도면에서 Mongo의 쿼리 속도와 동등한 Elastic/Lucene이있을뿐만 아니라 "어느 순간에 필터링을 위해 어떤 필드가 사용되는지에 대한 상수는 거의 없습니다"라는 경우에는 특히 데이터 세트가 커짐에 따라 훨씬 더 빠르게 진행될 수 있습니다. 차이점은 기본 쿼리 구현에있다 :

  • 탄성/루씬 쿼리에 대해 기록 유사성을 비교하는 매우 효율적인 방법이다 Information Retrieval에 대한 Vector Space Modelinverted indexes을 사용합니다. Elastic/Lucene을 쿼리하면 이미 답변을 알고 있습니다. 대부분의 작업은 쿼리 용어와 일치 할 가능성이 가장 높은 결과로 순위를 매기는 데 있습니다. 이것은 중요한 포인트입니다. 데이터베이스와 달리 검색 엔진은 정확한 결과를 보장 할 수 없습니다. 그들은 당신의 질문에 얼마나 근접하는지에 따라 결과의 순위를 매긴다. 대부분의 경우 결과가 정확합니다.
  • Mongo의 접근 방식은 좀 더 일반적인 용도의 데이터 저장소입니다. JSON 문서를 서로 비교합니다. 꼭 훌륭한 성능을 얻을 수는 있지만 실행하려는 쿼리와 일치하도록 신중하게 인덱스를 작성해야합니다. 특히 조회 할 필드가 여러 개인 경우 compound keys을 신중하게 작성하여 가능한 빨리 조회 할 데이터 세트를 줄여야합니다. 예 : 첫 번째 키는 데이터 집합의 대부분을 필터링해야하고 두 번째 키는 왼쪽과 같이 계속 필터링해야합니다. 쿼리가 정의 된 인덱스의 키와 키 순서와 일치하지 않으면 성능이 상당히 떨어집니다. 반면에 Mongo는 진정한 데이터베이스이므로 정확성이 무엇이 필요한지 파악하면 답변을 얻을 수 있습니다.

오래된 레코드 만료시 Elastic에는 TTL 기능이 내장되어 있습니다. Mongo는 방금 생각한 2.2 버전을 소개했습니다.

예상되는 데이터 크기, 트랜잭션, 정확도 또는 필터의 모양과 같은 다른 요구 사항을 알지 못하므로 구체적인 권장 사항을 작성하기가 어렵습니다. 다행히도, 여기 시작하기에 충분합니다.

+47

이 사이트의 아키텍처 주제에서 기대할 수있는 가장 높은 수준의 응답 일 가능성이 높습니다. 박식하고, 분석적이며, 분명하고, 진실되게 참여하고있는 것에 대해 감사드립니다. – matanster

+6

정확도와 관련하여 필드를 토큰 화하고 분석하는 방법을 선택하여 Elastic/Lucene을 사용하여 정확성을 제어 할 수 있습니다. 필드가 분석되지 않으면 (즉, 공간으로 분리 된 용어로 분리 된 경우) 검색 엔진이 그대로 필드를 처리 할 수 ​​있습니다. 그런 다음 검색어 (http://www.elasticsearch.org/guide/reference/query-dsl/term-query.html)를 사용하여 검색어를 검색하면 일치 검색 결과 만 표시되도록 할 수 있습니다. 이 접근법은 일반 DB가 정확히 일치하는 방식과 유사합니다. – gstathis

+1

감사합니다. 여기서는 실적을 저하시키지 않고 결과가 한 필드에 의해 정렬 된 순서로 반환되는지 여부를 살펴 보겠습니다. 또한 결과가 다소 선형으로 스트리밍되는지 또는 하나의 청크로만 전달되는지 여부도 확인합니다. 큰 놀라움이 있다면 여기에 올리겠습니다. 다시 한번 감사드립니다! – matanster