Hướng dẫn cài đặt và sử dụng OpenSearch với Docker: Tìm kiếm Full-text và Phân tích Log

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Khi câu lệnh SQL LIKE bắt đầu ‘hụt hơi’

Hầu như anh em lập trình nào cũng từng viết những câu truy vấn kiểu SELECT * FROM products WHERE name LIKE '%keyword%'. Khi bảng dữ liệu mới có vài nghìn dòng, database phản hồi trong tích tắc.

Nhưng thử tưởng tượng bảng đạt mốc 10 triệu bản ghi. Một truy vấn LIKE '%...%' sẽ quét toàn bộ bảng (Full Table Scan), ngốn sạch CPU và khiến thời gian phản hồi vọt từ 20ms lên 3 đến 5 giây. Chưa kể khi product owner yêu cầu: ‘Hệ thống phải chịu được lỗi gõ sai chính tả (fuzzy search), gợi ý từ khóa tức thì và gom 50GB log mỗi ngày để debug.’ Lúc này, RDBMS truyền thống không thể gánh nổi nữa.

MySQL hay PostgreSQL rất mạnh về giao dịch ACID (tiền nong, đơn hàng). MongoDB linh hoạt với cấu trúc dữ liệu document biến động. Tuy nhiên, với bài toán tìm kiếm toàn văn bản (full-text search) phức tạp và phân tích log hàng triệu dòng theo thời gian thực, bạn cần một công cụ chuyên biệt. OpenSearch là lựa chọn sáng giá nhất hiện nay.

Khái niệm cốt lõi: OpenSearch hoạt động ra sao?

Hình dung đơn giản: cơ sở dữ liệu quan hệ giống như cuốn sách dày 1.000 trang. Muốn tìm từ nào, bạn phải lật từng trang để đọc. Ngược lại, OpenSearch hoạt động như bảng tra cứu mục lục (Inverted Index) ở cuối sách. Nó ghi sẵn từ khóa ‘Docker’ xuất hiện ở trang 15, 88; từ khóa ‘Cluster’ nằm ở trang 200. Nhờ cơ chế chỉ mục đảo ngược này, dù kho tài liệu lên tới hàng chục triệu bản ghi, OpenSearch vẫn trả kết quả trong 10–30 mili-giây.

Bước ngoặt bản quyền từ Elasticsearch

Nhiều người đã quen với ELK Stack (Elasticsearch, Logstash, Kibana). Đầu năm 2021, Elastic quyết định chuyển giấy phép nguồn mở (Apache 2.0) sang SSPL — một loại giấy phép kép siết chặt việc các nhà cung cấp đám mây đóng gói dịch vụ để kinh doanh thương mại.

Để bảo vệ tính mở của cộng đồng, AWS cùng Red Hat, SAP đã fork nhánh mã nguồn mở cuối cùng (phiên bản 7.10.2) của Elasticsearch và Kibana. Họ phát triển tiếp thành OpenSearch và OpenSearch Dashboards. Dự án hoàn toàn miễn phí, thuộc bản quyền Apache 2.0 và tương thích gần như 100% với REST API của Elasticsearch.

Hai thành phần cốt lõi cần nhớ

  • OpenSearch: Bộ máy lưu trữ, phân tán dữ liệu và thực thi thuật toán tìm kiếm (dựa trên Apache Lucene).
  • OpenSearch Dashboards: Giao diện trực quan trên nền web. Công cụ này giúp bạn vẽ biểu đồ, truy vấn log và giám sát tình trạng cụm node mà không cần gõ API qua curl.

Thực hành: Dựng OpenSearch bằng Docker Compose

Dùng Docker Compose giúp bạn có ngay môi trường thử nghiệm sạch sẽ trong 2 phút mà không lo rác hệ điều hành máy host. Chúng ta sẽ dựng cụm gồm 1 node OpenSearch (tạm tắt plugin bảo mật nội bộ để tiện thực hành) và 1 node OpenSearch Dashboards.

Bước 1: Chuẩn bị file docker-compose.yml

Tạo thư mục làm việc và mở file cấu hình:

mkdir opensearch-lab && cd opensearch-lab
nano docker-compose.yml

Dán đoạn cấu hình sau vào file:

version: '3.8'

services:
  opensearch-node:
    image: opensearchproject/opensearch:2.12.0
    container_name: opensearch-node
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch-node
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - DISABLE_SECURITY_PLUGIN=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data:/usr/share/opensearch/data
    ports:
      - 9200:9200
      - 9600:9600
    networks:
      - opensearch-net

  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:2.12.0
    container_name: opensearch-dashboards
    ports:
      - 5601:5601
    environment:
      - 'OPENSEARCH_HOSTS=["http://opensearch-node:9200"]'
      - DISABLE_SECURITY_DASHBOARDS_PLUGIN=true
    networks:
      - opensearch-net
    depends_on:
      - opensearch-node

volumes:
  opensearch-data:

networks:
  opensearch-net:

Bước 2: Cấu hình kernel và khởi chạy

Mỗi tiến trình Lucene chạy trong container cần số lượng vùng nhớ ánh xạ (memory-mapped areas) rất lớn. Trên máy chủ Linux, hãy tăng giới hạn bộ nhớ ảo trước khi chạy container:

sudo sysctl -w vm.max_map_count=262144
docker compose up -d

Đợi khoảng 20 giây để node hoàn tất khởi động. Sau đó kiểm tra trạng thái cụm bằng lệnh:

curl http://localhost:9200

Nếu console trả về JSON chứa dòng "tagline" : "The OpenSearch Project: https://opensearch.org/" cùng thông số phiên bản, cụm đã sẵn sàng tiếp nhận dữ liệu.

Bước 3: Đánh chỉ mục và test truy vấn

Hãy cùng thử nghiệm đánh chỉ mục (index) 2 bài viết mẫu thông qua REST API:

# 1. Thêm tài liệu đầu tiên
curl -X POST "http://localhost:9200/articles/_doc/1" -H 'Content-Type: application/json' -d'{
  "title": "Hướng dẫn học lập trình từ số 0",
  "author": "Nguyen Van A",
  "content": "Học lập trình cần kiên nhẫn, bắt đầu từ kiến thức cơ bản về biến và vòng lặp.",
  "tags": ["it", "coding", "beginner"]
}'

# 2. Thêm tài liệu thứ hai
curl -X POST "http://localhost:9200/articles/_doc/2" -H 'Content-Type: application/json' -d'{
  "title": "Kinh nghiệm quản trị cơ sở dữ liệu lớn",
  "author": "Tran Van B",
  "content": "Tối ưu truy vấn SQL và phân tích log hệ thống giúp giảm thiểu sự cố server.",
  "tags": ["database", "devops"]
}'

Giờ là phần thú vị nhất: tìm các bài viết chứa từ ‘cơ sở dữ liệu’ hoặc ‘log’:

curl -X GET "http://localhost:9200/articles/_search" -H 'Content-Type: application/json' -d'{
  "query": {
    "match": {
      "content": "cơ sở dữ liệu log"
    }
  }
}'

OpenSearch sẽ tự động phân tách từ (tokenize), tính điểm liên quan (score) dựa trên thuật toán BM25 và trả về tài liệu số 2 ở vị trí đầu tiên chỉ trong vài mili-giây.

Bước 4: Trải nghiệm OpenSearch Dashboards

Mở trình duyệt và truy cập vào địa chỉ http://localhost:5601. Giao diện quản trị sẽ hiện ra ngay lập tức. Trong đó:

  • Dev Tools: Nơi bạn viết và kiểm tra các câu truy vấn JSON trực tiếp có tính năng tự động gợi ý cú pháp.
  • Discover & Dashboards: Cho phép lọc hàng triệu dòng log theo mốc thời gian, đồng thời trực quan hóa số lượng lỗi 500 hay latency bằng biểu đồ cột, biểu đồ nhiệt.

Lời kết

Đừng dùng OpenSearch để thay thế hoàn toàn MySQL hay PostgreSQL. Nó sinh ra không phải để quản lý đơn hàng hay khóa giao dịch ngân hàng. Thay vào đó, mô hình chuẩn trong thực tế là giữ RDBMS làm nguồn dữ liệu chính (source of truth). Sau đó, bạn đồng bộ dữ liệu tìm kiếm và log về OpenSearch.

Sự kết hợp này giúp hệ thống vừa an toàn về mặt dữ liệu, vừa đạt tốc độ tìm kiếm vượt trội mà không lo rào cản bản quyền thương mại.

Share: