Series Docker & ELK Stack cho Laravel #1: Xây dựng hạ tầng Kibana/Elasticsearch bằng Docker Compose
1. Tư duy Kiến trúc Container cho Log System
Lỗi phổ biến của các lập trình viên mới là tải trực tiếp Elasticsearch và Kibana về máy tính hoặc server rồi chạy. Điều này dẫn đến việc không kiểm soát được lượng RAM tiêu thụ, và khi chuyển server mới lại phải cấu hình từ con số không.
Kiến trúc chuẩn Enterprise:
- Elasticsearch (Database): Nơi lưu trữ toàn bộ text log dưới dạng Index để search với tốc độ ánh sáng. Nằm sâu trong mạng nội bộ.
- Kibana (UI): Giao diện Web kết nối với Elasticsearch để phân tích dữ liệu. Chỉ phơi Kibana ra ngoài (có mật khẩu) cho team Dev/Ops truy cập.
- Mạng cô lập (Isolated Network): Đưa tất cả vào chung một bridge network trong Docker để chúng tự nói chuyện với nhau, cách ly hoàn toàn với bên ngoài.
2. Khởi tạo file Docker Compose
Trong thư mục gốc của dự án Laravel (hoặc tạo một thư mục riêng biệt cho hạ tầng monitoring), hãy tạo file docker-compose.yml. Đây sẽ là bản vẽ kiến trúc của chúng ta:
version: '3.8'
services:
# 1. Trái tim của hệ thống: Elasticsearch
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: afc_elasticsearch
environment:
- node.name=afc_elasticsearch
- cluster.name=afc-es-cluster
- discovery.type=single-node
# TẮT bảo mật SSL tạm thời ở Local/Staging để Dev dễ thở (Lên Production sẽ bật lại)
- xpack.security.enabled=false
# BẮT BUỘC: Giới hạn RAM. Elasticsearch mặc định ăn rất nhiều RAM.
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
# Map volume để log không bị mất khi xóa container
- es_data:/usr/share/elasticsearch/data
ports:
# Expose port 9200 để Laravel có thể đẩy log vào
- "9200:9200"
networks:
- elk_network
restart: unless-stopped
# 2. Giao diện phân tích: Kibana
kibana:
image: docker.elastic.co/kibana/kibana:8.10.2
container_name: afc_kibana
environment:
- SERVER_NAME=kibana.local
# Cấu hình Kibana trỏ thẳng vào IP nội bộ của container Elasticsearch
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
# Port mặc định của Kibana
- "5601:5601"
depends_on:
- elasticsearch
networks:
- elk_network
restart: unless-stopped
# Khai báo Volumes để lưu trữ dữ liệu Database vật lý
volumes:
es_data:
driver: local
# Khai báo Network nội bộ
networks:
elk_network:
driver: bridge
3. Phân tích các chốt chặn chuẩn Senior trong cấu hình
Nếu tinh ý, bạn sẽ thấy file cấu hình trên khác biệt so với các bài hướng dẫn cơ bản trên mạng ở những điểm cốt lõi sau:
- Giới hạn tài nguyên (ES_JAVA_OPTS): Elasticsearch chạy bằng Java (JVM). Nếu bạn không gán -Xms512m -Xmx512m, nó sẽ vắt kiệt toàn bộ RAM của server (thậm chí là 4GB hay 8GB), gây sập (Crash) toàn bộ hệ thống API Laravel chạy cùng server đó.
- Data Persistence (Volumes): Container là một môi trường "bay hơi". Nghĩa là nếu container bị restart hoặc xóa, toàn bộ log sẽ mất trắng. Việc khai báo volumes: es_data giúp ánh xạ ổ cứng của Elasticsearch ra ổ cứng vật lý thật của Server.
- Networking (depends_on và elk_network): Container kibana sẽ chờ elasticsearch khởi động xong mới chạy. Chúng gọi nhau bằng chính cái tên http://elasticsearch:9200 nhờ hệ thống phân giải tên miền nội bộ của Docker DNS, không cần phải fix cứng dải IP 192.x.x.x.
4. Khởi chạy và Kiểm tra hệ thống
Bây giờ, hãy mở Terminal, di chuyển vào thư mục chứa file docker-compose.yml và chạy lệnh sau (thêm cờ -d để chạy ngầm dưới background):
docker-compose up -d
Quá trình tải Image về sẽ mất vài phút. Sau khi Terminal báo khởi tạo thành công, hãy kiểm tra lại bằng lệnh:
docker ps
Nếu trạng thái của 2 container đều là Up, hệ thống của bạn đã lên hình.
Nghiệm thu thực tế:
- Mở trình duyệt, truy cập http://localhost:9200. Nếu thấy trả về một cục JSON có chứa dòng "tagline" : "You Know, for Search", Elasticsearch đã sẵn sàng đón nhận dữ liệu.
- Truy cập http://localhost:5601. Bạn sẽ được chào đón bởi giao diện đồ sộ và cực kỳ chuyên nghiệp của Kibana.
Tổng kết Bài 1
Chỉ với một file docker-compose.yml, chúng ta đã kiến tạo thành công một cụm phân tích dữ liệu độc lập, an toàn và tối ưu phần cứng. Không cần cài Java, không cần cấu hình Systemd rườm rà trên Server, tất cả chỉ gói gọn trong vài dòng lệnh.
Tại thời điểm này, con quái vật ELK đã thức giấc nhưng nó chưa có dữ liệu. Để biến nó thành một trung tâm giám sát thực thụ, ứng dụng Laravel của chúng ta cần phải biết cách bắn trực tiếp mọi thông tin về giao dịch vé, các exception lỗi, và truy vấn SQL vào trong bụng Elasticsearch.
All rights reserved