Nếu bạn đang tìm kiếm một giải pháp tìm kiếm mạnh mẽ và linh hoạt cho dự án, hoặc một bộ công cụ hỗ trợ việc logging hệ thống có nhiều service khác nhau? Với Elasticsearch - một hệ thống tìm kiếm và phân tích dữ liệu mã nguồn mở, được thiết kế đặc biệt để xử lý, tìm kiếm và hiển thị dữ liệu lớn, tốc độ nhanh chóng.
1. Tổng quan về Elasticsearch
1.1 Elasticsearch là gì?
Elasticsearch là một công cụ dựa trên phần mềm Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công cụ với một giao diện web HTTP có hỗ trợ dữ liệu JSON. Elasticsearch được phát triển bằng Java và được phát hành dạng mã nguồn mở theo giấy phép Apache.
Elasticsearch is a distributed,
Ngoài ra, ES cũng được xem là một document oriented database. Nhiệm vụ của nó chính là store và retrieve document. Trong ES, tất cả các document được hiển thị trong JSON format. Nó được xây dựng trên Lucene – phần mềm tìm kiếm và trả về thông tin với hơn 15 năm kinh nghiệm về full text indexing and searching.
Khi nhắc đến Elasticsearch, chúng ta có thể nhớ các đặc điểm cơ bản sau:
- JSON based data: hệ thống sử dụng cơ sở dữ liệu noSQL để lưu trữ và truy vấn dữ liệu, tập trung vào việc tối ưu hóa hiệu suất tìm kiếm. Điều này đảm bảo rằng Elasticsearch có thể cung cấp kết quả tìm kiếm chính xác trong thời gian gần như thời gian thực, ngay cả trên tập dữ liệu lớn.
- RESTful APIs: Elasticsearch cũng cung cấp một giao diện RESTful API, cho phép các ứng dụng và dịch vụ khác có thể tương tác với nó một cách dễ dàng. Điều này làm cho việc tích hợp Elasticsearch vào các ứng dụng hiện có trở nên rất linh hoạt và thuận tiện.
- Multi data resources: Dữ liệu có thể lấy từ nhiều nguồn khác nhau. Đó có thể là Logs từ ứng dụng, Metrics hệ thống hoặc bất nguồn kỳ dữ liệu với bất kỳ loại dữ liệu nào đến từ bất kỳ ứng dụng khác nhau.
1.2 Tại sao cần sử dụng Elasticsearch?
Hiện nay Elasticsearch được sử dụng phổ biến và chủ yếu cho 2 loại yêu cầu tác vụ khác nhau nhưng cũng không kém phần quan trọng trong các hệ thống:
1.2.1 Tìm kiếm
Hiện nay các hệ thống website hoặc phần mềm thì tác vụ tìm kiếm là một tác vụ cực kỳ quan trọng đặc biệt là trong các ứng dụng thương mại điện tử. Việc tìm kiếm các sản phẩm với độ chính xác và tốc độ cao dường như được chú trọng và quan tâm hơn đến trải nghiệm người dùng.
Khi mà trước đây các lập trình viên có thể sử dụng cách truyền thống bằng cách query trực tiếp vào cơ sở dữ liệu tuy nhiên hiện nay công việc này dường như trở nên chậm chạp và kém hiệu quả.
Đặc biệt là khi thực hiện việc tìm kiếm với các kiểu ngôn ngữ có dấu như tiếng Việt hoặc tìm kiếm theo keyword thì Elasticsearch nổi lên như một giải pháp tối ưu.
Nếu search bằng truy vấn SQL như LIKE
%one%
thì kết quả sẽ chỉ cần chứa one
là ra. Ví dụ: phone
, zone
, money
, alone
… nói chung sẽ là 1 list kết quả không mong muốn.Khi search bằng ES thì gõ
one
sẽ chỉ có one
được trả về mà thôi. Truy vấn LIKE không thể truy vấn từ có dấu. Ví dụ: từ khoá có dấu là có
, nếu truy vấn LIKE chỉ gõ co
thì sẽ không trả về được chính xác kết quả.Về perfomance thì ES sẽ là tốt hơn, truy vấn LIKE sẽ tìm kiếm đơn thuần toàn văn bản không sử dụng index, nghĩa là tập dữ liệu càng lớn thì tìm kiếm càng lâu, trong khi ES lại “đánh index” cho các trường được chọn để tìm kiếm.
1.2.2 Ghi nhật ký
ELK Stack đáp ứng một nhu cầu trong lĩnh vực phân tích bản ghi. Khi ngày càng nhiều cơ sở hạ tầng CNTT của bạn chuyển sang các đám mây công cộng, bạn cần một giải pháp quản lý và phân tích nhật ký để giám sát cơ sở hạ tầng này cũng như xử lý mọi nhật ký máy chủ, nhật ký ứng dụng và đường dẫn nhấp chuột.
ELK Stack cung cấp một giải pháp phân tích bản ghi tuy đơn giản nhưng lại vô cùng hiệu quả cho các nhà phát triển và kỹ sư DevOps để giúp họ thu thập những thông tin chi tiết giá trị về chẩn đoán lỗi, hiệu suất ứng dụng và giám sát cơ sở hạ tầng - với mức giá vô cùng phải chăng.
1.3 Đặc điểm Elasticsearch
1.3.1 Data in: documents and indices
Elaticsearch lưu trữ các cấu trúc dữ liệu phức tạp đã được tuần tự hóa dưới dạng tài liệu JSON. Khi một tài liệu được lưu trữ, nó sẽ được lập chỉ mục và có thể tìm kiếm đầy đủ trong thời gian gần như thực trong vòng
~1 giây
.Elasticsearch sử dụng một cấu trúc dữ liệu gọi là inverted index, hỗ trợ tìm kiếm full-text nhanh chóng. Inverted index liệt kê mọi từ duy nhất xuất hiện trong bất kỳ tài liệu nào và xác định tất cả các tài liệu có chứa từng từ đó.
1.3.2 Information out: search and analyze
- Search
Ngoài việc tìm kiếm các cụm từ riêng lẻ, bạn có thể thực hiện tìm kiếm cụm từ, tìm kiếm tương tự và tìm kiếm tiền tố cũng như nhận các đề xuất tự động hoàn thành.
Khi có dữ liệu không gian địa lý hoặc số khác mà bạn muốn tìm kiếm, Elaticsearch lập chỉ mục dữ liệu phi văn bản trong các cấu trúc dữ liệu được tối ưu hóa hỗ trợ các truy vấn số và địa lý hiệu suất cao.
- Analyze
Tính năng tổng hợp của Elaticsearch cho phép bạn xây dựng các bản tóm tắt phức tạp về dữ liệu của mình và hiểu rõ hơn về các số liệu, mẫu và xu hướng chính. Thay vì chỉ tìm câu tục ngữ “mò kim đáy bể”, việc tổng hợp cho phép bạn trả lời các câu hỏi như:
- Có bao nhiêu cây kim trong đống cỏ khô?
- Chiều dài trung bình của kim là bao nhiêu?
- Chiều dài trung bình của kim được chia theo nhà sản xuất là bao nhiêu?
- Có bao nhiêu cây kim được thêm vào đống cỏ khô trong sáu tháng vừa qua?
Bạn cũng có thể sử dụng phép tổng hợp để trả lời các câu hỏi tinh tế hơn, chẳng hạn như:
- Nhà sản xuất kim phổ biến nhất của bạn là gì?
- Có bất kỳ cụm kim bất thường hoặc bất thường nào không?
Điều này cho phép bạn phân tích và trực quan hóa dữ liệu của mình trong thời gian thực. Báo cáo và trang tổng quan của bạn cập nhật khi dữ liệu của bạn thay đổi để bạn có thể thực hiện hành động dựa trên thông tin mới nhất.
1.3.3 Scalability and resilience: clusters, nodes, and shards
Chỉ mục Elaticsearch thực sự chỉ là một nhóm tập hợp của một hoặc nhiều phân đoạn vật lý, trong đó mỗi phân đoạn (shard) thực sự là một chỉ mục độc lập. Bằng cách phân phối tài liệu (document) trong một chỉ mục (index) trên nhiều phân đoạn và phân phối các phân đoạn đó trên nhiều nút (nodes).
Elaticsearch có thể đảm bảo tính dự phòng, vừa bảo vệ khỏi lỗi phần cứng vừa tăng khả năng truy vấn khi các nút được thêm vào một cụm (cluster). Khi cụm phát triển (hoặc co lại), Elaticsearch sẽ tự động di chuyển các phân đoạn (shard) để cân bằng lại cụm.
1.4 Các khái niệm trong Elasticsearch
1.4.1 Indexes
- Index trong Elasticsearch là một tập hợp các tài liệu có tính chất tương tự (có cùng các trường hoặc field).
- Mỗi index có thể được coi như một cơ sở dữ liệu nhỏ trong hệ thống Elasticsearch.
- Index được sử dụng để tìm kiếm, lọc và lưu trữ dữ liệu. Một cơ sở dữ liệu có thể bao gồm nhiều index.
1.4.2 Types
- Trước Elasticsearch phiên bản
7.x
, một index có thể chứa nhiều loại (type) khác nhau. Mỗi loại định nghĩa cấu trúc của các document trong index.
- Mỗi loại chứa các field (trường) khác nhau. Ví dụ, một index có thể có loại "user" và loại "blog", mỗi loại sẽ có cấu trúc dữ liệu riêng.
1.4.1 Documents
- Document là dữ liệu cơ bản mà Elasticsearch lưu trữ và tìm kiếm.
- Document thường được biểu diễn dưới dạng JSON (JavaScript Object Notation).
- Ví dụ: Trong một index chứa thông tin người dùng, mỗi người dùng sẽ được biểu diễn bằng một document.
1.4.1 Fields
- Field là các thành phần cơ bản của một document. Chúng là các thuộc tính hoặc trường thông tin về một document.
- Mỗi field có thể chứa một loạt các giá trị như chuỗi ký tự, số, ngày tháng, v.v.
- Ví dụ: Trong một document người dùng, các field có thể bao gồm "name", "age", "email", v.v.
2. Hệ sinh thái ELK stack
ELK Stack là từ viết tắt được sử dụng để mô tả bộ dịch vụ bao gồm 3 dự án phổ biến: Elasticsearch, Logstash và Kibana. Thường được gọi là Elasticsearch, ELK Stack mang tới cho bạn khả năng tổng hợp nhật ký từ tất cả các hệ thống và ứng dụng của bạn, phân tích những nhật ký này, hiển thị dữ liệu để giám sát ứng dụng và cơ sở hạ tầng, khắc phục sự cố nhanh hơn, phân tích bảo mật, v.v.
2.1 Các thành phần
2.2.1 Elastic Search
Elasticsearch là công cụ tìm kiếm và phân tích phân tán được xây dựng trên Apache Lucene. Khả năng hỗ trợ đa dạng ngôn ngữ, hiệu suất cao và tài liệu JSON không lược đồ khiến Elasticsearch trở thành một lựa chọn lý tưởng cho nhiều trường hợp sử dụng tìm kiếm và phân tích nhật ký khác nhau.
2.2.2 Beats
Beats là những thành phần gửi dữ liệu nguồn mở mà bạn cài đặt làm đại lý trên máy chủ của mình để gửi dữ liệu vận hành tới Elaticsearch. Các nguồn dữ liệu mà Beats có thể thu thập bao gồm:
- Audit data (Auditbeat)
- Log files and journals (Filebeat)
- Cloud data (Functionbeat)
- Availability (Heartbeat)
- Metrics (Metricbeat)
- Network traffic (Packetbeat)
- Windows event logs (Winlogbeat)
Ngoài ra người dùng cũng có thể tự custom các Beat tuỳ chỉnh dựa vào mã nguồn mở cộng đồng viết bằng ngôn ngữ Golang.
2.2.3 Logstash
Logstash là một công cụ thu nạp dữ liệu nguồn mở cho phép bạn thu thập dữ liệu từ các nguồn khác nhau, chuyển đổi dữ liệu và gửi dữ liệu tới điểm đích bạn muốn. Với các bộ lọc được tạo sẵn và hỗ trợ hơn 200 phần bổ trợ, Logstash cho phép người dùng dễ dàng thu nạp bất kỳ dữ liệu đến từ nguồn hay thuộc loại dữ liệu nào.
2.2.4 Kibana
Kibana là một công cụ hiển thị trực quan và khám phá dữ liệu dành cho hoạt động đánh giá nhật ký và sự kiện. Kibana cung cấp các biểu đồ tương tác dễ sử dụng, những bộ lọc và tập hợp được tạo sẵn cũng như hỗ trợ không gian địa lý, khiến cho công cụ này trở thành lựa chọn ưa thích cho hoạt động hiển thị trực quan dữ liệu được lưu trữ trong Elasticsearch.
2.2 Mô hình hoạt động ELK stack
- Đầu tiên, log sẽ được gửi đến Logstash. (Thông qua nhiều con đường khác nhau, ví dụ như server gửi UDP request chứa log tới URL của Logstash, hoặc Beat đọc file log và gửi lên Logstash)
- Logstash sẽ đọc những log này, thêm những thông tin như thời gian, IP, parse dữ liệu từ log (server nào, độ nghiêm trọng, nội dung log) ra, sau đó ghi xuống database Elasticsearch để tiến hành lập chỉ mục.
- Khi muốn xem log, người dùng vào URL của Kibana. Kibana sẽ đọc thông tin log trong Elasticsearch, hiển thị lên giao diện cho người dùng tiến hành query và xử lý thông tin.
3. Kiến trúc Elasticsearch
3.1 Sơ đồ kiến trúc
Cụm Elaticsearch là một nhóm gồm một hoặc nhiều nút Elaticsearch được kết nối với nhau. Trước tiên chúng ta hãy phác thảo cách nó được trình bày, như thể hiện trong sơ đồ sau:
Mặc dù mỗi nút có mục đích và trách nhiệm riêng nhưng mỗi nút có thể chuyển tiếp các yêu cầu (điều phối) của máy khách đến các nút thích hợp. Sau đây là các nút được sử dụng trong cụm Elaticsearch:
- Master-eligible node:
Nhiệm vụ của nút Master chủ yếu được sử dụng cho các hoạt động nhẹ trên toàn cụm, bao gồm tạo hoặc xóa chỉ mục, theo dõi các nút cụm và xác định vị trí của các phân đoạn được phân bổ.
Theo mặc định, vai trò Master-eligible được bật. Nút Master-eligible có thể được bầu để trở thành nút chính Master theo quy trình bầu cử chính. Bạn có thể vô hiệu hóa loại vai trò này cho một nút bằng cách đặt node.master thành false trong tệp elasticsearch.yml.
- Data node: Nút dữ liệu chứa dữ liệu chứa các tài liệu được lập chỉ mục. Nó xử lý các hoạt động liên quan như CRUD, tìm kiếm và tổng hợp. Theo mặc định, vai trò nút dữ liệu được bật và bạn có thể vô hiệu hóa vai trò đó cho một nút bằng cách đặt node.data thành false trong tệp elasticsearch.yml.
- Ingest node: Sử dụng Ingest node là một cách để xử lý tài liệu ở chế độ đường dẫn trước khi lập chỉ mục tài liệu. Theo mặc định, vai trò Ingest node được bật—bạn có thể tắt vai trò đó cho một nút bằng cách đặt node.ingest thành false trong tệp elasticsearch.yml.
- Coordinating-only node: Nếu cả ba vai trò (master eligible, data, và ingest) đều bị tắt, nút sẽ chỉ hoạt động như một nút phối hợp thực hiện các yêu cầu định tuyến, xử lý giai đoạn giảm tìm kiếm và phân phối công việc thông qua lập chỉ mục hàng loạt.
3.2 Cách ES đánh index và lưu trữ dữ liệu
3.2.1 Quản lý Index
Trong Elaticsearch, chỉ mục tương tự như cơ sở dữ liệu trong thế giới cơ sở dữ liệu quan hệ. Đó là nơi dữ liệu của bạn được lưu trữ. Bạn có thể tạo, xóa và quản lý chỉ mục thông qua API Elaticsearch. Ví dụ:
- Create Index:
- Delete Index:
3.2.2 Mappers - dynamic and static
Elaticsearch sử dụng cơ chế gọi là "Mappers" để ánh xạ dữ liệu trong tài liệu tới các trường có liên quan trong chỉ mục. Có hai loại ánh xạ:
- Dynamic Mapping: Elaticsearch có thể tự động phát hiện loại dữ liệu của các trường và tạo ánh xạ cho chúng. Điều này rất hữu ích để nhanh chóng lập chỉ mục dữ liệu mới, nhưng điều quan trọng là phải thận trọng vì nó có thể không phải lúc nào cũng ánh xạ chính xác các trường.
- Static Mapping: Điều này liên quan đến việc xác định rõ ràng các ánh xạ trước khi lập chỉ mục bất kỳ tài liệu nào. Điều này cho phép bạn kiểm soát nhiều hơn các loại dữ liệu và cài đặt cho từng trường.
3.2.3 Analyzer and Tokenizer
Trình phân tích (Analyzer) được sử dụng trong quá trình lập chỉ mục để chia văn bản thành các thuật ngữ hoặc mã thông báo riêng lẻ. Trình mã thông báo (Tokenizer) là một loại trình phân tích cụ thể giúp phân chia văn bản thành các thuật ngữ dựa trên một bộ quy tắc đã xác định.
- Standard Analyzer (default): Token hóa văn bản thành các thuật ngữ viết thường và xóa dấu câu. Ví dụ: "Quick Brown Fox!" sẽ được tách thành "quick", "brown", and "fox".
- Whitespace Analyzer: Tách văn bản thành các thuật ngữ bất cứ khi nào nó gặp khoảng trắng.
- Custom Analyzers: Bạn cũng có thể tạo bộ phân tích tùy chỉnh bằng cách sử dụng kết hợp bộ mã thông báo và bộ lọc để đáp ứng các yêu cầu cụ thể.
3.2.4 Querying với DSL
Elaticsearch sử dụng truy vấn mạnh mẽ tuỳ chỉnh theo miền với DSL (Domain Specific Language) giúp truy vấn và tìm kiếm các chỉ mục của nó. Đó là ngôn ngữ dựa trên JSON cho phép bạn chỉ định nhiều loại truy vấn. Ví dụ:
- Match Query:
- Bool Query (combining queries):
- Filter Query (for exact matches):
- Range Query (to find values within a range):
Đây chỉ là vài ví dụ. DSL rất linh hoạt và cho phép thực hiện các truy vấn, tổng hợp phức tạp,... Hãy nhớ điều chỉnh những ví dụ này cho phù hợp với cấu trúc và yêu cầu chỉ mục cụ thể của bạn.
4. Tổng kết
Tóm lại, Elasticsearch không chỉ đơn thuần là một cơ sở dữ liệu, mà còn là một nền tảng phân tán mạnh mẽ cho việc tìm kiếm và phân tích dữ liệu lớn. Khả năng tìm kiếm nhanh chóng và khả năng phân tích đa dạng giúp Elasticsearch trở thành công cụ quan trọng trong việc khai thác thông tin từ các tập dữ liệu phức tạp.
Bên cạnh đó, ELK Stack (Elasticsearch, Logstash và Kibana) cung cấp một giải pháp toàn diện cho việc thu thập, xử lý và trực quan hóa dữ liệu. Với khả năng kết hợp mạnh mẽ giữa các thành phần, ELK Stack mang lại khả năng theo dõi, phân tích và quản lý dữ liệu một cách dễ dàng và hiệu quả hơn bao giờ hết.