program story

Elasticsearch를 사용한 연결 시간 초과

inputbox 2020. 11. 25. 07:56
반응형

Elasticsearch를 사용한 연결 시간 초과


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을 반환 함).


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

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

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

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

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

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

포트를 지정하지 않으면 지정된 호스트의 pprt 9200에 연결을 시도하고 시간 초과 후 실패합니다.


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

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

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

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


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)


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


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

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

참고 URL : https://stackoverflow.com/questions/28287261/connection-timeout-with-elasticsearch

반응형