Nghiên cứu trong sản xuất - Thực hành tốt nhất

Elaticsearch là công cụ tìm kiếm được tối ưu hóa cao cho các phân tích dữ liệu hiện đại.

Elaticsearch là một công cụ tìm kiếm và phân tích thời gian thực tuyệt vời. Nó được xây dựng trên Apache Lucene. Nó được phân phối, RESTful, dễ dàng bắt đầu sử dụng và có tính sẵn sàng cao. Các trường hợp sử dụng Elaticsearch bao gồm cung cấp năng lượng cho tìm kiếm, giám sát giao dịch và phát hiện lỗi, phát hiện nội dung, phân tích nhật ký, tìm kiếm mờ, tổng hợp dữ liệu sự kiện, trực quan hóa dữ liệu. Elaticsearch và phần còn lại của Stack Stack đã được chứng minh là cực kỳ linh hoạt, và như bạn có thể thấy các trường hợp sử dụng ở trên, có nhiều cách để tích hợp Elaticsearch vào những gì sản phẩm của bạn cung cấp ngày hôm nay và thêm cái nhìn sâu sắc về nó.

Chúng tôi sử dụng nó rất nhiều cho tìm kiếm và phân tích tại Botmetric, chúng tôi lập chỉ mục khoảng một tỷ tài liệu mỗi ngày và chúng tôi sử dụng các tập hợp rất phức tạp để trực quan hóa dữ liệu trong thời gian thực.

Điều đó nói rằng, bootstrapping một ứng dụng so với việc chạy nó trong sản xuất và bảo trì là hoàn toàn khác nhau. Aricle này bao gồm nhiều yếu tố từ kinh nghiệm thực tế và là những vật dụng phổ biến cơ bản bạn nên xem xét để chạy Elaticsearch trong sản xuất.

Ký ức:

Elaticsearch và Lucene được viết bằng Java, có nghĩa là bạn phải tìm ra các số liệu thống kê heapspace và JVM. Càng nhiều heap có sẵn cho Elaticsearch, nó càng có thể sử dụng nhiều bộ nhớ cho bộ lọc và bộ nhớ đệm khác để tăng hiệu năng truy vấn. Nhưng lưu ý rằng quá nhiều đống có thể khiến bạn phải tạm dừng bộ sưu tập rác dài. Don Tiết đặt Xmx lên trên ngưỡng cắt mà JVM sử dụng cho các con trỏ đối tượng nén (oops nén); mức cắt chính xác khác nhau nhưng gần 32 GB.

Một vấn đề phổ biến là cấu hình một đống quá lớn. Bạn có một máy 64 GB - và bằng cách golly, bạn muốn cung cấp cho Elaticsearch tất cả 64 GB bộ nhớ. Càng nhiều càng tốt! Heap chắc chắn rất quan trọng đối với Elaticsearch. Nó được sử dụng bởi nhiều cấu trúc dữ liệu trong bộ nhớ để cung cấp hoạt động nhanh. Nhưng như đã nói, có một người dùng bộ nhớ chính khác đang bị heap: bộ đệm của tệp hệ điều hành.

Lucene được thiết kế để tận dụng HĐH cơ bản để lưu trữ cấu trúc dữ liệu trong bộ nhớ. Phân đoạn Lucene được lưu trữ trong các tập tin cá nhân. Bởi vì các phân đoạn là bất biến, các tệp này không bao giờ thay đổi. Điều này làm cho chúng rất thân thiện với bộ nhớ cache và hệ điều hành bên dưới sẽ vui vẻ giữ các phân đoạn nóng trong bộ nhớ để truy cập nhanh hơn. Các phân đoạn này bao gồm cả chỉ mục đảo ngược (đối với tìm kiếm toàn văn bản) và giá trị doc (đối với tập hợp). Hiệu suất của Lucene Phụ thuộc vào sự tương tác này với HĐH. Nhưng nếu bạn cung cấp tất cả bộ nhớ có sẵn cho heap Elaticsearch, thì won sẽ còn lại cho bộ đệm của tệp hệ điều hành. Điều này có thể ảnh hưởng nghiêm trọng đến hiệu suất. Đề xuất tiêu chuẩn là cung cấp 50% bộ nhớ khả dụng cho đống Elaticsearch, trong khi để lại 50% miễn phí khác. Nó đã giành chiến thắng không được sử dụng; Lucene sẽ vui vẻ tiêu thụ bất cứ thứ gì còn lại cho bộ nhớ cache của tệp. Heap Elearchearch có thể được cấu hình theo cách,

xuất ES_HEAP_SIZE = 10g

hoặc là

ES_JAVA_OPTS = "- Xms10g -Xmx10g" ./bin/elaticsearch

CPU:

Elaticsearch hỗ trợ tổng hợp và truy vấn được lọc. Chạy các truy vấn được lọc phức tạp, lập chỉ mục chuyên sâu, percolation và truy vấn đối với các chỉ mục cần CPU nặng, do đó, chọn đúng truy vấn là rất quan trọng. Người ta phải hiểu các thông số kỹ thuật của CPU và cách chúng hoạt động với Java khi các truy vấn chạy trên JVM.

Mỗi nhóm chạy một số luồng, có thể được cấu hình và có một hàng đợi. Thay đổi điều này không được khuyến khích trừ khi bạn có yêu cầu rất cụ thể vì Elaticsearch không phân bổ lõi một cách linh hoạt.

Các loại chủ đề:

Elaticsearch có 3 loại Thread pool.

  1. Bộ nhớ cache: Nhóm luồng được lưu trong bộ đệm là nhóm luồng không được liên kết sẽ sinh ra một luồng nếu có các yêu cầu đang chờ xử lý. Nhóm luồng này được sử dụng để ngăn chặn các yêu cầu gửi đến nhóm này khỏi bị chặn hoặc bị từ chối. Các luồng không được sử dụng trong nhóm luồng này sẽ bị chấm dứt sau khi hết hạn sử dụng (mặc định là năm phút). Nhóm luồng được lưu trữ được dành riêng cho nhóm luồng chung.
  2. Đã sửa lỗi: Nhóm luồng cố định giữ một kích thước cố định của luồng để xử lý các yêu cầu với hàng đợi (tùy chọn giới hạn) cho các yêu cầu đang chờ xử lý không có luồng để phục vụ chúng. Tham số kích thước kiểm soát số lượng luồng và mặc định là số lõi lần 5.
  3. Chia tỷ lệ: Nhóm luồng chia tỷ lệ giữ một số luồng động. Con số này tỷ lệ thuận với khối lượng công việc và thay đổi giữa 1 và giá trị của tham số kích thước.

Elaticsearch chia việc sử dụng CPU thành các nhóm luồng khác nhau:

  • generic: cho các hoạt động tiêu chuẩn như khám phá và loại nhóm luồng được lưu trữ.
  • index: cho các hoạt động index / xóa. Loại hồ bơi chủ đề là cố định.
  • tìm kiếm: cho các hoạt động đếm / tìm kiếm. Loại hồ bơi chủ đề là cố định.
  • get: cho các hoạt động có được. Loại hồ bơi chủ đề là cố định.
  • số lượng lớn: cho các hoạt động số lượng lớn như lập chỉ mục số lượng lớn. Loại hồ bơi chủ đề là cố định. Cấu hình tốt nhất của tài liệu hàng loạt phụ thuộc vào cấu hình cụm, điều này có thể được xác định bằng cách thử nhiều giá trị.
  • percolate: cho sự thẩm thấu. Loại hồ bơi chủ đề là cố định.
  • refresh: Đối với các hoạt động làm mới. Loại hồ bơi chủ đề được nhân rộng.

Thay đổi nhóm luồng cụ thể có thể được thực hiện bằng cách đặt tham số loại cụ thể của nó.

Đọc thêm https://www.elastic.co/guide/en/elSTERearch/reference/2.2/modules-threadpool.html#types

Kích thước mảnh:

Phân đoạn là đơn vị tại đó Elaticsearch phân phối dữ liệu trong cụm. Tốc độ mà Elaticsearch có thể di chuyển phân mảnh xung quanh khi cân bằng lại dữ liệu, ví dụ: sau một thất bại, sẽ phụ thuộc vào kích thước và số lượng phân đoạn cũng như hiệu suất của mạng và đĩa.

Trong Elaticsearch, mỗi truy vấn được thực hiện trong một luồng trên mỗi phân đoạn. Tuy nhiên, nhiều phân đoạn có thể được xử lý song song, vì có thể nhiều truy vấn và tập hợp đối với cùng một phân đoạn.

Điều này có nghĩa là độ trễ truy vấn tối thiểu, khi không có bộ đệm ẩn, sẽ phụ thuộc vào dữ liệu, loại truy vấn, cũng như kích thước của phân đoạn. Truy vấn nhiều phân đoạn nhỏ sẽ giúp việc xử lý trên mỗi phân đoạn nhanh hơn, nhưng vì nhiều nhiệm vụ cần được xếp hàng và xử lý theo trình tự, nên không nhất thiết phải nhanh hơn truy vấn số lượng phân đoạn lớn hơn. Có nhiều phân đoạn nhỏ cũng có thể làm giảm thông lượng truy vấn nếu có nhiều truy vấn đồng thời.

Mỗi phân đoạn có dữ liệu cần được lưu trong bộ nhớ và sử dụng không gian heap. Điều này bao gồm các cấu trúc dữ liệu chứa thông tin ở cấp phân đoạn và cả ở cấp phân khúc để xác định nơi dữ liệu nằm trên đĩa. Kích thước của các cấu trúc dữ liệu này không cố định và sẽ thay đổi tùy theo trường hợp sử dụng. Một đặc điểm quan trọng của chi phí liên quan đến phân khúc là tuy nhiên nó không hoàn toàn tỷ lệ thuận với kích thước của phân khúc. Điều này có nghĩa là các phân đoạn lớn hơn có ít chi phí trên mỗi khối dữ liệu so với các phân đoạn nhỏ hơn. Sự khác biệt có thể là đáng kể. Chọn đúng số lượng phân đoạn rất phức tạp vì bạn không bao giờ biết bạn sẽ nhận được bao nhiêu tài liệu trước khi bắt đầu. Có nhiều mảnh vỡ có thể vừa tốt vừa khủng khiếp cho một cụm. Các chỉ số và quản lý phân đoạn có thể quá tải nút chủ, có thể trở nên không phản hồi, dẫn đến một số hành vi lạ và khó chịu. Phân bổ các nút chính của bạn đủ tài nguyên để đối phó với kích thước cụm.

Điều tệ hại là số lượng phân đoạn là bất biến và nó được xác định khi bạn tạo chỉ mục. Khi chỉ mục được tạo, cách duy nhất để thay đổi số lượng phân đoạn là xóa các chỉ mục của bạn, tạo lại chúng và reindex.

Nhân rộng

Elaticsearch hỗ trợ sao chép, dữ liệu được sao chép giữa các nút dữ liệu nên việc mất nút sẽ không dẫn đến mất dữ liệu. Theo mặc định, hệ số sao chép là 1, nhưng tùy thuộc vào yêu cầu sản phẩm của bạn, nó có thể được tăng lên. Càng nhiều bản sao, dữ liệu của bạn sẽ chống lại thảm họa nhiều hơn. Một lợi thế khác của việc có nhiều bản sao là mỗi nút chứa một bản sao, giúp cải thiện hiệu năng truy vấn vì bản sao cũng được sử dụng để truy vấn.

Công thức sao chép được sử dụng bởi Elaticsearch cho tính nhất quán là,

(chính + number_of numplicas) / 2 + 1

Tối ưu hóa phân bổ

Dựa trên yêu cầu dữ liệu sản phẩm, chúng tôi có thể phân loại dữ liệu thành nóng và lạnh. Các chỉ mục được truy cập thường xuyên hơn các chỉ số khác, có thể được phân bổ nhiều nút dữ liệu hơn trong khi các chỉ mục ít được truy cập thường xuyên hơn có thể có ít tài nguyên được phân bổ hơn. Chiến lược này đặc biệt hữu ích để lưu trữ dữ liệu chuỗi thời gian như nhật ký ứng dụng (ví dụ: ELK).

Điều này có thể đạt được bằng cách chạy một cronjob di chuyển các chỉ số đến các nút khác nhau đều đặn.

Nút nóng là một loại nút dữ liệu thực hiện tất cả các chỉ mục trong cụm. Họ cũng nắm giữ các chỉ số gần đây nhất vì chúng thường có xu hướng được truy vấn thường xuyên nhất. Vì lập chỉ mục là một hoạt động chuyên sâu của CPU và IO, các máy chủ này cần phải mạnh mẽ và được hỗ trợ bởi bộ lưu trữ SSD đính kèm. Chúng tôi khuyên bạn nên chạy tối thiểu 3 nút Hot để có tính sẵn sàng cao. Tùy thuộc vào lượng dữ liệu gần đây bạn muốn thu thập và truy vấn, bạn cũng có thể cần tăng số lượng này để đạt được mục tiêu hiệu suất của mình.

Nút ấm là loại nút dữ liệu được thiết kế để xử lý một lượng lớn các chỉ mục chỉ đọc mà không có khả năng được truy vấn thường xuyên. Vì các chỉ số này là chỉ đọc, nút ấm có xu hướng sử dụng các đĩa lớn kèm theo (thường là đĩa quay) thay vì SSD. Cũng như nút nóng, chúng tôi khuyên dùng tối thiểu 3 nút Ấm để có tính sẵn sàng cao. Và như trước đây, với sự cảnh báo rằng lượng dữ liệu lớn hơn có thể yêu cầu các nút bổ sung để đáp ứng các yêu cầu về hiệu suất. Cũng lưu ý rằng cấu hình CPU và bộ nhớ thường sẽ cần phải phản chiếu các nút nóng của bạn. Điều này chỉ có thể được xác định bằng cách thử nghiệm với các truy vấn tương tự như những gì bạn sẽ trải nghiệm trong tình huống sản xuất.

Để biết thêm chi tiết về nút nóng và ấm tham khảo tại đây.

Một chiến lược khác mà bạn có thể thích nghi là lưu trữ các chỉ số thành s3 và khôi phục khi bạn cần dữ liệu từ các chỉ mục đó. Bạn có thể đọc thêm về nó từ đây.

Cấu trúc liên kết nút:

Các nút Elaticsearch có thể được chia thành ba loại nút chính, nút dữ liệu, nút máy khách.

  1. Nút chủ: Nút chính có thể nhỏ nếu đó không phải là nút Dữ liệu vì nó không lưu trữ bất kỳ chỉ số / phân đoạn nào. Trách nhiệm của nó là lưu trữ trạng thái cụm chi tiết và dữ liệu trợ giúp và các nút khác trong các chỉ mục / phân đoạn tra cứu dữ liệu meta. Elaticsearch nên có nhiều nút chủ để tránh vấn đề não bị phân chia.
  2. Nút dữ liệu: Nút dữ liệu chịu trách nhiệm lưu trữ / truy vấn dữ liệu chỉ mục thực tế.
  3. Nút máy khách: Nút máy khách được sử dụng làm proxy để lập chỉ mục và tìm kiếm. Điều này rất được khuyến khích nếu tập hợp được sử dụng nhiều. Đây là các nút ElasticSearch đặc biệt không phải là dữ liệu hoặc chủ đủ điều kiện. Các nút máy khách nhận biết cụm và do đó có thể hoạt động như các bộ cân bằng tải thông minh. Bạn có thể gửi các truy vấn của mình đến các nút máy khách, sau đó có thể đảm nhận nhiệm vụ đắt đỏ là thu thập các câu trả lời cho kết quả truy vấn từ mỗi nút dữ liệu.

thêm các cài đặt này vào tập tin elaticsearch.yml cho các nút tương ứng.

Nút chủ: node.master: true node.data:false
Nút dữ liệu: node.master: false node.data:true
Nút máy khách: node.master: false node.data:false

Những mẹo xử lí sự cố:

Hiệu suất tìm kiếm phụ thuộc rất nhiều vào máy được cài đặt. CPU, Sử dụng bộ nhớ và I / O đĩa là các số liệu cơ bản của hệ điều hành cho mỗi nút Elaticsearch. Bạn nên xem xét các số liệu của Máy ảo Java (JVM) khi mức sử dụng CPU tăng đột biến. Trong ví dụ sau, lý do tăng đột biến là hoạt động thu gom rác cao hơn.

  1. Áp lực heap: Áp suất bộ nhớ cao hoạt động chống lại hiệu suất của cụm theo hai cách: Khi áp suất bộ nhớ tăng lên 75% trở lên, bộ nhớ vẫn còn ít hơn và cụm của bạn hiện cũng cần phải sử dụng một số tài nguyên CPU để lấy lại bộ nhớ thông qua bộ sưu tập rác. Các chu trình CPU này không khả dụng để xử lý các yêu cầu của người dùng trong khi bật bộ sưu tập rác. Do đó, thời gian đáp ứng cho các yêu cầu của người dùng tăng lên khi hệ thống ngày càng bị hạn chế về tài nguyên. Nếu áp suất bộ nhớ tiếp tục tăng và đạt gần 100%, một hình thức thu gom rác mạnh mẽ hơn nhiều sẽ được sử dụng, điều này sẽ ảnh hưởng đáng kể đến thời gian phản hồi của cụm. Chỉ số Thời gian đáp ứng chỉ số cho thấy rằng áp lực bộ nhớ cao dẫn đến một tác động hiệu suất đáng kể.
  2. Tăng trưởng trong bộ nhớ không heap JVM, ăn hết bộ nhớ dành cho bộ đệm trang và có thể gây ra sự gặt hái OOM ở cấp độ kernel.
  3. Tránh vấn đề não chia. Tách não là một kịch bản mà cụm phân tách lên. Ví dụ, bạn có cụm 6 nút. 2 nút ngắt kết nối khỏi cụm, nhưng chúng vẫn có thể nhìn thấy nhau. 2 nút này sau đó tạo một cụm khác. Họ thậm chí sẽ bầu một chủ nhân mới trong số họ. Bây giờ chúng ta có hai cụm có cùng tên, một cụm có 4 nút và cụm khác có 2 nút. Mỗi cái có một nút chủ. Đây là vấn đề được gọi là phân tách não với cụm ES. Để tránh điều này, hãy đặt tham số ES Discovery.zen.minimum_master_nodes thành một nửa số nút + 1.
  4. Do Elaticsearch sử dụng nhiều thiết bị lưu trữ, việc theo dõi I / O của đĩa đảm bảo rằng nhu cầu cơ bản này được đáp ứng. Có nhiều lý do để giảm I / O đĩa, nó được coi là một số liệu chính để dự đoán nhiều loại vấn đề. Đây là một số liệu tốt để kiểm tra tính hiệu quả của việc lập chỉ mục và hiệu suất truy vấn. Phân tích các hoạt động đọc và ghi trực tiếp chỉ ra những gì hệ thống cần nhất trong trường hợp sử dụng cụ thể. Cài đặt hệ điều hành cho I / O đĩa là cơ sở cho tất cả các tối ưu hóa khác, điều chỉnh I / O của đĩa có thể tránh được các sự cố tiềm ẩn. Nếu I / O của đĩa vẫn không đủ, các biện pháp đối phó như tối ưu hóa số lượng phân đoạn và kích thước của chúng, điều chỉnh hợp nhất, thay thế các đĩa chậm, di chuyển sang SSD hoặc thêm nhiều nút nên được đánh giá theo các trường hợp gây ra I / O nút cổ chai.
  5. Đối với các ứng dụng dựa trên tìm kiếm, trải nghiệm người dùng có mối tương quan cao với độ trễ của các yêu cầu tìm kiếm. Có nhiều thứ có thể ảnh hưởng đến hiệu năng truy vấn, như các truy vấn được xây dựng, cụm Elaticsearch được cấu hình không đúng, bộ nhớ JVM và các vấn đề thu gom rác, IO đĩa, v.v. Độ trễ truy vấn là số liệu tác động trực tiếp đến người dùng, vì vậy hãy đảm bảo bạn đặt một số cảnh báo cho nó.
  6. Hầu hết các bộ lọc trong Elaticsearch được lưu trữ theo mặc định. Điều đó có nghĩa là trong lần thực hiện đầu tiên của truy vấn được lọc, Elaticsearch sẽ tìm thấy các tài liệu khớp với bộ lọc và xây dựng một cấu trúc có tên là bit bitsetet sử dụng thông tin đó. Dữ liệu được lưu trữ trong tập tin chứa định danh tài liệu và liệu một tài liệu đã cho có khớp với bộ lọc hay không. Các lần thực hiện tiếp theo của các truy vấn có cùng bộ lọc sẽ sử dụng lại thông tin được lưu trữ trong bitet, do đó làm cho việc thực hiện truy vấn nhanh hơn bằng cách lưu các hoạt động I / O và chu kỳ CPU. Nên sử dụng bộ lọc trong truy vấn. Để biết thêm chi tiết tham khảo tại đây.
  7. Thời gian làm mới và thời gian hợp nhất có liên quan chặt chẽ đến hiệu suất lập chỉ mục, cộng với chúng ảnh hưởng đến hiệu suất cụm tổng thể. Làm mới thời gian tăng theo số lượng thao tác tệp cho chỉ mục Lucene (phân đoạn).
  8. Kích hoạt ghi nhật ký truy vấn chậm sẽ giúp xác định truy vấn nào chậm và những gì có thể được thực hiện để cải thiện chúng, đặc biệt hữu ích cho các truy vấn ký tự đại diện.
  9. Tăng kích thước ulimit để cho phép các tệp tối đa.
  10. Hiệu suất của FlexSearch có thể bị ảnh hưởng khi HĐH quyết định trao đổi bộ nhớ ứng dụng không sử dụng. Vô hiệu hóa hoán đổi bằng cách đặt cài đặt cấp độ hệ điều hành hoặc đặt các mục sau trong cấu hình đàn hồi Tìm kiếm bootstrap.mlockall: true
  11. Vô hiệu hóa xóa tất cả các chỉ số bằng truy vấn ký tự đại diện. Để đảm bảo rằng ai đó không phát hành thao tác XÓA trên tất cả các chỉ mục (* hoặc _all), hãy đặt action.destrively_Vquires_name thành true.

Trước khi kết thúc, đây là danh sách các url hữu ích để xem các số liệu.

  • / _cluster / Health? khá: Dành cho chỉ số sức khỏe của cụm.
  • / _status? beautiful: Dành cho tất cả thông tin về tất cả các chỉ số.
  • / _nodes? beautiful: Dành cho tất cả thông tin về các nút.
  • / _cat / master? beautiful: Dành cho nút chính.
  • / _stats? beautiful: Để phân bổ shard, chỉ số thống kê.
  • / _nodes / stats? beautiful: Đối với các thống kê nút riêng lẻ, bao gồm các thống kê jvm, http, io cho nút.

Tổng hợp số liệu của Elaticsearch được hỗ trợ bởi hầu hết các công cụ giám sát hệ thống như Datadog, TICK. Nên sử dụng các công cụ như vậy và việc tạo phễu rất được khuyến khích để theo dõi liên tục Elaticsearch.

Phần kết luận:

Elaticsearch là một công cụ tìm kiếm và phân tích toàn văn bản phân tán, cho phép nhiều người thuê tìm kiếm thông qua toàn bộ bộ dữ liệu của họ, bất kể kích thước, với tốc độ chưa từng có. Ngoài các khả năng tìm kiếm toàn văn bản của nó, ElasticSearch tăng gấp đôi như một hệ thống phân tích và cơ sở dữ liệu phân tán. ElasticSearch có mặc định tuyệt vời để bắt đầu. Nhưng một khi đã qua giai đoạn thử nghiệm ban đầu, bạn phải dành một chút thời gian để điều chỉnh các cài đặt cho nhu cầu của mình. Bạn nên xem lại cấu hình của mình sau đó, cùng với tài liệu chính thức, để đảm bảo rằng cụm của bạn được cấu hình để đáp ứng nhu cầu của bạn.