Phân tích log lỗi phổ biến trong Meta, Graph và Storage
Nebula Graph lưu trữ log hoạt động chi tiết theo từng component. Việc xác định vị trí và định dạng log là bước đầu tiên để debug sự cố.
Mặc định, log được ghi vào thư mục /opt/nebula/graph/, /opt/nebula/storage/ và /opt/nebula/meta/ tùy thuộc vào cấu hình log_dir trong file config.
Để tìm kiếm lỗi nhanh chóng, sử dụng grep kết hợp với tail để xem thời gian thực.
Kiểm tra trạng thái khởi động và lỗi liên tục của Graph Service.
sudo tail -f /opt/nebula/graph/log/graph.log | grep -E "(ERROR|FATAL|panic|failed)"
Kết quả mong đợi: Xuất hiện dòng log chỉ rõ thời gian, module và thông báo lỗi cụ thể (ví dụ: "Connection refused", "Leader not found").
Kiểm tra lỗi đồng bộ hóa dữ liệu trên Storage Service.
sudo tail -f /opt/nebula/storage/log/storage.log | grep -E "(replication|partition|leader|follower|sync)"
Kết quả mong đợi: Thấy các cảnh báo về mất kết nối giữa các partition hoặc lỗi khi chọn leader.
Kiểm tra lỗi trong Meta Service liên quan đến việc quản lý topology.
sudo tail -f /opt/nebula/meta/log/meta.log | grep -E "(leader|heartbeat|version|cluster)"
Kết quả mong đợi: Phát hiện các vấn đề về heartbeat bị mất hoặc không thể ghi thông tin topology vào log.
Cấu hình Prometheus và Grafana để giám sát cụm
Nebula Graph tích hợp sẵn endpoint metrics dưới dạng Prometheus format. Chúng ta cần deploy Prometheus để thu thập dữ liệu và Grafana để trực quan hóa.
Trước tiên, cài đặt Prometheus trên server giám sát (có thể là node bất kỳ trong cụm).
apt update && apt install -y prometheus prometheus-exporters
Kết quả mong đợi: Prometheus được cài đặt thành công và service đang chạy.
Sửa file cấu hình /etc/prometheus/prometheus.yml để định nghĩa các target là các node Nebula Graph của bạn.
Ghi đè nội dung file cấu hình Prometheus với các target cụ thể (thay đổi IP theo thực tế).
cat > /etc/prometheus/prometheus.yml
Kết quả mong đợi: File cấu hình được lưu, không có lỗi cú pháp YAML.
Khởi động lại service Prometheus để áp dụng cấu hình mới.
systemctl restart prometheus && systemctl status prometheus
Kết quả mong đợi: Prometheus chạy ở trạng thái active (running) và logs không có lỗi.
Cài đặt Grafana để hiển thị dashboard.
apt install -y grafana && systemctl enable --now grafana-server
Kết quả mong đợi: Grafana chạy trên cổng 3000, truy cập qua trình duyệt.
Trong Grafana, vào Configuration > Data Sources, thêm Prometheus với URL http://localhost:9090.
Import dashboard mẫu từ Nebula Graph (ID: 13485 hoặc tương tự trên Grafana.com).
curl -s http://localhost:3000/api/search/query?type=dashboard | jq '.results[].uid'
Kết quả mong đợi: Dashboard hiện ra các metric như QPS, Latency, CPU Usage của các node Graph/Storage.
Verify kết quả: Truy cập http://:3000, đăng nhập (admin/admin), chọn Data Source Prometheus, thấy các metric đang cập nhật theo thời gian thực.
Chiến lược khôi phục dữ liệu khi mất node
Khi một node Storage bị mất (crash hoặc mất phần cứng), Nebula Graph sử dụng cơ chế Replication để tự động khôi phục dữ liệu từ các replica còn lại.
Xác định trạng thái của các partition trong cluster để biết partition nào đang thiếu replica.
nebula-console -u root -p nebula4ever -n default -e "SHOW HOSTS;"
Kết quả mong đợi: Danh sách các host, trong đó node bị mất sẽ hiển thị trạng thái DOWN hoặc UNKNOWN.
Nếu node mất hoàn toàn, cần xóa node đó khỏi cluster để Meta Service không cố gắng giao tiếp.
nebula-console -u root -p nebula4ever -n default -e "REMOVE HOST 192.168.1.12:9779;"
Kết quả mong đợi: Meta Service trả về Execute result: OK và xóa entry của node đó.
Sau khi thêm node mới vào cụm (cài đặt Storage Service mới), yêu cầu Meta Service thêm host mới vào.
nebula-console -u root -p nebula4ever -n default -e "ADD HOST 192.168.1.12:9779;"
Kết quả mong đợi: Node mới được thêm vào danh sách SHOW HOSTS với trạng thái ALIVE.
Kiểm tra quá trình đồng bộ hóa dữ liệu (Rebalance) tự động của Storage Service.
nebula-console -u root -p nebula4ever -n default -e "SHOW PARTITIONS OF space_name;"
Kết quả mong đợi: Các partition trước đây nằm trên node cũ sẽ tự động di chuyển hoặc tạo replica mới trên node mới.
Nếu quá trình tự động bị kẹt, kích hoạt thủ công rebalance.
nebula-console -u root -p nebula4ever -n default -e "REBALANCE SPACE space_name;"
Kết quả mong đợi: Meta Service bắt đầu phân phối lại các partition để cân bằng tải và dữ liệu.
Xử lý các vấn đề về mạng và đồng bộ hóa dữ liệu
Các sự cố mạng thường gây ra lỗi Heartbeat timeout hoặc Leader election failed.
Kiểm tra tường lửa (Firewall) và nhóm an ninh (Security Group) để đảm bảo các cổng giao tiếp nội bộ mở.
iptables -L -n | grep -E "9001|9002|9003|9669|9779"
Kết quả mong đợi: Các cổng 9669 (Meta), 9779 (Graph), 9002 (Storage) phải có trạng thái ACCEPT.
Kiểm tra kết nối mạng giữa các node bằng telnet hoặc nc.
nc -zv 192.168.1.10 9669 && nc -zv 192.168.1.10 9779
Kết quả mong đợi: Trả về Connection to ... succeeded. Nếu fail, cần sửa firewall hoặc network config.
Nếu gặp lỗi Leader not found, kiểm tra xem Meta Service có đang hoạt động tốt không.
curl -s http://192.168.1.10:9003/metrics | grep nebula_meta_leader_count
Kết quả mong đợi: Giá trị metric phải bằng số lượng space đang chạy. Nếu bằng 0, Meta Service đang gặp sự cố nghiêm trọng.
Xử lý tình trạng Split-brain (nhiều leader cùng lúc) bằng cách restart Storage Service trên các node bị ảnh hưởng.
systemctl restart nebula-storage
Kết quả mong đợi: Storage Service khởi động lại, tham gia vào election mới và chọn đúng 1 leader cho mỗi partition.
Kiểm tra lại trạng thái đồng bộ hóa sau khi khắc phục mạng.
nebula-console -u root -p nebula4ever -n default -e "SHOW PARTITIONS OF space_name;"
Kết quả mong đợi: Tất cả các partition đều có trạng thái HEALTHY và số lượng replica đúng yêu cầu (thường là 3).
Mẹo bảo mật nâng cao và tài nguyên tham khảo thêm
Bảo mật Nebula Graph cần tập trung vào 3 lớp: Network, Authentication và Encryption.
Tắt tính năng allow_all_client trong file config graph.conf để chỉ cho phép IP tin cậy kết nối.
Sửa file /opt/nebula/graph/conf/graph.conf (tùy cấu hình thực tế của bạn).
sed -i 's/allow_all_client: true/allow_all_client: false/' /opt/nebula/graph/conf/graph.conf
Kết quả mong đợi: File config được cập nhật, chỉ các IP được cấu hình trong allowed_clients mới kết nối được.
Kích hoạt SSL/TLS cho kết nối giữa Client và Server, cũng như giữa các node trong cụm.
Tạo certificate tự ký cho testing (trong production dùng CA uy tín).
openssl req -x509 -newkey rsa:4096 -keyout /opt/nebula/certs/nebula.key -out /opt/nebula/certs/nebula.crt -days 365 -nodes -subj "/CN=nebula-cluster"
Kết quả mong đợi: File .key và .crt được tạo trong thư mục certs.
Cấu hình graph.conf và storage.conf để sử dụng SSL.
cat >> /opt/nebula/graph/conf/graph.conf
Kết quả mong đợi: Graph Service yêu cầu client phải có certificate hợp lệ khi kết nối.
Tạo user với quyền hạn tối thiểu (Least Privilege) cho ứng dụng.
nebula-console -u root -p nebula4ever -n default -e "CREATE USER app_user IDENTIFIED BY 'StrongPassword123!'; GRANT READ ON space_name TO app_user;"
Kết quả mong đợi: User app_user được tạo và chỉ có quyền đọc trên space cụ thể.
Tài nguyên tham khảo chính thức:
- Official Docs:
https://docs.nebula-graph.com.cn/ (chuyển sang EN nếu cần)
- GitHub Issues:
https://github.com/vesoft-inc/nebula/issues
- Community Slack: Tham gia kênh support của Nebula Graph.
Điều hướng series:
Mục lục: Series: Triển khai Database Graph phân tán với Nebula Graph trên Ubuntu 24.04
« Phần 5: Tối ưu hóa hiệu năng và cân bằng tải cho dữ liệu lớn