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
'program story' 카테고리의 다른 글
| Dapper를 사용하여 예상보다 오래 걸리는 대량 삽입 (0) | 2020.11.25 |
|---|---|
| Webapi에 ViewModel을 포함하는 것이 합리적입니까? (0) | 2020.11.25 |
| LTS (장기 지원)와 Node.js의 안정적인 버전의 차이점은 무엇입니까? (0) | 2020.11.25 |
| C ++ HTML 템플릿 프레임 워크, 템플릿 라이브러리, HTML 생성기 라이브러리 (0) | 2020.11.25 |
| TypeError : unhashable type : 'dict', dict가 다른 dict의 키로 사용될 때 (0) | 2020.11.25 |