Elasticsearch Bài học 2: Cài đặt ELK Stack siêu tốc (Elasticsearch, Kibana) bằng Docker Compose
Để bắt tay vào thực hành ngay lập tức mà không làm "rác" máy tính cá nhân, việc đóng gói mọi thứ vào container là giải pháp tối ưu nhất. Thay vì mất hàng giờ cấu hình Java, cài đặt các service riêng lẻ và xử lý lỗi biến môi trường, chúng ta sẽ dựng toàn bộ cụm Elasticsearch và giao diện Kibana chỉ trong vài phút.
Bài viết này cung cấp một template chuẩn để bạn có thể đưa vào series trên Viblo, giúp độc giả tự setup môi trường local hoàn hảo trước khi đi sâu vào các bài toán backend.
1. Xử lý lỗi vm.max_map_count (Bắt buộc trên Linux/WSL2)
Elasticsearch sử dụng thư viện mmapfs để lưu trữ các index trên RAM. Mặc định, giới hạn bộ nhớ ảo của hệ điều hành Linux (bao gồm cả WSL2 trên Windows) thường quá thấp (65530), sẽ khiến container Elasticsearch bị crash ngay khi khởi động.
Bạn cần tăng giới hạn này lên tối thiểu 262144. Mở terminal và chạy lệnh sau:
Bash
# Đối với Linux hoặc WSL2
sudo sysctl -w vm.max_map_count=262144
# Để cấu hình này không bị mất khi restart máy, hãy lưu vào file sysctl.conf
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
(Lưu ý: Nếu sử dụng Docker Desktop trên MacOS, Docker Desktop đã tự động cấu hình phần này).
2. Viết file docker-compose.yml
Tạo một thư mục mới cho project (ví dụ: elastic-series) và tạo file docker-compose.yml với nội dung dưới đây. Cấu hình này sử dụng Elasticsearch phiên bản 8.x mới nhất, cấu hình chạy một node (Single-node) và tạm thời tắt bảo mật (xpack.security.enabled=false) để tối ưu tốc độ học tập.
YAML
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: es-node
environment:
- node.name=es-node
- cluster.name=es-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g" # Cấp phát cố định 1GB RAM để tránh tràn bộ nhớ
- xpack.security.enabled=false # Tắt xác thực cho môi trường local dev
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es-data:/usr/share/elasticsearch/data
ports:
- "9200:9200" # Port API
- "9300:9300" # Port giao tiếp giữa các Node
networks:
- elastic-net
kibana:
image: docker.elastic.co/kibana/kibana:8.10.2
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- elastic-net
volumes:
es-data:
driver: local
networks:
elastic-net:
driver: bridge
Giải thích các biến môi trường quan trọng:
-
discovery.type=single-node: Báo cho Elasticsearch biết cụm này chỉ có 1 node duy nhất, bỏ qua các bước bầu chọn Master Node phức tạp. -
bootstrap.memory_lock=true: Khóa RAM được cấp phát, ngăn không cho hệ điều hành swap memory ra ổ cứng (Swap sẽ giết chết hiệu năng của Elasticsearch). -
ES_JAVA_OPTS=-Xms1g -Xmx1g: Khởi tạo Heap Size cho Java. Trong môi trường local, 1GB là đủ. Trên Production, con số này thường chiếm 50% tổng RAM của server (nhưng không vượt quá 32GB). -
xpack.security.enabled=false: Từ bản 8.0, Elastic bật bảo mật (username/password, HTTPS) mặc định. Tắt đi sẽ giúp bạn gửi API request qua Postman hoặc Curl dễ dàng hơn trong quá trình học. Không bao giờ cấu hình false trên Production.
3. Khởi chạy và Kiểm tra hệ thống
Mở terminal tại thư mục chứa file docker-compose.yml và chạy:
Bash
docker-compose up -d
Quá trình tải image có thể mất vài phút. Sau khi các container đã ở trạng thái Running, hãy kiểm tra xem hệ thống đã sẵn sàng chưa.
Kiểm tra Elasticsearch: Mở trình duyệt hoặc dùng lệnh curl gọi tới địa chỉ: http://localhost:9200 Nếu trả về một khối JSON chứa thông tin version và khẩu hiệu "You Know, for Search", chúc mừng bạn, core engine đã chạy thành công.
JSON
{
"name" : "es-node",
"cluster_name" : "es-docker-cluster",
"cluster_uuid" : "abc123xyz...",
"version" : {
"number" : "8.10.2",
"lucene_version" : "9.7.0"
},
"tagline" : "You Know, for Search"
}
Kiểm tra Kibana: Truy cập vào địa chỉ: http://localhost:5601. Kibana là giao diện quản lý đồ họa mạnh mẽ của Elasticsearch.
4. Công cụ đắc lực: Kibana Dev Tools
Trong các bài học tiếp theo, chúng ta sẽ viết hàng loạt các câu query JSON phức tạp. Thay vì dùng Postman tốn công format URL và payload, hãy sử dụng Kibana Dev Tools.
-
Tại giao diện Kibana, nhấn vào Menu (biểu tượng 3 dấu gạch ngang) góc trái trên cùng.
-
Cuộn xuống phần Management, chọn Dev Tools.
-
Bạn sẽ thấy một màn hình chia đôi. Giao diện này hỗ trợ auto-complete (gợi ý lệnh) cực kỳ thông minh, tự động format JSON và cho phép bôi đen để chạy từng đoạn query cụ thể.
Thử ngay một lệnh kiểm tra sức khỏe của Cluster vào ô bên trái và nhấn nút Play (màu xanh):
JSON
GET _cluster/health
Bạn đã có một môi trường Lab hoàn hảo. Hệ thống hiện tại đang rỗng, không có bảng (index) hay bản ghi (document) nào.
All rights reserved