Как исправить прочтение в Elicsearch
Я использовал Elasticsearch-1.1.0 для индексации твитов.
Процесс индексации в порядке.
Затем я обновил версию. Теперь я использую Elasticsearch-1.3.2, и я получаю это сообщение случайным образом:
Exception happened: Error raised when there was an exception while talking to ES.
ConnectionError(HTTPConnectionPool(host='127.0.0.1', port=8001): Read timed out. (read timeout=10)) caused by: ReadTimeoutError(HTTPConnectionPool(host='127.0.0.1', port=8001): Read timed out. (read timeout=10)).
Снимок случайности:
Happened --33s-- Happened --27s-- Happened --22s-- Happened --10s-- Happened --39s-- Happened --25s-- Happened --36s-- Happened --38s-- Happened --19s-- Happened --09s-- Happened --33s-- Happened --16s-- Happened
--XXs-- = after XX seconds
Может ли кто-нибудь указать, как исправить проблему Read timed out
?
Большое спасибо.
Ответы
Ответ 1
Сложно дать прямой ответ, так как ошибка вашего видения может быть связана с клиентом, который вы используете. Однако решение может быть одним из следующих:
1.Включить тайм-аут по умолчанию глобально при создании ES-клиента путем передачи параметра таймаута. Пример в Python
es = Elasticsearch(timeout=30)
2. Установите тайм-аут на запрос, сделанный клиентом. Взято из документов Elasticearch Python ниже.
# only wait for 1 second, regardless of the client default
es.cluster.health(wait_for_status='yellow', request_timeout=1)
Вышеупомянутое даст кластеру дополнительное время для ответа
Ответ 2
Попробуйте следующее:
es = Elasticsearch(timeout=30, max_retries=10, retry_on_timeout=True)
Это может не полностью избежать ReadTimeoutError
, но это минимизирует их.
Ответ 3
Для чего это стоит, я обнаружил, что это, похоже, связано со сломанным состоянием индекса.
Очень сложно надежно воссоздать эту проблему, но я видел ее несколько раз; операции выполняются как обычно, за исключением определенных, которые периодически кажутся зависающими ES (в частности, обновление индекса кажется).
Удаление индекса (curl -XDELETE http://localhost:9200/foo
) и переиндексация с нуля исправили это для меня.
Я рекомендую периодически очищать и переиндексировать, если вы видите это поведение.
Ответ 4
Тайм-аут чтения может также произойти, если размер запроса велик. Например, в моем случае довольно большого размера индекса ES (> 3M документов) выполнение поиска по запросу из 30 слов занимало около 2 секунд, в то время как поиск по запросу из 400 слов занимал более 18 секунд. Так что для достаточно большого запроса даже timeout=30
не спасет вас. Простое решение - обрезать запрос до размера, на который можно ответить ниже тайм-аута.
Ответ 5
Увеличение различных параметров тайм-аута может немедленно решить проблемы, но не устраняет основную причину.
Если служба ElasticSearch доступна и индексы исправны, попробуйте увеличить минимальный и максимальный размеры кучи Java: см. Https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html.
TL; DR Edit/etc/elasticsearch/jvm.options -Xms1g
и -Xmx1g
Ответ 6
Вы также должны проверить, все ли хорошо с резинкой. Некоторый осколок может быть недоступен, вот хороший документ о возможных причинах недоступного осколка https://www.datadoghq.com/blog/elasticsearch-unassigned-shards/