Тайм-аут соединения с 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).
Ответы
Ответ 1
По умолчанию значение тайм-аута устанавливается равным 10 секундам. Если вы хотите изменить значение глобального тайм-аута, это может быть достигнуто установкой флага timeout = your-time при создании объекта.
Если вы уже создали объект без указания значения тайм-аута, вы можете установить значение тайм-аута для конкретного запроса, используя request_timeout = ваш-время флаг в запросе.
es.search(index="my_index",
doc_type="document",
body=get_req_body(),
request_timeout=30)
Ответ 2
Проблема с задержкой соединения может возникнуть, если вы используете услугу Amazon Elastic Search.
es = Elasticsearch ([{host ':' xxxxxx.us-east-1.es.amazonaws.com ',' port ': 443,' use_ssl ': True}])
Вышеупомянутый код python, в котором вы переопределяете порт по умолчанию от 9200 до 443 и устанавливаете ssl в true, разрешит проблему.
Если порт не указан, он пытается подключиться к pprt 9200 в указанном узле и не работает после истечения времени
Ответ 3
Это не связано с увеличением тайм-аута до 30 секунд.
Действительно ли люди думают, что для поиска эластичного поиска потребуется до 30 секунд, чтобы вернуть один маленький удар?
Как я исправил эту проблему, перейдите в config/elasticsearch.yml
раскомментируйте следующие
http.port: 9200
network.host: 'localhost'
Network.host может быть установлен в 192.168.0.1, который может работать. Но я просто изменил его на "localhost"
Ответ 4
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)
Ответ 5
моя личная проблема была решена с помощью (timeout = 10000)
который практически не был достигнут, поскольку записи на сервере были только 7.000, но у него был большой трафик, и его ресурсы были забиты, и именно поэтому соединение снижалось
Ответ 6
Обратите внимание, что одной из распространенных причин тайм-аутов при выполнении es.search
(или es.index
) является большой размер запроса. Например, в моем случае довольно большого размера индекса ES (> 3M документов) выполнение поиска по запросу из 30 слов занимало около 2 секунд, в то время как поиск по запросу из 400 слов занимал более 18 секунд. Так что для достаточно большого запроса даже тайм-аут не спасет вас. Простое решение - обрезать запрос до размера, на который можно ответить ниже тайм-аута.
Увеличение таймаута или повторная попытка тайм-аута помогут вам, если причина была в трафике, иначе это может быть вашим виновником.