Hướng dẫn hoàn chỉnh về ELK Stack (P3) - Elasticsearch

Loạt bài viết trong hướng dẫn hoàn chỉnh về ELK Stack:

Elasticsearch là gì?

Elasticsearch là trung tâm của nền tảng phân tích log phổ biến nhất thế giới ngày nay - ELK Stack (Elasticsearch, LogstashKibana). Vai trò của Elasticsearch là trung tâm đến mức nó đã trở thành đồng nghĩa với tên của chính ngăn xếp. Được sử dụng chủ yếu để tìm kiếm và phân tích log, Elasticsearch ngày nay là một trong những hệ thống cơ sở dữ liệu phổ biến nhất hiện nay.

Được phát hành lần đầu vào năm 2010, Elasticsearch là một công cụ phân tích và tìm kiếm hiện đại dựa trên Apache Lucene. Hoàn toàn mã nguồn mở và được xây dựng bằng Java, Elasticsearch được phân loại là cơ sở dữ liệu NoSQL.

Elasticsearch lưu trữ dữ liệu bán cấu trúc hoặc không có cấu trúc và cho đến gần đây, bạn không thể truy vấn dữ liệu bằng SQL. Dự án Elasticsearch SQL mới sẽ cho phép sử dụng các câu lệnh SQL để tương tác với dữ liệu. Bạn có thể đọc thêm về điều đó trong bài viết này.

Tuy nhiên, không giống như hầu hết các cơ sở dữ liệu NoSQL, Elasticsearch tập trung mạnh vào các khả năng và tính năng tìm kiếm - trên thực tế, cách dễ nhất để lấy dữ liệu từ Elasticsearch là tìm kiếm nó bằng cách sử dụng REST API mở rộng của nó.

Trong bối cảnh phân tích dữ liệu, Elasticsearch được sử dụng cùng với các thành phần khác trong ELK Stack, Logstash và Kibana, đồng thời đóng vai trò lập chỉ mục và lưu trữ dữ liệu.

Đọc thêm về cài đặt và sử dụng Elasticsearch trong hướng dẫn Elasticsearch của chúng tôi.

Các khái niệm Elasticsearch cơ bản

Elasticsearch là một hệ thống phức tạp và nhiều tính năng. Không thể chi tiết và đi sâu vào từng đai ốc và bu lông của nó. Tuy nhiên, có một số khái niệm và thuật ngữ cơ bản mà tất cả người dùng Elasticsearch nên học và làm quen. Dưới đây là sáu khái niệm "phải biết" để bắt đầu.

Index

Elasticsearch Indices là các phân vùng logic của tài liệu và có thể được so sánh với một cơ sở dữ liệu trong thế giới cơ sở dữ liệu quan hệ.

Tiếp tục ví dụ về ứng dụng thương mại điện tử của chúng tôi, bạn có thể có một index chứa tất cả dữ liệu liên quan đến sản phẩm và một index khác chứa tất cả dữ liệu liên quan đến khách hàng.

Bạn có thể có bao nhiêu index được định nghĩa trong Elasticsearch tùy thích nhưng điều này có thể ảnh hưởng đến hiệu suất.

Các index được xác định bằng tên viết thường được sử dụng khi thực hiện các hành động khác nhau (chẳng hạn như tìm kiếm và xóa) đối với các tài liệu bên trong mỗi index.

Document

Document là các đối tượng JSON được lưu trữ trong index Elasticsearch và được coi là đơn vị lưu trữ cơ sở. Trong thế giới của cơ sở dữ liệu quan hệ, document có thể được so sánh với một hàng trong bảng.

Trong ví dụ về ứng dụng thương mại điện tử của chúng tôi, bạn có thể có một document cho mỗi sản phẩm hoặc một document cho mỗi đơn đặt hàng. Không có giới hạn về số lượng document bạn có thể lưu trữ trong một index cụ thể.

Dữ liệu trong document gồm các trường bao gồm các khóa và giá trị. Khóa là tên của trường và giá trị có thể là một phần tử thuộc nhiều kiểu khác nhau, chẳng hạn như một chuỗi, một số, một biểu thức boolean, một đối tượng khác hoặc một mảng giá trị.

Document cũng chứa các trường dành riêng tạo thành siêu dữ liệu document như _index, _type_id.

Type

Type trong Elasticsearch được sử dụng trong document để chia nhỏ các kiểu dữ liệu tương tự, trong đó mỗi type đại diện cho một loại document duy nhất. Type bao gồm tên và ánh xạ (xem bên dưới) và được sử dụng bằng cách thêm trường _type. Sau đó, trường này có thể được sử dụng để lọc khi truy vấn một type cụ thể.

Type đang dần bị xóa khỏi Elasticsearch. Bắt đầu với Elasticsearch 6, index chỉ có thể có một kiểu ánh xạ. Bắt đầu từ phiên bản 7.x, việc chỉ định kiểu trong yêu cầu không còn được dùng nữa. Bắt đầu từ phiên bản 8.x, việc chỉ định kiểu trong yêu cầu sẽ không còn được hỗ trợ nữa.

Mapping

Giống như một lược đồ trong thế giới cơ sở dữ liệu quan hệ, mapping xác định các kiểu khác nhau nằm trong một index. Nó xác định các trường cho các document thuộc một kiểu dữ liệu cụ thể (chẳng hạn như chuỗi và số nguyên) và cách các trường nên được lập chỉ mục và lưu trữ trong Elasticsearch.

Mapping có thể được xác định rõ ràng hoặc được tạo tự động khi một document được lập chỉ mục bằng cách sử dụng các template. (Các template bao gồm các cài đặt và ánh xạ có thể được áp dụng tự động cho một index mới.)

Shard

Kích thước index là nguyên nhân phổ biến của sự cố Elasticsearch. Vì không có giới hạn về số lượng document bạn có thể lưu trữ trên mỗi index, một index có thể chiếm dung lượng đĩa vượt quá giới hạn của máy chủ lưu trữ. Ngay sau khi một index đạt đến giới hạn này, việc lập chỉ mục sẽ bắt đầu không thành công.

Một cách để giải quyết vấn đề này là chia các index theo chiều ngang thành các phần được gọi là phân đoạn (shard). Điều này cho phép bạn phân phối các hoạt động trên các phân đoạn và các nút để cải thiện hiệu suất. Bạn có thể kiểm soát số lượng phân đoạn trên mỗi index và lưu trữ các phân đoạn “giống như index” này trên bất kỳ nút nào trong cụm Elasticsearch của bạn.

Replica

Để cho phép bạn dễ dàng khôi phục sau các lỗi hệ thống như thời gian ngừng hoạt động không mong muốn hoặc sự cố mạng, Elasticsearch cho phép người dùng tạo bản sao của các phân đoạn được gọi là bản sao (replica).

Bởi vì các bản sao được thiết kế để đảm bảo tính khả dụng cao, chúng không được phân bổ trên cùng một nút với phân đoạn mà chúng được sao chép từ đó. Tương tự như phân đoạn, số lượng bản sao có thể được xác định khi tạo chỉ mục nhưng cũng có thể thay đổi ở giai đoạn sau.

Để biết thêm thông tin về các thuật ngữ này và các khái niệm Elasticsearch bổ sung, hãy đọc bài viết 10 Khái niệm Elasticsearch bạn cần tìm hiểu.

Truy vấn Elasticsearch

Elasticsearch được xây dựng trên Apache Lucene và sử dụng cú pháp truy vấn của Lucene. Làm quen với cú pháp và các toán tử khác nhau của nó sẽ giúp bạn truy vấn Elasticsearch một cách lâu dài.

Toán tử Boolean

Như với hầu hết các ngôn ngữ máy tính, Elasticsearch hỗ trợ toán tử AND, OR và NOT:

  • jack AND jill - Sẽ trả về các document chứa cả jack và jill.
  • ahab NOT moby - Sẽ trả về các document có chứa ahab nhưng không phải moby.
  • tom OR jerry - Sẽ trả về các document có tom hoặc jerry, hoặc cả hai.

Field

Bạn có thể đang tìm kiếm các document trong đó một trường cụ thể chứa các thuật ngữ nhất định. Bạn chỉ định điều đó như sau:

  • name: "Ned Stark"

Range

Bạn có thể tìm kiếm các trường trong một phạm vi cụ thể, sử dụng dấu ngoặc vuông cho các tìm kiếm trong phạm vi bao gồm và dấu ngoặc nhọn cho các tìm kiếm trong phạm vi riêng:

  • age:[3 TO 10] - Sẽ trả về các document có độ tuổi từ 3 đến 10
  • price:{100 TO 400} - Sẽ trả lại các document có giá từ 101 đến 399
  • name:[Adam TO Ziggy] - Sẽ trả về các tên ở giữa và bao gồm cả Adam và Ziggy

Ký tự đại diện, Regexes và Tìm kiếm mờ

Một tìm kiếm sẽ không phải là một tìm kiếm nếu không có các ký tự đại diện. Bạn có thể sử dụng ký tự * cho nhiều ký tự đại diện hoặc ký tự ? cho các ký tự đại diện đơn.

URI Tìm kiếm

Cách dễ nhất để tìm kiếm cụm Elasticsearch của bạn là thông qua URI tìm kiếm. Bạn có thể chuyển một truy vấn đơn giản đến Elasticsearch bằng cách sử dụng tham số truy vấn q. Truy vấn sau sẽ tìm kiếm toàn bộ cụm của bạn cho các tài liệu có trường tên bằng “travis”:

curl “localhost:9200/_search?q=name: travis”

Kết hợp với cú pháp Lucene, bạn có thể xây dựng các tìm kiếm khá ấn tượng. Thông thường, bạn sẽ phải mã hóa các ký tự URL, chẳng hạn như dấu cách (nó được bỏ qua trong các ví dụ này để rõ ràng):

curl “localhost:9200/_search?q=name:john~1 AND (age:[30 TO 40} OR surname:K*) AND -city”

Một số tùy chọn có sẵn cho phép bạn tùy chỉnh URI tìm kiếm, cụ thể về việc sử dụng trình phân tích (analyzer), truy vấn chịu lỗi (lenient) và giải thích về điểm số (explain).

Mặc dù URI tìm kiếm là một cách đơn giản và hiệu quả để truy vấn cụm của bạn, nhưng bạn sẽ nhanh chóng nhận thấy rằng nó không hỗ trợ tất cả các tính năng mà Elasticsearch cung cấp cho bạn.

Toàn bộ sức mạnh của Elasticsearch được bộc lộ thông qua Request Body Search. Sử dụng Request Body Search cho phép bạn tạo một yêu cầu tìm kiếm phức tạp bằng cách sử dụng các phần tử và mệnh đề truy vấn khác nhau sẽ khớp, lọc và sắp xếp thứ tự cũng như thao tác các document dựa trên nhiều tiêu chí.

Bạn có thể tìm thấy thêm thông tin về Tìm kiếm nội dung yêu cầu trong Elasticsearch, Truy vấn DSL và các ví dụ trong: Truy vấn Elasticsearch: Hướng dẫn chi tiết của chúng tôi.

Elasticsearch REST API

Một trong những điều tuyệt vời về Elasticsearch là REST API mở rộng cho phép bạn tích hợp, quản lý và truy vấn dữ liệu được lập chỉ mục theo vô số cách khác nhau. Ví dụ về việc sử dụng API này để tích hợp với dữ liệu Elasticsearch rất phong phú, bao gồm các công ty và trường hợp sử dụng khác nhau.

Tương tác với API rất dễ dàng - bạn có thể sử dụng bất kỳ ứng dụng HTTP client nào nhưng Kibana đi kèm với một công cụ tích hợp có tên là Console có thể được sử dụng cho mục đích này.

Sử dụng Elasticsearch Rest API trong Kibana

Để nắm bắt các REST API của Elasticsearch, cần một quá trình học tập. Để bắt đầu, hãy đọc các quy ước API, tìm hiểu về các tùy chọn khác nhau có thể được áp dụng cho các lệnh gọi, cách tạo các API và cách lọc các phản hồi. Một điều tốt cần nhớ là một số API thay đổi và không được dùng nữa từ phiên bản này sang phiên bản khác, và đó là phương pháp hay nhất để tiếp tục theo dõi các thay đổi.

Dưới đây là một số REST API của Elasticsearch phổ biến nhất đáng để nghiên cứu. Các ví dụ sử dụng có sẵn trong bài viết Elasticsearch API 101. Tất nhiên, tài liệu chính thức của Elasticsearch cũng là một tài nguyên quan trọng.

Elasticsearch Document API

Loại API này được sử dụng để xử lý document trong Elasticsearch. Ví dụ: khi sử dụng các API này, bạn có thể tạo document trong một index, cập nhật chúng, chuyển chúng sang một index khác hoặc xóa chúng.

API tìm kiếm Elasticsearch

Như tên gọi của nó, các lệnh gọi API này có thể được sử dụng để truy vấn dữ liệu được lập chỉ mục để biết thông tin cụ thể. API tìm kiếm có thể được áp dụng trên toàn cầu, trên tất cả các chỉ mục và loại có sẵn hoặc cụ thể hơn là trong một chỉ mục. Câu trả lời sẽ chứa các kết quả phù hợp với truy vấn cụ thể.

Elasticsearch Search API

Loại API này cho phép người dùng quản lý các index, mapping và template. Ví dụ: bạn có thể sử dụng API này để tạo hoặc xóa một index mới, kiểm tra xem một index cụ thể có tồn tại hay không và xác định mapping mới cho một index.

Elasticsearch Indices API

Đây là các API dành riêng cho từng cụm cho phép bạn quản lý và giám sát cụm Elasticsearch của mình. Hầu hết các API đều cho phép bạn xác định nút Elasticsearch nào sẽ gọi bằng cách sử dụng ID nút nội bộ, tên hoặc địa chỉ của nút.

Các plugin Elasticsearch

Các plugin Elasticsearch được sử dụng để mở rộng chức năng Elasticsearch cơ bản theo nhiều cách khác nhau, cụ thể. Ví dụ: có các plugin bổ sung chức năng bảo mật, cơ chế khám phá và khả năng phân tích cho Elasticsearch.

Bất kể những chức năng nào chúng thêm vào, các plugin Elasticsearch đều thuộc về một trong hai loại sau: plugin cốt lõi hoặc plugin cộng đồng. Plugin cốt lõi được cung cấp như một phần của gói Elasticsearch và được duy trì bởi nhóm Elastic trong khi plugin cộng đồng được phát triển bởi cộng đồng và do đó là các thực thể riêng biệt với các chu kỳ phát triển và lập phiên bản riêng.

Danh mục plugin

  • API Extension
  • Alerting
  • Analysis
  • Discovery
  • Ingest
  • Management
  • Mapper
  • Security
  • Snapshot/Restore
  • Store

Cài đặt các plugin Elasticsearch

Việc cài đặt các plugin cốt lõi rất đơn giản và được thực hiện bằng trình quản lý plugin. Trong ví dụ dưới đây, tôi sẽ cài đặt plugin EC2 Discovery. Plugin này truy vấn API AWS để biết danh sách các phiên bản EC2 dựa trên các thông số mà bạn xác định trong cài đặt plugin:

cd /usr/share/elasticsearch
sudo bin/elasticsearch-plugin install discovery-ec2

Các plugin phải được cài đặt trên mọi nút trong cụm và mỗi nút phải được khởi động lại sau khi cài đặt.

Để xóa plugin, hãy sử dụng lệnh:

sudo bin/elasticsearch-plugin remove discovery-ec2

Các plugin cộng đồng hơi khác một chút vì mỗi plugin có hướng dẫn cài đặt khác nhau.

Một số plugin cộng đồng được cài đặt giống như các plugin cốt lõi nhưng yêu cầu các bước cấu hình Elasticsearch bổ sung.

Cái gì tiếp theo?

Chúng tôi đã mô tả Elasticsearch, nêu chi tiết một số khái niệm cốt lõi của nó và giải thích REST API. Để tiếp tục tìm hiểu về Elasticsearch, đây là một số tài nguyên bạn có thể thấy hữu ích:

ELK StackDevOpsElasticsearch
Bài Viết Liên Quan:
Khắc phục sự cố 5 lỗi ELK thường gặp
Trung Nguyen 10/07/2021
Khắc phục sự cố 5 lỗi ELK thường gặp

Trong bài viết này chúng tôi đã tổng hợp 5 lỗi ELK phổ biến nhất và hướng dẫn bạn cách khắc phục chúng một cách nhanh chóng.

5 sai lầm hàng đầu với Elasticsearch và cách tránh
Trung Nguyen 09/07/2021
5 sai lầm hàng đầu với Elasticsearch và cách tránh

Trong hướng dẫn này, chúng ta hãy xem xét kỹ hơn 5 trong số những sai lầm phổ biến và cách bạn có thể tránh mắc phải chúng.

10 khái niệm Elasticsearch bạn cần biết
Trung Nguyen 04/07/2021
10 khái niệm Elasticsearch bạn cần biết

Bài viết này cung cấp cho bạn 10 khái niệm quan trọng nhất trong Elasticsearch. Nắm được những khái niệm này giúp bạn bớt vất vả hơn khi học Elasticsearch.

Truy vấn Elasticsearch - Hướng dẫn chi tiết
Trung Nguyen 04/07/2021
Truy vấn Elasticsearch - Hướng dẫn chi tiết

Trong hướng dẫn này, chúng tôi sẽ giúp bạn các cách viết truy vấn Elasticsearch đầy đủ, chi tiết nhất. Giúp bạn tự tin khi làm việc với Elasticsearch.