Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Cơ Sở Dữ Liệu

Khắc Phục Truy Vấn Elasticsearch Chậm: Nguyên Nhân Phổ Biến & Cách Sửa

Bài viết gốc đăng tải ngày 29 tháng 5 năm 2018 tại ObjectRocket.com/blog.

Một yêu cầu hỗ trợ Elasticsearch® thường gặp mà Rackspace Technology nhận được là "Bạn có thể giúp về thời gian phản hồ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ì?"

Khắc Phục Truy Vấn Elasticsearch Chậm: Nguyên Nhân Phổ Biến & Cách Sửa

Hai phương pháp

Khi nào chúng tôi nhận được các loại câu hỏi này, chúng tôi bắt đầu bằng cách nhìn vào hai khu vực chính:

  • Phía Vận Hành – Xem tài nguyên hệ thống hiện tại và các tùy chọn Elasticsearch mặc định.
  • Phía Phát Triển - Xem các truy vấn, cấu trúc của chúng và mapping của dữ liệu bạn đang tìm kiếm.

Trong bài đầu tiên của loạt bài về tối ưu hóa Elasticsearch, chúng tôi tập trung vào khu vực sau. Chúng tôi lấy các truy vấn chậm, thảo luận về Ngôn Ngữ Đặc Thù Miền (DSL) truy vấn, và xem qua các tùy chọn có thể giúp cải thiện 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 truy vấn đến cluster. Tài liệu Elasticsearch không rõ về cách bật slow logs, vì vậy tôi sẽ chỉ ra một số ví dụ trong bài này.

Trước hết, có hai phiên bản slow logs trong Elasticsearch: index slow logs và search slow logs. Vì vấn đề chúng tôi cố gắng giải quyết liên quan đến truy vấn chậm, chúng tôi tập trung vào search slow logs. Tuy nhiên, nếu đây là về vấn đề hiệu suất khi indexing hoặc thêm tài liệu, chúng tôi sẽ xem index slow logs.

Tất cả phiên bản Elasticsearch tắt slow logs theo mặc định, vì vậy bạn phải thực hiện một vài cập nhật cho cả cài đặt cluster và cài đặt index. Các ví dụ sau đây xử lý Elasticsearch 6.2, nhưng bạn có thể tìm thông tin về các phiên bản trước tại đây. Thay thế $ES_version bằng phiên bản bạn đang làm việc, ví dụ phiên bản 5.5.

  • Gửi yêu cầu PUT đến API _cluster để xác định mức độ slow log bạn muốn bật: warn, info, debug và trace. (Thêm thông tin về mức độ log.)

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

     { 

    “transient” : { “logger.index.search.slowlog” : “DEBUG”, “logger.index.indexing.slowlog” : “DEBUG” } }'

Vì Elasticsearch bật tất cả slow logging ở mức index, bạn có thể gửi yêu cầu đến API _settings của index để bật nó. Bạn cũng phải thêm vào mẫu index của mình nếu bạn xoay vòng index hàng tháng, hàng quý, v.v.

  • Điều chỉnh cuộc gọi API đến cài đặt index để khớp với ngưỡng thời gian slow log bạn muốn đạt được. Bạn có thể đặt giá trị thành số không để phân tích instance và thu thập tất cả truy vấn được gửi hoặc -1 để tắt slow log.

  • Sử dụng cùng cài đặt log-level bạn đã dùng trong _clustersettings. Trong ví dụ này, DEBUG. ES_PORT là biến môi trường bền vững.

    curl -XPUT https://localhost:$ES_PORT/*/_settings?pretty -H ‘Content-Type: application/json’ -d ‘{“index.search.slowlog.threshold.query.debug”: “-1”,“index.search.slowlog. threshold.fetch.debug”: “-1”,}’

Bây giờ, bạn cần thu thập log. Slow logs được tạo trên mỗi shard và thu thập trên mỗi data node. Nếu bạn chỉ có một data node chứa năm primary shard (giá trị mặc định), bạn sẽ thấy năm mục cho một truy vấn trong slow logs. Vì tìm kiếm trong Elasticsearch xảy ra bên trong mỗi shard, bạn thấy một cho mỗi shard. Slow Logs được lưu trữ trên mỗi data node tại vị trí mặc định sau: /var/log/elasticsearch/$ClusterID_index_slowlog_query và /var/log/elasticsearch/$ClusterID_index_slowlog_fetch. Như bạn thấy, search slow logs lại được chia thành các file log riêng biệt dựa trên giai đoạn tìm kiếm: fetch và query.

Bây giờ chúng ta có kết quả trong log, chúng ta có thể lấy một mục và phân tích nó.

[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 tháng
  • Mức log
  • Loại slowlog
  • Tên node
  • Index
  • Số shard
  • Thời gian thực hiện
  • Phần thân của truy vấn (_source>)

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

_profile API

API _profile cung cấp nhiều trang thông tin về tìm kiếm của bạn và phân tích những gì xảy ra trong mỗi shard, xuống đến thời gian riêng lẻ của từng thành phần tìm kiếm — càng chi tiết tìm kiếm, đầu ra _profile càng nhiều.

Công cụ phân tích Kibana

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

Hai giai đoạn của Elasticsearch: query then fetch

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

Giai đoạn Query

  • Node coordinator chấp nhận truy vấn.
  • Coordinator xác định index (hoặc các index) đang được tìm kiếm.
  • Coordinator tạo danh sách các node chứa shard cho index (trong sự kết hợp của cả primary và replica).
  • Coordinator gửi truy vấn đến các node.
  • Shard trên các node xử lý truy vấn.
  • Truy vấn được chấm điểm (theo mặc định) cho top 10 tài liệu.
  • Danh sách được gửi trở lại node coordinator.

Giai đoạn Fetch

  • Giai đoạn fetch bắt đầu với node coordinator, xác định top 10 tài liệu từ 50 (5 shards x 10) kết quả được gửi bởi mỗi shard.
  • Coordinator gửi yêu cầu cho top 10 tài liệu đến các shard. (Điều này có thể là một shard chứa tài liệu chấm điểm cao nhất, hoặc chúng có thể bị phân tán trên một vài shard.)

Sau khi danh sách được trả về, master 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 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 kết quả chính xác nhất. Ví dụ, nếu bạn tìm kiếm kiwi, trái cây, bạn không muốn kết quả bao gồm cạo giày Kiwi. Elasticsearch chấm điểm kết quả truy vấn dựa trên các tham số bạn cung cấp. Mặc dù chúng tôi bao gồm độ liên quan truy vấn trong một bài blog hoàn toàn khác, điều quan trọng cần nhắc ở đây là nếu bạn có tìm kiếm nhanh nhưng kết quả không phải những gì bạn tìm kiếm, toàn bộ tìm kiếm là lãng phí thời gian. Vậy làm thế nào để tăng tốc tìm kiếm của bạn?

Bộ lọc (Filters)

Một cách để cải thiện hiệu suất tìm kiếm của bạn là với bộ lọc. Truy vấn được lọc có thể là người bạn tốt nhất của bạn. Quan trọng là lọc trước vì filter trong tìm kiếm không ảnh hưởng đến kết quả chấm đ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 boolean matches, bạn có thể tìm kiếm tất cả tài liệu chứa X trước khi chấm điểm xem chúng có chứa Y hay không. Ngoài ra, bạn có thể cache filters.

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

Tóm tắt

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

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

Có câu hỏi về quản lý Elasticsearch? Chúng tôi bao gồm quyền truy cập vào các Database administrator có chuyên môn sâu về Elasticsearch với mọi instance, ngay cả với bản dùng thử miễn phí. Hãy tập trung vào phát triển và để chúng tôi xử lý quản trị Elasticsearch.

Muốn thử dùng Elasticsearch 6 với Kibana miễn phí? Bắt đầu ngay 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ình luận hoặc đặt câu hỏi. Bạn cũng có thể nhấp vào Sales Chat để trò chuyện ngay và bắt đầu cuộc hội thoại.