Час очікування з’єднання з Elasticsearch


85
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).

Відповіді:


92

За замовчуванням значення тайм-ауту встановлено 10 секунд. Якщо потрібно змінити глобальне значення часу очікування, цього можна досягти, встановивши прапор timeout = your-time під час створення об’єкта.

Якщо ви вже створили об'єкт, не вказавши значення тайм-ауту, тоді ви можете встановити значення тайм-ауту для конкретного запиту, використовуючи прапор request_timeout = ваш час у запиті.

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

Чи можна встановити значення 60? я отримую тайм-аут навіть після встановлення його 30
Кішан Мехта

@Kishan, наскільки велике ваше тіло документа?
Рохіт Патва,

Привіт, @RohitPatwa моя проблема була вирішена зменшенням довжини документа. Я не пам’ятаю, наскільки великим було тіло зараз. Дякуємо за допомогу :)
Кішан Мехта

Що робити, якщо мій начальник не дозволить мені змінити тайм-аут, і це не вдається на одному записі?
Джонатан Рис,

18

Проблема з тайм-аутом підключення може виникнути, якщо ви використовуєте послугу Amazon Elastic Search.

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

Вищезазначений код python, де ви перевизначаєте порт за замовчуванням з 9200 на 443, і встановивши для SSL значення true, вирішить проблему.

Якщо не вказано жодного порту, він намагається підключитися до порту 9200 у вказаному хості і не працює після закінчення часу очікування


Або ви можете використовувати порт 80 es = Elasticsearch ([{'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 80}])
Ольга Ахметова

6

Це нічого спільного зі збільшенням часу очікування до 30 секунд. Чи насправді люди думають, що для того, щоб повернути один крихітний удар, потрібно знадобитися до 30 секунд?

Я вирішив цю проблему, перейшовши до config / elasticsearch.yml, прокоментувавши наступне

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

Network.host може бути встановлений на 192.168.0.1, що може працювати, але я щойно змінив його на 'localhost'


17
Якщо сервер занадто зайнятий, так, ви можете отримати цю помилку одним крихітним зверненням.
vr devrimbaris

або якщо є проблема з вирішенням DNS, є багато причин для тайм-ауту
Етрани,

4

Зверніть увагу, що однією з найпоширеніших причин таймаутів при виконанні es.search(або es.index) є великий розмір запиту. Наприклад, у моєму випадку досить великого розміру індексу ES (> 3 мільйони документів) пошук запиту за допомогою 30 слів зайняв близько 2 секунд, тоді як пошук запиту з 400 слів зайняв більше 18 секунд. Отже, для досить великого запиту навіть тайм-аут = 30 вас не врятує. Просте рішення - обрізати запит до розміру, на який можна відповісти нижче часу очікування.

Збільшення тайм-ауту або повторні спроби тайм-ауту допоможуть вам, якщо причиною було затори, інакше це може бути вашим винуватцем.


3

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) означає, що запит не закінчився у вказаний час (за замовчуванням, час очікування = 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_timeoutна Trueі дати max_retriesдодатковий номер:

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

1

була вирішена моя особиста проблема, (timeout = 10000)якої практично ніколи не було досягнуто, оскільки записів на сервері було лише 7000, але він мав великий трафік і його ресурси були заблоковані, і тому з'єднання розривалося


1

Причин тайм-ауту може бути багато, і, здається, варто перевірити журнали на стороні elasticsearch ( logs/elasticsearch.log), щоб побачити детальну помилку. У нашому випадку помилка на ES була:

primary shard is not active Timeout: [1m]

Як описано в цій публікації , це було тому, що наш диск був заповнений. Ми змінили розмір його (і розділу) день тому, щоб подбати про це, але ES потрібно перезапустити, якщо високий / низький водяний знак потрапив один раз (ми знаходимося на 5.5.x), чого ми не робили.

Просто перезапуск 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: зменшити довжину тексту

Це також допомагає зменшити довжину тексту, наприклад, скорочуючи довгі тексти, завдяки чому еластичність може швидше зберігати текст, що також уникне тайм-аутів:

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

Це не буде працювати, оскільки помилка все ще існує, вказавши значення тайм-ауту як 10
Alex Jolig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.