0

Elasticsearch Bài học 1: Elasticsearch là gì? Tại sao các hệ thống lớn không thể thiếu nó?

Khi thiết kế backend cho một hệ thống e-commerce với hàng triệu SKU hoặc xử lý luồng dữ liệu khổng lồ từ các hệ thống logistics, bạn chắc chắn đã hoặc sẽ đối mặt với giới hạn của cơ sở dữ liệu quan hệ (RDBMS). Hãy tưởng tượng việc chạy một câu lệnh SELECT * FROM products WHERE name LIKE '%sữa rửa mặt%' trên bảng MySQL chứa 10 triệu bản ghi. Cơ sở dữ liệu sẽ phải quét toàn bộ bảng (full table scan), ngốn sạch CPU và khiến các request API khác bị treo cứng.

Đó chính là lúc Elasticsearch bước vào và thay đổi hoàn toàn cục diện kiến trúc hệ thống.

1. Elasticsearch thực chất là gì?

Về bản chất, Elasticsearch là một công cụ tìm kiếm và phân tích dữ liệu phân tán (distributed search and analytics engine), mã nguồn mở, được xây dựng dựa trên thư viện Apache Lucene.

Thay vì lưu dữ liệu dưới dạng các bảng có quan hệ ràng buộc khắt khe như MySQL hay PostgreSQL, Elasticsearch lưu trữ dữ liệu dưới dạng các tài liệu JSON độc lập (NoSQL). Nó giao tiếp hoàn toàn thông qua RESTful API, nghĩa là bạn có thể dùng bất cứ ngôn ngữ nào (PHP, Golang, Node.js...) để tương tác với nó chỉ bằng các method HTTP cơ bản (GET, POST, PUT, DELETE).

2. Nỗi đau của Cơ sở dữ liệu quan hệ (RDBMS) trong bài toán tìm kiếm

Các database như MySQL hay PostgreSQL sinh ra để đảm bảo tính toàn vẹn dữ liệu (ACID) và xử lý các giao dịch (Transaction), chứ không tối ưu cho việc tìm kiếm văn bản tự do (Full-text search).

  • Hiệu năng thảm họa với LIKE: B-Tree Index của MySQL chỉ hoạt động tốt khi bạn tìm từ trái sang phải (ví dụ: LIKE 'iphone%'). Nếu bạn dùng %iphone%, index vô tác dụng.

  • Không có khái niệm "Điểm liên quan" (Relevance Score): RDBMS chỉ trả lời "Có" hoặc "Không" chứa từ khóa. Nó không biết cách sắp xếp sản phẩm nào sát với ý định tìm kiếm của người dùng nhất lên đầu.

  • Không hỗ trợ tìm kiếm mờ (Fuzzy Search): Khách hàng gõ sai lỗi chính tả "kem chong nang" thay vì "kem chống nắng", MySQL sẽ trả về kết quả rỗng (0 rows). Điều này đồng nghĩa với việc rớt tỷ lệ chuyển đổi (Conversion Rate) trong E-commerce.

Elasticsearch giải quyết triệt để những vấn đề này bằng một cấu trúc dữ liệu cốt lõi gọi là Inverted Index (sẽ được mổ xẻ chi tiết ở Bài 8).

3. Tại sao hệ thống lớn không thể sống thiếu Elasticsearch?

Không phải tự nhiên mà Elasticsearch luôn có mặt trong các bản thiết kế System Design của những hệ thống chịu tải cao. Dưới đây là 3 "mỏ vàng" mà nó mang lại:

A. E-commerce & Full-text Search (Tìm kiếm sản phẩm cực tốc)

Tìm kiếm là linh hồn của các nền tảng thương mại điện tử. Elasticsearch cho phép:

  • Fuzzy Match: Gõ sai chính tả, thiếu dấu vẫn ra đúng sản phẩm.

  • Faceted Search: Bộ lọc động siêu tốc theo giá, thương hiệu, đánh giá, danh mục mà không cần những câu JOIN nặng nề.

  • Xếp hạng thông minh (Scoring): Sản phẩm bán chạy, tồn kho nhiều, hoặc có tỷ suất lợi nhuận cao có thể được "boost" (đẩy) lên đầu kết quả tìm kiếm.

B. Centralized Logging (Quản lý Log tập trung trong Microservices)

Khi hệ thống được chia nhỏ thành nhiều microservices viết bằng nhiều ngôn ngữ khác nhau (ví dụ: Core API chạy Golang, phần Frontend cho Admin chạy Node.js, hệ thống queue chạy PHP/Laravel), việc mò mẫm đọc file .log trên từng server là một ác mộng.

  • Elasticsearch kết hợp cùng Logstash và Kibana tạo thành ELK Stack.

  • Toàn bộ log từ mọi container/server được đẩy về một chỗ. Bạn có thể tìm kiếm lỗi bằng một câu query đơn giản (VD: level: ERROR AND service: "payment-gateway") trong vài mili-giây.

C. System Metrics & Real-time Analytics (Phân tích dữ liệu thời gian thực)

Elasticsearch có khả năng tổng hợp (Aggregations) hàng chục triệu bản ghi để vẽ biểu đồ real-time:

  • Thống kê xem có bao nhiêu lượt API trả về mã lỗi 500 trong 15 phút qua.

  • Phân tích hành vi click chuột hoặc theo dõi trạng thái đơn hàng logistics theo từng khu vực địa lý mà không làm ảnh hưởng đến database chính.

4. Tư duy chuyển đổi: Bảng quy đổi thuật ngữ (RDBMS vs Elasticsearch)

Để làm quen với Elasticsearch, hãy map các khái niệm của nó sang thế giới của cơ sở dữ liệu quan hệ mà bạn đã quen thuộc:

MySQL / PostgreSQL Elasticsearch (ES >= 7.x) Giải thích ngắn gọn
Database Index Nơi chứa các cấu trúc dữ liệu chung một chủ đề (VD: products_index, logs_index).
Table (Đã bị loại bỏ) Từ bản 7.x, Elasticsearch loại bỏ khái niệm "Type" (Table), 1 Index chứa trực tiếp Document.
Row (Dòng) Document Một bản ghi dữ liệu, được lưu dưới format JSON.
Column (Cột) Field Các trường/thuộc tính trong cục JSON (VD: name, price, created_at).
Schema Mapping Bản định nghĩa kiểu dữ liệu cho các Field (VD: field price là số nguyên, name là text).
SQL SELECT Query DSL Ngôn ngữ truy vấn dữ liệu dưới dạng JSON của Elasticsearch.

Elasticsearch không sinh ra để thay thế hoàn toàn MySQL hay PostgreSQL. Nó là mảnh ghép hoàn hảo để giảm tải truy vấn đọc (read-heavy) và xử lý tìm kiếm phức tạp, giúp RDBMS thảnh thơi làm đúng nhiệm vụ lưu trữ core data vững chắc của mình.

Trong Bài 2, chúng ta sẽ bắt tay ngay vào thực hành: Dựng toàn bộ cụm ELK Stack (Elasticsearch & Kibana) chỉ bằng một file Docker Compose cực kỳ gọn nhẹ để chuẩn bị môi trường cho cả series.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí