2013-10-08 2 views
2

나는 Elasticsearch에 이벤트 로깅 메시지를 저장하기 위해 최적화 된 아키텍처를 고안하려고합니다. 여기로깅을위한 탄성 검색 - 아키텍처 조언 필요

내 사양/요구 사항은 다음과 같습니다

  • 메시지는 읽기 전용입니다; 일단 입력되면보고를 위해서만 질의됩니다.
  • 자유 텍스트 검색이 없습니다. 사용자는보고 용 필터 만 사용합니다.
  • timestamp 범위 쿼리를 수행 할 수 있어야합니다.
  • 주로 (다른 필드 이외에) agentcustomer 상호 작용으로 필터링해야합니다.
  • customersagents은 동일한 location에 속합니다.

은 그래서 가장 자주 실행되는 쿼리가 될 것입니다 : 모든 LogItemclient_id, customer_idtimestamp 범위를 제공받을. 내 데이터를 색인 도움이 필요

"_source": { 
    "agent_id" : 14, 
    "location_id" : 2, 
    "customer_id" : 5289, 
    "timestamp" : 1320366520000, //Java Long millis since epoch 
    "event_type" : 7, 
    "screen_id" : 12 
} 

: 여기

는 같은 LogItem 보이는 것입니다.

저는 좋은 색인 생성 아키텍처에 대한 아이디어를 얻으려고 what is an elasticsearch index?using elasticsearch to serve events for customers을 읽었지만 전문가들의 도움이 필요합니다.

그래서 여기 내 질문이 있습니다 :

  1. 기사는 "하루에 한 인덱스를"만드는 것이 좋습니다. 해당 아키텍처로 어떻게 범위 쿼리를 수행합니까? (예 : 인덱스 범위에서 쿼리 할 수 ​​있습니까?)

  2. 현재 큰 인덱스를 사용하고 있습니다. location_id 하나당 하나의 색인을 만들면 내 기록을 추가로 조직하기 위해 어떻게 조각을 사용합니까?

  3. 위의 사양이 주어진다면 은 더 나은 아키텍처를 제안 할 수 있습니까?

  4. 어떤 분야 나에와 대 쿼리를 필터링 해야합니까?

편집는 :

{ 
    "query" : { 
    "bool" : { 
     "must" : [ { 
     "term" : { 
      "agent_id" : 6 
     } 
     }, { 
     "range" : { 
      "timestamp" : { 
      "from" : 1380610800000, 
      "to" : 1381301940000, 
      "include_lower" : true, 
      "include_upper" : true 
      } 
     } 
     }, { 
     "terms" : { 
      "event_type" : [ 4, 7, 11 ] 
     } 
     } ] 
    } 
    }, 
    "filter" : { 
    "term" : { 
     "customer_id" : 56241 
    } 
    } 
} 

답변

2

당신은 확실히 여러 인덱스를 검색 할 수 있습니다 : 여기에 내 응용 프로그램에서 실행 샘플 쿼리입니다. 예를 들어 와일드 카드 또는 쉼표로 구분 된 인덱스 목록을 사용할 수 있지만 인덱스 이름은 날짜가 아니라 문자열임을 명심하십시오.

파편은 데이터를 구성하는 것이 아니라 배포하고 확장하는 것입니다. 당신이하는 일은 당신의 데이터와 당신이하는 일에 의해 주도됩니다. 이 대화를 한번보세요 : http://vimeo.com/44716955.

필터 VS 쿼리에 관한 질문에 대해서는 this 다른 질문을보십시오.

+0

답변 해 주셔서 감사합니다. 나는 색인에 관한 당신의 요점을 이해한다. 그래서 나는 다시 생각할 것이다. 내 질문에 대한 로깅에 대한 기사에서 "물론 각 이벤트는 예를 들어 필요에 따라 이벤트 유형을 샤딩하여 추가로 나눌 수 있습니다." 그런 것을 명시 적으로 정의 할 수 있습니까? 또한, 내 메시지는 한 번만 색인 생성되므로, 내가 할 수있는 최적화의 형식이 있습니까? 고맙습니다. – Churro

+1

라우팅을 사용하여 원하는 경우 수동으로 문서를 분할 할 수 있습니다. 그런 다음 동일한 경로 값을 가진 문서를 항상 동일한 샤드에 보내야합니다 (그러나 다른 값은 동일한 샤드에서 끝날 수 있습니다). 어쨌든 고급 기능을 라우팅하는 것이 좋을 것입니다. 이 강연을보십시오 : http://vimeo.com/44716955. – javanna

+0

나는 Elasticsearch 게시물에 대한 귀하의 답변을 읽고 있었으며 매우 유익합니다. 나는 당신의 비디오를보고 더 많은 연구를했고 다음과 같은 아키텍처를 생각해 냈습니다. '고객'과 '에이전트'가 같은 '위치'에 속해 있기 때문에 '위치'별로 색인을 만들 것입니다. 나는'에이전트'당 라우팅 설정을 고려하고 있었다. 'Locations'는 일반적으로 252 개가있는 에이전트를 제외하고 ~ 30 개의 에이전트가 있습니다. 그 외에도 인덱스 당 5 개의 샤드, 1 개의 복제본을 사용합니다. 이 구조에 대한 귀하의 의견에 감사드립니다. – Churro

1

logstash (및 kibana)를 잘 살펴보십시오. 그들은 모두이 문제를 해결하는 것입니다. 자신의 아키텍처를 롤업하기로 결정했다면 디자인 중 일부를 복사 할 수 있습니다.