Elasticsearch를 사용한 연결 시간 초과


84
from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()

doc = {
    'author': 'kimchy',
    'text': 'Elasticsearch: cool. bonsai cool.',
    'timestamp': datetime(2010, 10, 10, 10, 10, 10)
}
res = es.index(index="test-index", doc_type='tweet', id=1, body=doc)
print(res['created'])

이 단순한 코드는 다음 오류를 반환합니다.

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))

서버가 준비되고 설정 되었기 때문에 매우 이상합니다 ( http : // localhost : 9200 / 는 일부 json을 반환합니다).

답변:


91

기본적으로 시간 초과 값은 10 초로 설정됩니다. 전역 시간 제한 값을 변경 하려면 개체를 만드는 동안 timeout = your-time 플래그를 설정하여 수행 할 수 있습니다 .

타임 아웃 값을 지정하지 않고 이미 객체를 생성 한 경우 쿼리에서 request_timeout = your-time 플래그를 사용하여 특정 요청에 대한 타임 아웃 값을 설정할 수 있습니다.

es.search(index="my_index",
          doc_type="document",
          body=get_req_body(),
          request_timeout=30)

60으로 설정할 수 있습니까? 설정 한 후에도 시간 초과가 발생합니다.
Kishan Mehta

@Kishan 문서의 몸이 얼마나 큽니까?
Rohit Patwa

안녕하세요, @RohitPatwa 내 문제는 문서 길이를 줄여서 해결되었습니다. 지금 몸이 얼마나 컸는 지 기억 나지 않습니다. :) 도움을 주셔서 감사합니다
키산 메타

상사가 타임 아웃 변경을 허용하지 않고 단일 레코드에서 실패하면 어떻게됩니까?
Jonathan Rys

18

Amazon Elastic Search 서비스를 사용하는 경우 연결 시간 초과 문제가 발생할 수 있습니다.

es = Elasticsearch([{'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 443,  'use_ssl': True}])

9200에서 443으로 기본 포트를 재정의하고 SSL을 true로 설정하는 위의 Python 코드는 문제를 해결합니다.

포트가 지정되지 않은 경우 지정된 호스트의 포트 9200에 연결을 시도하고 시간 초과 후 실패합니다.


또는 포트 80을 사용할 수 있습니다. es = Elasticsearch ([{ 'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 80}])
Olga Akhmetova

6

이것은 시간 제한을 30 초로 늘리는 것과 관련이 없습니다. 사람들은 실제로 탄력적 검색이 작은 히트 하나를 반환하는 데 최대 30 초가 필요하다고 생각합니까?

이 문제를 해결 한 방법은 config / elasticsearch.yml 로 이동 하여 다음 주석을 제거하는 것입니다.

http.port: 9200
network.host: 'localhost' 

Network.host는 192.168.0.1로 설정되어 작동 할 수 있지만 방금 'localhost'로 변경했습니다.


17
서버가 너무 바쁘다면 한 번의 작은 히트로이 오류가 발생할 수 있습니다.
ᐅ devrimbaris apr.

또는 DNS 확인에 문제가있는 경우 시간 초과에 대한 많은 이유가 있습니다
Ethranes

4

수행 es.search(또는 es.index) 할 때 시간 초과의 일반적인 이유 중 하나 는 큰 쿼리 크기입니다. 예를 들어, 상당히 큰 ES 인덱스 크기 (> 3M 문서)의 경우 30 개 단어가 포함 된 쿼리를 검색하는 데 약 2 초가 걸리고 400 단어가 포함 된 쿼리를 검색하는 데 18 초 이상이 걸렸습니다. 따라서 충분히 큰 쿼리의 경우 timeout = 30으로도 저장되지 않습니다. 쉬운 해결책은 시간 제한 아래에 응답 할 수있는 크기로 쿼리를 자르는 것입니다.

시간 초과를 늘리거나 시간 초과시 재 시도하면 원인이 트래픽에있는 경우 도움이되고 그렇지 않으면 이것이 원인 일 수 있습니다.


3

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) 요청이 지정된 시간에 종료되지 않았 음을 의미합니다 (기본적으로 timeout = 10).

30 초 동안 작동합니다.

res = es.index(index="test-index", doc_type='tweet', id=1, body=doc, timeout=30)


2

Elasticsearch 초기화에서 시간 제한을 설정해보십시오.

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30)

당신은 설정할 수 있습니다 retry_on_timeoutTrue와 줄 max_retries옵션 수를 :

es = Elasticsearch([{'host': HOST_ADDRESS, 'port': THE_PORT}], timeout=30, max_retries=10, retry_on_timeout=True)

1

내 개인적인 문제는 (timeout = 10000)서버의 항목이 7.000에 불과했지만 트래픽이 많고 리소스가 많이 소모되어 거의 도달하지 못했던 문제가 해결되었습니다.


1

시간 초과의 이유는 많을 수 있으며 elasticsearch 측 ( logs/elasticsearch.log) 의 로그 를 확인하여 자세한 오류를 확인하는 것이 좋습니다. 우리의 경우 ES의 오류는 다음과 같습니다.

primary shard is not active Timeout: [1m]

게시물 에서 설명한 것처럼 디스크가 꽉 찼기 때문입니다. 이를 처리하기 위해 하루 전에 크기 (및 파티션)의 크기를 조정했지만 고 / 저 워터 마크가 한 번 히트 한 경우 (5.5.x에 있음) ES를 다시 시작해야합니다.

프로덕션에서 ES를 다시 시작하는 것만으로도 문제가 해결되었습니다.


0

도움이되는 두 가지 옵션 :

1 : 시간 초과 늘리기

시간 제한을 설정하면이 문제가 해결되었습니다. 최신 버전에는 단위가 필요합니다. 예 timeout="60s":

es.index(index=index_name, doc_type="domains", id=domain.id, body=body, timeout="60s")

단위없이 설정하여 예를 들어 timeout=60, 당신은 얻을 것이다

elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'failed to parse setting [timeout] with value [60] as a time value: unit is missing or unrecognized')

2 : 텍스트 길이 줄이기

또한 텍스트 길이를 줄이는 데 도움이됩니다. 예를 들어 긴 텍스트를 잘라서 Elastic은 텍스트를 더 빨리 저장하여 시간 초과를 방지 할 수 있습니다.

es.index(index=index_name, doc_type="domains", id=domain.id, body=text[:5000], timeout="60s")

오류가 계속 존재하는 한이 10 시간 제한 값을 알리는 작동하지 않습니다
알렉스 졸릭
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.