Phân tích Log và Xử lý Sự cố Đồng bộ hóa
Việc đầu tiên khi hệ thống Edge gặp sự cố là kiểm tra log của LiteFS để xác định nguyên nhân: mất kết nối mạng, xung đột dữ liệu hay lỗi disk I/O.
LiteFS ghi log chi tiết vào stdout hoặc file log tùy cấu hình. Nếu bạn chạy trong Docker, dùng docker logs; nếu chạy systemd service, dùng journalctl.
Trên máy Primary (Master), kiểm tra log để tìm các từ khóa như "snapshot", "wal", "replication", hoặc "connection refused".
journalctl -u litfsd -f --no-pager | grep -E "(snapshot|wal|replication|connection|error)"
Kết quả mong đợi: Xuất hiện dòng log chi tiết về quá trình tạo snapshot, gửi WAL (Write-Ahead Log) đến các node Edge, hoặc thông báo lỗi kết nối nếu mạng bị đứt.
Để kiểm tra trạng thái đồng bộ hóa giữa Primary và Edge, sử dụng lệnh snapshot inspect để xem phiên bản (version) của dữ liệu.
litfs snapshot inspect /var/lib/litefs/litfs.db
Kết quả mong đợi: Hiển thị thông tin về snapshot hiện tại, bao gồm generation, size và timestamp. Nếu generation số trên Primary và Edge không khớp, dữ liệu chưa đồng bộ.
Trường hợp phổ biến nhất là lỗi "replication lag" (độ trễ đồng bộ). Kiểm tra lại cấu hình mạng và firewall giữa các node.
litfs mount --status /var/lib/litefs/litfs.db
Kết quả mong đợi: Hiển thị trạng thái "online" hoặc "offline". Nếu thấy "offline", kiểm tra lại firewall (ufw/iptables) có chặn port 20202 (mặc định) hay không.
Khi phát hiện xung đột dữ liệu (ví dụ: 2 node Edge cùng ghi vào bảng quan trọng), LiteFS sẽ ghi log cảnh báo "conflict".
grep -i "conflict" /var/log/litfs.log 2>/dev/null || journalctl -u litfsd | grep -i "conflict"
Kết quả mong đợi: Nếu có xung đột, log sẽ hiển thị chi tiết về transaction ID bị từ chối. Đây là dấu hiệu cần can thiệp thủ công hoặc điều chỉnh ứng dụng để tránh ghi trùng.
Cấu hình TLS/SSL để Mã hóa Kênh Truyền
Trong môi trường Edge, dữ liệu truyền qua mạng công cộng (Internet) bắt buộc phải được mã hóa. LiteFS hỗ trợ TLS native để bảo vệ kênh truyền giữa Primary và Edge.
Bước 1: Tạo chứng chỉ tự ký (self-signed) cho Primary. Trong môi trường production, hãy dùng Let's Encrypt hoặc CA nội bộ.
openssl req -x509 -newkey rsa:4096 -nodes -keyout /etc/litefs/primary.key -out /etc/litefs/primary.crt -days 365 -subj "/C=VN/ST=HCM/O=MyEdge/CN=primary.edge.local"
Kết quả mong đợi: Tạo ra 2 file: primary.key (private key) và primary.crt (public certificate) tại thư mục /etc/litefs/.
Bước 2: Tạo chứng chỉ cho Node Edge. Mỗi Edge cần một cặp key/cert riêng để xác thực danh tính với Primary.
openssl req -x509 -newkey rsa:4096 -nodes -keyout /etc/litefs/edge1.key -out /etc/litefs/edge1.crt -days 365 -subj "/C=VN/ST=HCM/O=MyEdge/CN=edge1.edge.local"
Kết quả mong đợi: Tạo ra file edge1.key và edge1.crt tương ứng cho node Edge đầu tiên.
Bước 3: Cấu hình file litfs.yml trên Primary để bật TLS. Cần chỉ định path đến private key và certificate của Primary, đồng thời chỉ định CA cert để xác thực các Edge.
Tạo file cấu hình đầy đủ tại /etc/litefs/litfs.yml trên Primary:
cat > /etc/litefs/litfs.yml
Kết quả mong đợi: File /etc/litefs/litfs.yml được tạo với cấu hình TLS cho cả giao diện HTTP và Replication. Primary sẽ yêu cầu chứng chỉ từ Edge trước khi chấp nhận kết nối.
Bước 4: Cấu hình file litfs.yml trên Node Edge. Edge cần cấu hình TLS để kết nối đến Primary, đồng thời chỉ định CA cert của Primary để xác thực server.
Tạo file cấu hình đầy đủ tại /etc/litefs/litfs.yml trên Edge:
cat > /etc/litefs/litfs.yml
Kết quả mong đợi: File cấu hình trên Edge chỉ định chính xác địa chỉ HTTPS của Primary và file CA để xác thực.
Khởi động lại dịch vụ litfsd trên cả Primary và Edge để áp dụng cấu hình mới.
systemctl restart litfsd
Kết quả mong đợi: Dịch vụ khởi động lại thành công. Kiểm tra log bằng journalctl -u litfsd -f, nếu thấy dòng "TLS handshake successful" hoặc không có lỗi "certificate verify failed" nghĩa là kết nối bảo mật đã được thiết lập.
Verify kết quả bằng cách thử truy cập API HTTP qua curl với flag --cacert để đảm bảo kết nối mã hóa hoạt động.
curl -v --cacert /etc/litefs/primary.crt https://primary.edge.local:20202/_status
Kết quả mong đợi: Xuất hiện dòng "SSL connection using TLSv1.3" và trả về JSON trạng thái của LiteFS.
Tối ưu hóa Hiệu năng cho Khối lượng Dữ liệu Lớn
Khi dữ liệu tăng lên hàng triệu bản ghi, hiệu năng của SQLite và LiteFS cần được tinh chỉnh để giảm I/O wait và tăng tốc độ đồng bộ.
Tối ưu hóa SQLite bên trong LiteFS bằng cách điều chỉnh các tham số journal_mode, synchronous và cache_size.
Thực hiện các lệnh SQL này ngay sau khi mount database trên Primary:
sqlite3 /var/lib/litefs/litfs.db
Kết quả mong đợi: SQLite chuyển sang chế độ WAL (Write-Ahead Log), giảm độ trễ ghi, tăng bộ nhớ cache lên 64MB và đặt timeout chờ khóa là 5 giây. Chế độ WAL là bắt buộc cho LiteFS để replication hoạt động mượt mà.
Điều chỉnh tham số snapshot trên LiteFS để tránh tạo snapshot quá thường xuyên gây tải CPU cao khi dữ liệu thay đổi liên tục.
Chỉnh sửa file /etc/litefs/litfs.yml trên Primary, thêm hoặc sửa phần server.snapshot:
cat > /etc/litefs/litfs.yml
Kết quả mong đợi: LiteFS sẽ chỉ tạo snapshot khi WAL file đạt 100MB và ít nhất 1 giờ trôi qua kể từ snapshot trước. Điều này giảm tần suất I/O disk liên tục.
Tối ưu hóa cấu hình hệ thống Linux (sysctl) để xử lý nhiều kết nối TCP từ các node Edge.
cat >> /etc/sysctl.conf
Kết quả mong đợi: Tăng kích thước hàng đợi kết nối, tái sử dụng các connection TIME_WAIT và giảm xu hướng swap của RAM để ưu tiên cache file.
Để kiểm tra hiệu năng sau tối ưu, chạy test ghi dữ liệu hàng loạt và đo thời gian đồng bộ.
for i in {1..10000}; do echo "INSERT INTO test_data VALUES ($i, 'test data $i');" | sqlite3 /var/lib/litefs/litfs.db; done
Kết quả mong đợi: Thời gian thực hiện 10000 lệnh INSERT giảm đáng kể so với cấu hình mặc định. Kiểm tra log LiteFS để thấy tốc độ replication (bytes/sec) tăng lên.
Chiến lược Backup và Khôi phục từ Node Edge
Một lợi thế lớn của kiến trúc Edge là mỗi node đều có một bản sao dữ liệu đầy đủ (full replica). Bạn có thể dùng bất kỳ node Edge nào làm nguồn backup thay vì chỉ phụ thuộc vào Primary.
Bước 1: Thực hiện backup trực tiếp từ Node Edge bằng công cụ litfs snapshot. Lệnh này tạo một snapshot điểm trong thời gian (point-in-time) của database.
litfs snapshot create /var/lib/litefs/litfs.db --path /backup/edge1-backup-$(date +%F).tar.gz
Kết quả mong đợi: Tạo file .tar.gz chứa toàn bộ dữ liệu SQLite và metadata của LiteFS tại thư mục /backup/.
Bước 2: Lưu trữ file backup này lên hệ thống object storage (S3, MinIO) hoặc truyền về server trung tâm để dự phòng.
aws s3 cp /backup/edge1-backup-$(date +%F).tar.gz s3://my-edge-backup-bucket/edge1/ --sse AES256
Kết quả mong đợi: File backup được mã hóa và lưu trữ an toàn trên đám mây. Bạn có thể chạy lệnh này theo định kỳ bằng cron.
Cấu hình crontab để tự động hóa backup mỗi ngày lúc 2 giờ sáng trên tất cả các node Edge.
echo "0 2 * * * root litfs snapshot create /var/lib/litefs/litfs.db --path /backup/edge-backup-$(date +%F).tar.gz && aws s3 cp /backup/edge-backup-$(date +%F).tar.gz s3://my-edge-backup-bucket/edge1/ 2>/dev/null" | tee /etc/cron.d/litefs-backup
Kết quả mong đợi: Cron job được tạo. Kiểm tra bằng lệnh crontab -l để đảm bảo task đã được thêm vào.
Bước 3: Quy trình khôi phục dữ liệu (Disaster Recovery) khi Primary bị hỏng hoàn toàn. Bạn sẽ dùng snapshot từ một Edge để nâng cấp nó thành Primary mới.
Trước tiên, tắt dịch vụ litfsd trên node Edge được chọn làm Primary mới.
systemctl stop litfsd
Kết quả mong đợi: Dịch vụ dừng, database được unmount, file hệ thống không bị khóa.
Sử dụng file snapshot đã lưu (hoặc snapshot mới nhất trên disk) để khởi tạo lại cấu hình Primary.
cp /etc/litefs/litfs.yml /etc/litefs/litfs.yml.bak
cat > /etc/litefs/litfs.yml
Kết quả mong đợi: File cấu hình được sửa để xóa dòng primary (vì node này sẽ trở thành Master mới, không cần connect đến ai).
Khởi động lại litfsd trên node Edge này. LiteFS sẽ nhận diện dữ liệu hiện có và tự động chuyển sang chế độ Primary.
systemctl start litfsd
Kết quả mong đợi: Log hiển thị "Starting server as primary". Node này giờ trở thành Master mới. Các node Edge khác cần cập nhật lại config để trỏ về IP mới của node này.
Để đảm bảo tính toàn vẹn dữ liệu sau khôi phục, chạy lệnh verify để kiểm tra checksum của database.
litfs verify /var/lib/litefs/litfs.db
Kết quả mong đợi: Trả về "OK" nếu dữ liệu không bị lỗi. Nếu có lỗi, log sẽ chỉ ra file nào cần khôi phục lại từ backup.
Điều hướng series:
Mục lục: Series: Triển khai Database Edge với LiteFS và Ubuntu 24.04
« Phần 6: Xử lý xung đột dữ liệu và cân bằng tải trong mạng Edge