Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Tại sao truy vấn Elasticsearch của tôi chậm?

Được xuất bản lần đầu vào ngày 29 tháng 5 năm 2018 tại ObjectRocket.com/blog.

Một yêu cầu hỗ trợ thường xuyên của Elasticsearch® mà Rackspace Technology nhận được là “Bạn có thể trợ giúp về thời gian phản hồi của tôi không?” hoặc “Truy vấn của tôi mất nhiều thời gian, tôi có thể làm gì?”

Tại sao truy vấn Elasticsearch của tôi chậm?

Hai cách tiếp cận

Bất cứ khi nào chúng tôi nhận được những loại câu hỏi này, chúng tôi bắt đầu bằng cách xem xét hai lĩnh vực chính:

  • Bên Hoạt động - Xem tài nguyên hệ thống hiện tại và các tùy chọn Elasticsearch mặc định.
  • Mặt phát triển - Xem xét các truy vấn, cấu trúc của chúng và ánh xạ dữ liệu bạn đang tìm kiếm.

Trong phần đầu tiên này trong một loạt các bài đăng trên blog về tối ưu hóa Elasticsearch, chúng tôi tập trung vào phần sau của hai lĩnh vực này. Chúng tôi nhận được các truy vấn chậm, thảo luận về ngôn ngữ truy vấn Ngôn ngữ dành riêng cho Miền (DSL) và xem xét các tùy chọn có thể giúp cải thiện các truy vấn Elasticsearch của bạn.

Truy vấn của bạn chậm đến mức nào?

Bước đầu tiên là xem mất bao lâu để gửi một truy vấn đến cụm.

Đầu tiên, có hai phiên bản nhật ký chậm trong Elasticsearch:lập chỉ mục nhật ký chậm và tìm kiếm nhật ký chậm. Vì vấn đề chúng tôi đang cố gắng giải quyết liên quan đến các truy vấn chậm, chúng tôi tập trung vào tìm kiếm nhật ký chậm. Tuy nhiên, nếu đây là vấn đề về hiệu suất trong khi lập chỉ mục hoặc thêm tài liệu, chúng tôi sẽ xem xét nhật ký lập chỉ mục chậm.

Tất cả các phiên bản của Elasticsearch đều tắt nhật ký chậm theo mặc định, do đó bạn phải thực hiện một vài cập nhật cho cả cài đặt cụm và cài đặt chỉ mục. phiên bản mà bạn đang làm việc, ví dụ:phiên bản 5.5.

  • Gửi PUT yêu cầu _cluster API để xác định mức độ đăng nhập chậm mà bạn muốn bật:cảnh báo, thông tin, gỡ lỗi và theo dõi. (Thông tin thêm về mức độ ghi nhật ký.)

    curl -XPUT https:// localhost:$ ES_PORT / _cluster / settings -H ‘Content-Type:application / json’ -d ’

      {
    

    “Tạm thời”:{“logger.index.search.slowlog”:“GỢI Ý”, “logger.index.indexing.slowlog”:“GỢI Ý”}} '

Vì Elasticsearch cho phép tất cả ghi nhật ký chậm ở cấp chỉ mục, bạn có thể gửi yêu cầu đến _settings lập chỉ mục API để bật nó lên. Bạn cũng phải thêm vào mẫu chỉ mục của mình nếu bạn đang xoay vòng các chỉ mục của mình hàng tháng, hàng quý, v.v.

  • Điều chỉnh lệnh gọi API đến cài đặt chỉ mục để phù hợp với ngưỡng thời gian ghi chậm mà bạn muốn đạt được. Bạn có thể đặt giá trị thành số 0 để lập hồ sơ cá thể và thu thập tất cả các truy vấn tiềm ẩn hoặc –1 để tắt nhật ký chậm.

  • Sử dụng cùng cài đặt cấp nhật ký mà bạn đã sử dụng trong _clustersettings. Trong ví dụ này, DEBUG . ES_PORT là một biến môi trường liên tục.

    curl -XPUT https:// localhost:$ ES_PORT / * / _ settings? pretty -H 'Content-Type:application / json' -d '{“index.search.slowlog.threshold.query.debug”:“-1” , “Index.search.slowlog. ngưỡng.fetch.debug ”:“ -1 ”,}’

Bây giờ, bạn cần phải thu thập các bản ghi. Nhật ký chậm được tạo trên mỗi phân đoạn và được thu thập trên mỗi nút dữ liệu. Nếu bạn chỉ có một nút dữ liệu chứa nhiều phân đoạn chính (giá trị mặc định), bạn sẽ thấy năm mục nhập cho một truy vấn trong nhật ký chậm. Vì các tìm kiếm trong Elasticsearch xảy ra bên trong phân đoạn, bạn sẽ thấy một tìm kiếm cho mỗi phân đoạn. Nhật ký chậm được lưu trữ trên mỗi nút dữ liệu trong vị trí mặc định sau: / var / log /asticsearch / $ ClusterID_index_slowlog_query và / var / log /asticsearch / $ ClusterID_index_slowlog_fetch Như bạn có thể thấy, nhật ký tìm kiếm chậm lại được chia thành các tệp nhật ký riêng biệt dựa trên giai đoạn tìm kiếm:tìm nạp và truy vấn.

Bây giờ chúng tôi đã có kết quả trong nhật ký, chúng tôi có thể kéo một mục nhập và tách nó ra.

[2018-05-21T12:35:53,352][DEBUG ][index.search.slowlog.query] [DwOfjJF] [blogpost-slowlogs][4] took[1s],    took_millis[0], types[], stats[], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"query":{"match":{"name":    {"query":"hello world", "operator":"OR","prefix_length":0,"max_expansions":50,"fuzzy_transpositions" :true, "lenient":false,"zero_terms_query": "NONE","boost":1.0}}},"sort":[{"price": {"order":"desc"}}]}],

Đây, bạn thấy:

  • Dấu thời gian ngày
  • Cấp độ nhật ký
  • Loại nhật ký chậm
  • Tên nút
  • Chỉ mục
  • Số phân đoạn
  • Thời gian mất
  • Nội dung của truy vấn (_source>)

Sau khi chúng tôi nhận được truy vấn mà chúng tôi xác định là mất quá nhiều thời gian, Chúng tôi có thể sử dụng công cụ sau để chia nhỏ nó:

_ API hồ sơ

_profile API cung cấp các trang thông tin về tìm kiếm của bạn và chia nhỏ những gì đã xảy ra trong mỗi phân đoạn, ngay đến thời gian riêng của từng thành phần tìm kiếm — tìm kiếm càng chi tiết thì kết quả đầu ra _profile càng chi tiết.

Công cụ tạo hồ sơ Kibana

Công cụ Kibana® song hành với _profile API. Nó cung cấp một bản mô tả thác nước trực quan đẹp mắt về các thành phần tìm kiếm riêng lẻ và thời gian chúng hoàn thành. Một lần nữa, điều này cho phép bạn chọn ra khu vực có vấn đề của truy vấn.

Hai giai đoạn của Elasticsearch:truy vấn rồi tìm nạp

Bây giờ, chúng tôi đã xác định được một truy vấn chậm và chúng tôi đã chạy nó thông qua một trình mô tả. Tuy nhiên, việc xem xét các kết quả thời gian thành phần riêng lẻ không giúp tìm kiếm của bạn nhanh hơn. Giờ thì sao? Hiểu cách truy vấn hoạt động, trải qua hai giai đoạn sau, cho phép bạn thiết kế lại truy vấn của mình theo cách có được kết quả tốt nhất từ ​​Elasticsearch — cả về tốc độ và mức độ liên quan.

Giai đoạn truy vấn

  • Nút điều phối viên chấp nhận truy vấn.
  • Người điều phối xác định chỉ mục (hoặc các chỉ số) đang được tìm kiếm.
  • Bộ điều phối tạo ra một danh sách các nút có chứa các phân đoạn cho chỉ mục (kết hợp cả bản chính và bản sao).
  • Người điều phối gửi truy vấn đến các nút.
  • Các phân đoạn trên các nút xử lý truy vấn.
  • Các truy vấn được cho điểm (theo mặc định) vào 10 tài liệu hàng đầu.
  • Danh sách được gửi trở lại nút điều phối viên.

Giai đoạn tìm nạp

  • Giai đoạn tìm nạp bắt đầu với nút điều phối, nút này xác định 10 tài liệu hàng đầu trong số 50 (5 phân đoạn x 10) kết quả được gửi bởi mỗi phân đoạn.
  • Người điều phối gửi yêu cầu về 10 tài liệu hàng đầu tới các nhóm. (Đây có thể là một nhóm chứa các tài liệu có điểm số cao nhất hoặc chúng có thể nằm rải rác trên một số nhóm.)

Sau khi một danh sách được trả về, cái trình bày các tài liệu trong phần _hits của phản hồi truy vấn.

Điểm kết quả

Điểm số kết quả là chìa khóa trong Elasticsearch. Thông thường, khi bạn sử dụng công cụ tìm kiếm, bạn muốn có kết quả chính xác nhất. Ví dụ:nếu bạn đang tìm kiếm kiwi, một loại trái cây, bạn không muốn kết quả bao gồm xi đánh giày Kiwi. , điều quan trọng cần đề cập ở đây là bởi vì nếu bạn tìm kiếm nhanh nhưng không có kết quả như bạn đang tìm kiếm, thì toàn bộ quá trình tìm kiếm thật lãng phí thời gian.

Bộ lọc

Một cách để cải thiện hiệu suất tìm kiếm của bạn là sử dụng các bộ lọc. Truy vấn được lọc có thể là người bạn tốt nhất của bạn. Điều quan trọng là phải lọc trước vì lọc trong tìm kiếm không ảnh hưởng đến kết quả của điểm tài liệu, vì vậy bạn sử dụng rất ít tài nguyên để giảm trường tìm kiếm.

Với truy vấn được lọc, làm việc với các kết quả so khớp boolean, bạn có thể tìm kiếm tất cả các tài liệu có chứa X trước khi cho điểm xem chúng có chứa Y. Ngoài ra, bạn có thể lưu bộ lọc vào bộ nhớ cache.

Bộ lọc không phải là cách duy nhất để tăng tốc truy vấn Elasticsearch. Chúng tôi sẽ đề cập đến nhiều phương pháp khác mà bạn có thể sử dụng để cải thiện hiệu suất truy vấn trong một blog trong tương lai.

Tóm tắt

Bạn có thể tối ưu hóa các truy vấn của mình trong một vài bước đơn giản:

  • Bật ghi nhật ký chậm để bạn có thể xác định các truy vấn đang chạy lâu
  • Chạy các tìm kiếm đã xác định thông qua API _profiling để xem thời gian của các thành phần riêng lẻ
  • Lọc, lọc, lọc

Bạn có câu hỏi về việc quản lý Elasticsearch? Chúng tôi bao gồm quyền truy cập vào các Quản trị viên dữ liệu của chúng tôi với kiến ​​thức chuyên môn sâu về Elasticsearch với mọi trường hợp, ngay cả khi dùng thử miễn phí. Bắt đầu tập trung vào phát triển và để chúng tôi xử lý việc quản lý Elasticsearch.

Bạn muốn chơi thử miễn phí Elasticsearch 6 với Kibana? Hãy bắt đầu và cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào.

Sử dụng tab Phản hồi để đưa ra bất kỳ nhận xét hoặc đặt câu hỏi nào. Bạn cũng có thể nhấp vào Trò chuyện bán hàng để trò chuyện ngay bây giờ và bắt đầu cuộc trò chuyện.