Phân tích log lỗi và hệ thống
Log là nguồn dữ liệu đầu tiên cần kiểm tra khi OpenSearch gặp sự cố. Bạn cần tập trung vào hai nguồn chính: file log nội bộ của OpenSearch và log quản lý dịch vụ của systemd.
Đầu tiên, kiểm tra log chính của OpenSearch để tìm các lỗi liên quan đến JVM, phân vùng (Shard) hoặc kết nối mạng.
sudo tail -f /var/log/opensearch/opensearch.log | grep -E "ERROR|WARN|FATAL|Exception|OutOfMemoryError"
Kết quả mong đợi: Bạn sẽ thấy dòng log thực-time hiển thị các thông báo lỗi. Nếu thấy "ClusterBlockedException", cluster đang bị khóa; nếu thấy "OutOfMemoryError", JVM đang thiếu RAM.
Tiếp theo, sử dụng systemd để xem trạng thái khởi động hoặc crash của dịch vụ OpenSearch.
sudo journalctl -u opensearch -n 100 --no-pager
Kết quả mong đợi: Hiển thị 100 dòng log gần nhất của dịch vụ opensearch, bao gồm các thông báo về việc dừng dịch vụ (Stopped), lỗi cấu hình (Failed to start), hoặc lỗi cấp hệ thống (Permission denied).
Để xem chi tiết hơn về quá trình khởi động, hãy xem toàn bộ log của lần chạy hiện tại.
sudo journalctl -u opensearch -b | grep -A 5 "ERROR"
Kết quả mong đợi: Hiển thị ngữ cảnh xung quanh các lỗi xảy ra từ khi boot máy (hoặc khi service start), giúp bạn xác định nguyên nhân gốc rễ.
Giám sát hiệu năng (CPU, RAM, I/O)
Việc giám sát giúp phát hiện sớm các nút cổ chai (bottleneck) trước khi chúng gây sập dịch vụ. OpenSearch có plugin monitoring tích hợp, nhưng ở mức độ Sysadmin, bạn cần các công cụ hệ thống nhanh gọn.
Sử dụng công cụ `vmstat` để theo dõi trạng thái bộ nhớ ảo, CPU và I/O theo thời gian thực.
vmstat 1 10
Kết quả mong đợi: Bảng hiển thị 10 dòng, mỗi giây cập nhật một lần. Quan sát cột `si` (swap in) và `so` (swap out). Nếu hai giá trị này > 0 liên tục, hệ thống đang bị thiếu RAM và phải dùng swap, gây chậm nghiêm trọng cho OpenSearch.
Giám sát I/O Wait (thời gian CPU chờ I/O) bằng `iostat` để kiểm tra tốc độ đọc ghi của ổ cứng.
iostat -x 1 5
Kết quả mong đợi: Xem cột `%util` (tỷ lệ sử dụng thiết bị). Nếu `%util` > 90% liên tục, ổ cứng đã quá tải. Kiểm tra cột `%iowait` trong kết quả `vmstat` đi kèm; nếu cao, I/O là nguyên nhân gây chậm.
Sử dụng API của OpenSearch để lấy thông tin chi tiết về Node hiện tại, bao gồm CPU, RAM, và Disk Usage.
curl -k -u admin:admin "https://localhost:9200/_nodes/stats?pretty"
Kết quả mong đợi: Trả về JSON chứa chi tiết `jvm.mem.heap_used_percent` (tỷ lệ bộ nhớ Heap đang dùng), `cpu.percent` (tải CPU), và `fs.total.size` (dung lượng disk). Nếu Heap > 75%, cần tăng bộ nhớ hoặc giảm kích thước Index.
Kiểm tra số lượng file mở (file descriptors) để tránh lỗi "Too many open files".
lsof -p $(pgrep opensearch) | wc -l
Kết quả mong đợi: Một con số biểu thị số file đang mở. So sánh con số này với giới hạn của hệ thống (thường là 65536 hoặc 100000). Nếu gần bằng giới hạn, cần tăng `ulimit`.
Xử lý các lỗi phổ biến
Có ba lỗi kinh điển: Cluster không xanh (Red/Yellow), Shard bị mất (Missing), và Timeout khi truy vấn.
Cluster không xanh (Red hoặc Yellow)
Trạng thái Red nghĩa là có dữ liệu bị mất (không thể phục hồi shard). Trạng thái Yellow nghĩa là dữ liệu an toàn nhưng replica chưa về hết.
Kiểm tra lý do cụ thể khiến cluster không xanh.
curl -k -u admin:admin "https://localhost:9200/_cluster/health?pretty"
Kết quả mong đợi: JSON hiển thị `status` là `red` hoặc `yellow` kèm `reason`. Ví dụ: "shard allocation failed" hoặc "no active shard copies available".
Để xử lý trường hợp Yellow do thiếu replica (thường gặp khi chạy single-node), tắt cơ chế replica cho Index đó.
curl -k -X PUT "https://localhost:9200/your-index-name/_settings" -H "Content-Type: application/json" -d '{"number_of_replicas": 0}'
Kết quả mong đợi: Trả về `acknowledged: true`. Cluster sẽ chuyển sang màu Green nếu không còn lỗi khác.
Nếu lỗi là "Cluster Block" (bị khóa), cần xem chi tiết và mở khóa.
curl -k -u admin:admin "https://localhost:9200/_cluster/blocks?pretty"
Kết quả mong đợi: Liệt kê các index bị khóa và lý do (ví dụ: disk water mark). Nếu do disk full, bạn cần xóa dữ liệu hoặc thêm disk, sau đó chạy lệnh mở khóa.
Shard bị mất (Missing)
Khi một Shard bị mất hoàn toàn (ví dụ: disk bị hỏng), OpenSearch sẽ báo lỗi `No shard available`.
Đẩy cluster vào trạng thái "Allocation Retry" để OpenSearch tự động cố gắng phân phối lại shard còn lại hoặc rebuild từ replica.
curl -k -u admin:admin "https://localhost:9200/_cluster/reroute?retry_failed=true&pretty"
Kết quả mong đợi: Trả về `acknowledged: true` và danh sách các shard đã được di chuyển (moved) hoặc xây dựng lại (allocated).
Nếu shard không tự phục hồi, kiểm tra lại log để xem shard đó đã bị xóa vĩnh viễn hay chưa. Nếu cần, có thể cần xóa index và restore từ backup.
Timeout khi truy vấn (Search Timeout)
Khi query mất quá nhiều thời gian và bị cắt cụt.
Tăng thời gian chờ mặc định của cluster bằng cách điều chỉnh setting tạm thời.
curl -k -X PUT "https://localhost:9200/_cluster/settings" -H "Content-Type: application/json" -d '{"transient": {"search.default_search_timeout": "30s"}}'
Kết quả mong đợi: `acknowledged: true`. Các query sau này sẽ có thời gian chờ tối đa 30 giây thay vì mặc định (thường là 10s).
Tối ưu hóa query bằng cách thêm tham số `size` để giới hạn số lượng kết quả trả về, tránh tải quá nhiều dữ liệu về client.
curl -k -u admin:admin "https://localhost:9200/your-index/_search?pretty&size=1000"
Kết quả mong đợi: Query chạy nhanh hơn và không bị timeout nếu dữ liệu không quá lớn.
Mẹo nâng cao: Backup/Restore và tự động hóa
Việc sao lưu (Snapshot) và khôi phục (Restore) là quy trình quan trọng nhất để đảm bảo an toàn dữ liệu. OpenSearch sử dụng plugin Snapshot Repository để lưu dữ liệu vào S3 hoặc Local Storage.
Cấu hình Snapshot Repository
Đầu tiên, tạo thư mục lưu trữ backup trên disk (hoặc cấu hình S3 nếu dùng cloud). Ở đây minh họa dùng Local Storage.
Tạo thư mục backup với quyền hạn đầy đủ cho user opensearch.
sudo mkdir -p /var/lib/opensearch/backups && sudo chown -R opensearch:opensearch /var/lib/opensearch/backups
Kết quả mong đợi: Thư mục được tạo và quyền sở hữu chuyển sang user opensearch.
Đăng ký repository vào OpenSearch để hệ thống biết nơi lưu backup.
curl -k -X PUT "https://localhost:9200/_snapshot/my_backup_repo" -H "Content-Type: application/json" -d '{"type": "fs", "settings": {"location": "/var/lib/opensearch/backups"}}'
Kết quả mong đợi: `acknowledged: true`. Repository đã sẵn sàng để sử dụng.
Thực hiện Backup và Restore
Tạo một snapshot (bản sao lưu) cho toàn bộ cluster hoặc index cụ thể.
curl -k -X PUT "https://localhost:9200/_snapshot/my_backup_repo/snapshot_1?wait_for_completion=true&pretty" -H "Content-Type: application/json" -d '{"indices": "your-index-name", "ignore_unavailable": true, "include_global_state": false}'
Kết quả mong đợi: JSON trả về trạng thái `SUCCESS` và danh sách các shard đã được backup. Tham số `wait_for_completion` giúp lệnh chờ xong mới trả kết quả.
Khôi phục dữ liệu từ snapshot vào một index mới (hoặc cùng tên nếu index cũ đã bị xóa).
curl -k -X POST "https://localhost:9200/_snapshot/my_backup_repo/snapshot_1/_restore?wait_for_completion=true&pretty" -H "Content-Type: application/json" -d '{"indices": "your-index-name", "rename_pattern": "your-index-name", "rename_replacement": "your-index-name-restored"}'
Kết quả mong đợi: Dữ liệu được khôi phục thành công vào index `your-index-name-restored`.
Tự động hóa bảo trì (Cron Job)
Viết script shell để tự động backup hàng ngày và xóa backup cũ.
Tạo file script backup tự động tại `/usr/local/bin/opensearch_backup.sh`.
cat > /usr/local/bin/opensearch_backup.sh
Kết quả mong đợi: File script được tạo với nội dung đầy đủ.
Thật quyền thực thi cho script.
sudo chmod +x /usr/local/bin/opensearch_backup.sh
Kết quả mong đợi: Script có thể chạy được.
Cấu hình cron job để chạy script vào lúc 2 giờ sáng mỗi ngày.
echo "0 2 * * * root /usr/local/bin/opensearch_backup.sh" | sudo crontab -
Kết quả mong đợi: Cron job được thêm vào lịch trình. Bạn có thể kiểm tra bằng lệnh `sudo crontab -l`.
Verify kết quả bằng cách chạy script thủ công và kiểm tra log.
/usr/local/bin/opensearch_backup.sh && sudo tail -n 20 /var/log/opensearch/opensearch.log
Kết quả mong đợi: Script chạy thành công, thông báo "Backup completed" hiện ra, và log OpenSearch ghi nhận sự kiện tạo snapshot.
Điều hướng series:
Mục lục: Series: Triển khai Database Search với OpenSearch và Ubuntu 24.04
« Phần 7: Triển khai Kibana Plugin và tích hợp Logstash