Nếu anh em đang đau đầu vì Elasticsearch ngốn quá nhiều RAM…
Khoảng một năm trước, mình nhận tối ưu hệ thống cho một trang tin tức sở hữu khoảng 50 triệu bài viết. Lúc đó, team đang chạy Elasticsearch trên VPS 16GB RAM. Cứ mỗi lần re-index dữ liệu hoặc gặp đợt traffic tăng đột biến, Java Virtual Machine (JVM) lại lăn ra sập vì quá tải.
Sau khi thử nghiệm nhiều phương án, mình quyết định migrate toàn bộ sang Manticore Search. Kết quả thực sự gây sốc: RAM tiêu thụ giảm từ 14GB xuống còn chưa đầy 2GB. Tốc độ search vẫn nhanh tương đương, thậm chí các query phức tạp còn mượt hơn trước. Manticore là bản fork từ Sphinx Search nhưng được hiện đại hóa, hỗ trợ Real-time index và cực kỳ nhẹ.
Cài đặt Manticore trong 5 phút
Mình sẽ thực hiện trên Ubuntu 22.04/24.04. Manticore hỗ trợ hầu hết các distro Linux phổ biến hiện nay.
Bước 1: Thêm repo và cài đặt
# Cài đặt repo chính thức
wget https://repo.manticoresearch.com/manticore-repo.noarch.deb
sudo dpkg -i manticore-repo.noarch.deb
sudo apt update
# Cài đặt manticore và các gói bổ trợ
sudo apt install manticore manticore-extra -y
Bước 2: Khởi động service
sudo systemctl start manticore
sudo systemctl enable manticore
Bước 3: Truy vấn qua MySQL Protocol
Điểm cộng lớn nhất của Manticore là hỗ trợ giao thức MySQL. Anh em không cần học cú pháp JSON loằng ngoằng như Elasticsearch. Cứ dùng lệnh SQL quen thuộc là xong.
mysql -h 127.0.0.1 -P 9306
Thử tạo một table và chèn dữ liệu test:
CREATE TABLE products(title text, price float) realtime;
INSERT INTO products(title, price) VALUES ('iPhone 15 Pro Max', 1200.50);
SELECT * FROM products WHERE MATCH('iphone');
Tại sao nên chọn Manticore thay vì Elasticsearch?
Khi làm dữ liệu lớn, chi phí hạ tầng là bài toán sống còn. Elasticsearch mạnh nhưng chạy trên JVM nên rất “tham” tài nguyên. Ngược lại, Manticore được viết bằng C++, giúp tận dụng tối đa phần cứng mà không cần lớp ảo hóa trung gian.
- Tiết kiệm RAM: Cùng một dataset, Manticore chỉ tốn khoảng 1/10 RAM so với ES. Một server 4GB RAM có thể gánh hàng chục triệu record dễ dàng.
- SQL Friendly: Kết nối qua port 9306 bằng thư viện MySQL của PHP, Python hay Node.js. Rất tiện cho anh em dev web.
- Khởi động tức thì: Restart Manticore chỉ mất 1-2 giây. Trong khi đó, ES thường mất vài phút để trạng thái chuyển sang “green”.
- Full-text search chuyên sâu: Hỗ trợ cắt từ, đánh trọng số và fuzzy search (tìm kiếm mờ) rất chính xác.
Cấu hình Production thực tế
File cấu hình nằm tại /etc/manticoresearch/manticore.conf. Thay vì dùng file tĩnh kiểu cũ, mình khuyên anh em nên dùng Real-time (RT) index để linh hoạt hơn.
Nếu cần nạp dữ liệu định kỳ từ MySQL/PostgreSQL, hãy tham khảo mẫu cấu hình source dưới đây:
source src_products {
type = mysql
sql_host = localhost
sql_user = your_user
sql_pass = your_password
sql_db = your_database
sql_port = 3306
sql_query = SELECT id, title, content, created_at FROM articles
}
index idx_articles {
source = src_products
path = /var/lib/manticore/idx_articles
morphology = stem_en # Xử lý gốc từ tiếng Anh
min_word_len = 1
}
Sau khi lưu config, chạy lệnh sau để bắt đầu đánh chỉ mục:
indexer --all --rotate
Xử lý tiếng Việt và tối ưu Performance
1. Tìm kiếm tiếng Việt có dấu và không dấu
Manticore cần charset_table để hiểu các ký tự đặc biệt. Để tìm kiếm tiếng Việt chuẩn, anh em cần định nghĩa bảng mã để hệ thống có thể thực hiện “folding” (tự động chuyển có dấu về không dấu khi query).
Kinh nghiệm của mình là sử dụng bộ `charset_table` đầy đủ cho tiếng Việt trong file config. Điều này giúp người dùng gõ “dien thoai” vẫn ra kết quả “điện thoại”.
2. Distributed Index (Phân tán dữ liệu)
Nếu dữ liệu phình to lên hàng trăm triệu dòng, một server không thể gánh nổi. Lúc này, hãy dùng Distributed Index để gộp kết quả từ nhiều node khác nhau.
CREATE TABLE remote_index TYPE='distributed' local='idx_part1' remote='192.168.1.10:9312:idx_part2';
Kinh nghiệm “xương máu” từ thực tế
- Luôn backup dữ liệu: Với Real-time index, hãy dùng lệnh
FREEZEtrước khi copy file data ở/var/lib/manticoređể đảm bảo tính toàn vẹn. - Sử dụng Columnar Library: Nếu cần tính toán sum, group by trên hàng triệu dòng, hãy cài thêm
manticore-columnar-lib. Tốc độ phân tích của nó nhanh ngang ngửa ClickHouse. - Giám sát hệ thống: Đừng quên dùng lệnh
SHOW STATUS. Mình thường đẩy các thông số QPS (Query Per Second) và Latency lên Grafana để theo dõi sức khỏe hệ thống. - Dùng HTTP JSON API cho App: Dù SQL protocol rất tiện để debug, nhưng khi viết code (Node.js, Go…), dùng HTTP API (port 9308) sẽ giúp load balancing tốt hơn.
Manticore Search có thể không nổi tiếng bằng Elasticsearch, nhưng về hiệu quả trên chi phí (P/P) thì nó thực sự là vô địch. Nếu anh em muốn tiết kiệm tài nguyên server mà vẫn giữ được tốc độ tìm kiếm cực nhanh, hãy thử migrate ngay hôm nay.
Anh em gặp lỗi khi cấu hình tiếng Việt hay bị kẹt chỗ nào thì cứ comment phía dưới nhé!

