Hết thời gian chờ kết nối với Elasticsearch


84
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'])

Mã đơn giản này trả lại lỗi sau:

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10))

Rất lạ, bởi vì máy chủ đã sẵn sàng và được thiết lập ( http: // localhost: 9200 / đang trả về một số json).

Câu trả lời:


91

Theo mặc định, giá trị thời gian chờ được đặt thành 10 giây. Nếu một người muốn thay đổi giá trị thời gian chờ chung, điều này có thể đạt được bằng cách đặt cờ timeout = thời gian của bạn trong khi tạo đối tượng.

Nếu bạn đã tạo đối tượng mà không chỉ định giá trị thời gian chờ, thì bạn có thể đặt giá trị thời gian chờ cho yêu cầu cụ thể bằng cách sử dụng cờ request_timeout = your-time trong truy vấn.

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

Điều này có thể được đặt thành 60 không? tôi đang nhận được thời gian chờ ngay cả sau khi cài đặt nó 30
Kishan Mehta

@Kishan cơ thể của bạn lớn bao nhiêu?
Rohit Patwa

Xin chào, @RohitPatwa, vấn đề của tôi đã được giải quyết bằng cách giảm độ dài của tài liệu. Tôi không nhớ lúc này cơ thể lớn như thế nào. Cảm ơn sự giúp đỡ :)
Kishan Mehta

Điều gì sẽ xảy ra nếu sếp của tôi không cho phép tôi thay đổi thời gian chờ và nó không thành công trên một bản ghi?
Jonathan Rys

18

Sự cố hết thời gian kết nối có thể xảy ra nếu bạn đang sử dụng dịch vụ Amazon Elastic Search.

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

Mã python ở trên nơi bạn ghi đè cổng mặc định từ 9200 thành 443 và đặt SSL thành true sẽ giải quyết được sự cố.

Nếu không có cổng nào được chỉ định, nó đang cố gắng kết nối với cổng 9200 trong máy chủ được chỉ định và không thành công sau khi hết thời gian


Hoặc bạn có thể sử dụng cổng 80 es = Elasticsearch ([{'host': 'xxxxxx.us-east-1.es.amazonaws.com', 'port': 80}])
Olga Akhmetova

6

Điều này không liên quan gì đến việc tăng thời gian chờ của bạn lên 30 giây. Mọi người có thực sự nghĩ rằng tìm kiếm co giãn cần đến 30 giây để trả về một lần truy cập nhỏ không?

Cách tôi đã khắc phục sự cố này là vào config /asticsearch.yml bỏ ghi chú sau

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

Network.host có thể được đặt thành 192.168.0.1 có thể hoạt động Nhưng tôi vừa đổi thành 'localhost'


17
Nếu máy chủ quá bận, có, bạn có thể gặp lỗi này với một lần nhấn nhỏ.
ᐅ devrimbaris

hoặc nếu có một vấn đề với DNS quyết tâm, có rất nhiều lý do để một thời gian chờ
Ethranes

4

Lưu ý rằng một trong những lý do phổ biến khiến hết thời gian khi thực hiện es.search(hoặc es.index) là kích thước truy vấn lớn. Ví dụ, trong trường hợp của tôi với kích thước chỉ mục ES khá lớn (> 3M tài liệu), việc thực hiện tìm kiếm một truy vấn có 30 từ mất khoảng 2 giây, trong khi thực hiện tìm kiếm một truy vấn có 400 từ mất hơn 18 giây. Vì vậy, đối với một truy vấn đủ lớn, thậm chí timeout = 30 sẽ không giúp bạn tiết kiệm. Một giải pháp dễ dàng là cắt truy vấn đến kích thước có thể được trả lời dưới thời gian chờ.

Tăng thời gian chờ hoặc thực hiện thử lại đúng thời gian chờ sẽ giúp bạn nếu nguyên nhân là do lưu lượng truy cập, nếu không đây có thể là thủ phạm của bạn.


3

elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host='localhost', port=9200): Read timed out. (read timeout=10)) có nghĩa là yêu cầu không kết thúc trong thời gian được chỉ định (theo mặc định, timeout = 10).

Điều này sẽ hoạt động với 30 giây:

res = es.index(index="test-index", doc_type='tweet', id=1, body=doc, timeout=30)


2

Hãy thử đặt thời gian chờ trong khởi tạo Elasticsearch:

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

Bạn thậm chí có thể thiết lập retry_on_timeoutđể Truevà đưa ra max_retriesmột số tùy chọn:

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

1

vấn đề cá nhân của tôi đã được giải quyết (timeout = 10000)mà thực tế là không bao giờ đạt được vì các mục nhập trên máy chủ chỉ là 7.000 nhưng nó có lưu lượng truy cập lớn và tài nguyên của nó đang bị tải và đó là lý do tại sao kết nối bị ngắt


1

Các lý do cho thời gian chờ có thể có nhiều và có vẻ như bạn nên kiểm tra nhật ký ở phía bên đàn hồi ( logs/elasticsearch.log) để xem lỗi chi tiết. Trong trường hợp của chúng tôi, lỗi trên ES là:

primary shard is not active Timeout: [1m]

Như được mô tả trong bài đăng này , điều này là do đĩa của chúng tôi đã đầy. Chúng tôi đã thay đổi kích thước nó (và phân vùng) một ngày trước để xử lý điều đó nhưng ES cần được khởi động lại nếu hình mờ cao / thấp đã bị nhấn một lần (chúng tôi đang ở trên 5.5.x) mà chúng tôi chưa thực hiện.

Chỉ cần khởi động lại ES khi sản xuất đã giải quyết được vấn đề cho chúng tôi.


0

Hai tùy chọn giúp:

1: tăng thời gian chờ

Đặt thời gian chờ đã giải quyết được vấn đề này cho tôi. Lưu ý rằng các phiên bản mới hơn cần một đơn vị, ví dụ timeout="60s":

es.index(index=index_name, doc_type="domains", id=domain.id, body=body, timeout="60s")

Nếu không có một đơn vị, chẳng hạn như bằng cách cài đặt timeout=60, bạn sẽ nhận được

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: giảm độ dài văn bản

Nó cũng giúp giảm độ dài văn bản, ví dụ như bằng cách cắt các đoạn văn bản dài, vì vậy co giãn có thể lưu trữ văn bản nhanh hơn và cũng sẽ tránh hết thời gian:

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

Điều này sẽ không hoạt động vì lỗi vẫn còn đó ghi giá trị thời gian chờ là 10
Alex Jolig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.