2013-12-12 7 views
0

나는 사용자 레코드를 만들고 관리하는 서비스를 작성 중입니다. 그들 중 100 만 이상. 각 새 사용자에 대해 서비스는 고유 한 사용자 ID를 생성하여 데이터베이스에 기록합니다. 데이터베이스는 생성 된 고유 한 사용자 ID를 기반으로 분할됩니다.Elasticsearch에 대한 쿼리

각 사용자 레코드에는 여러 필드가 있습니다. 이제 요구 사항 중 하나는 서비스가 일치하는 필드 값을 가진 사용자가 있는지 검색 할 수 있다는 것입니다. 따라서 해당 필드는 데이터베이스 스키마에서 인덱스로 선언됩니다.

그러나 데이터베이스는 기본 키 (고유 사용자 ID)를 기반으로 분할됩니다. 특정 열과 일치하는 사용자 레코드를 찾으려면 모든 샤드를 검색해야합니다.

그래서 빨리 검색 할 수 있습니다. 한 가지 생각은 ElasticSearch 클러스터를 설정하는 것입니다. 서비스는 새 사용자 레코드를 생성 할 때마다 ES 클러스터에 기록합니다. ES 클러스터는 관련 필드를 기반으로 사용자 레코드를 인덱싱합니다.

내 질문과 답변 : 여기에 ES에서 어떤 종류의 성능을 기대할 수 있습니까? 나는 각 사용자 레코드의 5 열을 인덱싱해야하는 100 + 백만 개의 사용자 레코드가 있다고 가정합니다. 하드웨어 구성에 따라 다르다는 것도 알고 있습니다. 그러나 잘 조정 된 하드웨어를 가정하십시오.

- 여기서 여러 키를 제공하는 memcache 대안으로 ES를 사용하려고합니다. 그래서 모든 데이터 집합을 메모리에 저장하고 내구성이 있어야 할 필요는 없습니다. ES 올바른 도구가 그것을 할 수 있습니까?

대용량 데이터 세트에 대한 ElasticSearch 경험에 기반한 모든 의견/권장 사항에 매우 만족합니다.

+1

나는 이것을 위해 ES를 사용할 수 있다고 생각한다. 100M 레코드는 ES에서 정상적인 숫자입니다. 내 데이터는 색인 된 8 개의 열이있는 약 80M 레코드이며 제대로 작동합니다. ES에서는 모든 것이 인덱싱되며 더 빠른 검색을 위해 메모리에로드됩니다. 나는 당신이 elasticsearch.org에서 문서/프리젠 테이션을 읽고 지역 사회에 참여하여 구현 방법에 대해 자세히 연구 할 것을 제안합니다. –

+0

Hello Duc, 모든 데이터가 메모리에 있습니까? 어떤 종류의 읽기 성능을 얻습니까? 또한 ES를 사용하는 이유는 무엇입니까? – snegi

+0

귀하의 질의, 귀하의 목적에 따라 다릅니다. 퍼포먼스에 초점을 맞추기 때문에 메모리에 캐쉬를 남기고 주로 데이터 검색에 주로 사용합니다. –

답변

1

ES는 메모리에서 완전히 실행되도록 명시 적으로 설계되지 않았습니다. 일반적으로 Java 응용 프로그램에서 많은 양의 무제한 데이터 세트를 사용하고 싶지는 않습니다 (오프 힙 메모리를 사용할 수도 있지만). 오히려, 그것은 할 수있는 것을 캐시 할 것이고 나머지는 OS의 디스크 캐시에 의존 할 것입니다.

단일 컴퓨터에서도 100 만 건의 레코드가 전혀 문제되지 않아야합니다. 저는 단일 기계에서 디스크에 65Gb의 데이터를 포함하는 약 100 개의 작은 필드 (대형 텍스트 필드 없음)로 구성된 1500 만 레코드로 구성된 인덱스를 실행합니다. id/score 만 반환하는 복잡한 쿼리는 500ms 미만으로 실행되며 문서를로드해야하는 쿼리는 단일 SSD에 대해 워밍업 된 vm에서 1-1.5 초 내에 반환됩니다. 저는 JVM 12-16GB 메모리를 더 많이 사용하는 경향이 있습니다. 거대한 단일 VM보다 클러스터를 통해 확장하는 것이 더 좋습니다.

+0

안녕하세요, Bruce, 답장을 보내 주셔서 감사합니다. 실제로 500ms는 큰 값으로 들립니다. ES가 내 데이터를 어떻게 파쇄하는지 제어 할 수 있습니까? 사실 나는 ES가 색인을 유지하는 방법에 대한 몇 가지 기술 문서를 찾으려고했지만 couldnt 하나를 찾을 수 있습니다. 이상적으로 디스크 IO, 스와핑 등을 필요로하는 메모리 외부에 데이터가있는 것을 좋아하지 않습니다. ES를 다중 키 값 Memcache로 사용하려고합니다. – snegi

+0

500ms가 큽니다. 그러나 쿼리가 너무 크고 복잡합니다. 간단한 쿼리가 더 빠르며 일반 GET 유형 요청은 매우 빠릅니다. 사용 가능한 메모리가 있으면 메모리 저장소를 사용할 수 있습니다 (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index). -modules-store.html # file-system) –

관련 문제