1. Tạo bản sao lưu toàn phần với neo4j-admin
Bước đầu tiên là thực hiện thủ công để đảm bảo quy trình sao lưu hoạt động chính xác trước khi tự động hóa.
(1) Hành động: Dừng dịch vụ Neo4j để đảm bảo tính nhất quán của dữ liệu, sau đó sử dụng lệnh neo4j-admin dump để xuất toàn bộ dữ liệu ra file.
(2) Lý do: Neo4j yêu cầu trạng thái offline (dừng hoàn toàn) khi thực hiện lệnh dump để tránh xung đột ghi/đọc và đảm bảo file backup không bị lỗi dữ liệu.
(3) Kết quả mong đợi: Một file backup.dump được tạo ra trong thư mục đích, kích thước file phản ánh đúng lượng dữ liệu hiện tại.
Trước tiên, hãy dừng dịch vụ Neo4j đang chạy:
systemctl stop neo4j
Verify trạng thái dừng:
systemctl status neo4j
Thực hiện lệnh dump với quyền root hoặc user neo4j. Thay thế đường dẫn đích theo ý muốn, ở đây mình dùng /var/backup/neo4j/:
mkdir -p /var/backup/neo4j
neo4j-admin dump --to=/var/backup/neo4j/neo4j_backup_$(date +%F).dump
Kiểm tra file đã tạo:
ls -lh /var/backup/neo4j/
Khởi động lại dịch vụ sau khi sao lưu xong:
systemctl start neo4j
Verify kết quả bằng cách kiểm tra file có tồn tại và kích thước > 0:
du -h /var/backup/neo4j/*.dump
2. Cấu hình lịch trình sao lưu tự động với Cron Job
Sau khi đã chạy thử thủ công thành công, ta cần tự động hóa quy trình này để chạy định kỳ hàng ngày hoặc hàng tuần.
(1) Hành động: Tạo script shell thực hiện quy trình dừng - dump - start, sau đó thêm vào crontab của user neo4j hoặc root.
(2) Lý do: Cron job giúp đảm bảo dữ liệu luôn được lưu trữ an toàn mà không cần con người can thiệp, giảm thiểu rủi ro mất dữ liệu do quên backup.
(3) Kết quả mong đợi: Hệ thống tự động tạo file backup mới vào thời gian định sẵn (ví dụ: 2h sáng mỗi ngày) và gửi log qua email hoặc file log.
Tạo script shell /usr/local/bin/neo4j_backup.sh với nội dung đầy đủ như sau:
cat > /usr/local/bin/neo4j_backup.sh > $LOG_FILE
# Kiểm tra xem Neo4j có đang chạy không
if systemctl is-active --quiet $DB_NAME; then
echo "Dừng Neo4j..." >> $LOG_FILE
systemctl stop $DB_NAME
# Đợi 3 giây để chắc chắn dữ liệu được flush
sleep 3
# Thực hiện dump
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_backup_${DATE}.dump"
neo4j-admin dump --to=$BACKUP_FILE >> $LOG_FILE 2>&1
# Khởi động lại Neo4j
echo "Khởi động Neo4j..." >> $LOG_FILE
systemctl start $DB_NAME
sleep 5
# Verify kết quả
if [ -f "$BACKUP_FILE" ]; then
echo "Backup thành công: $BACKUP_FILE" >> $LOG_FILE
else
echo "Lỗi: Không tìm thấy file backup!" >> $LOG_FILE
exit 1
fi
else
echo "Cảnh báo: Neo4j không chạy, không thể backup!" >> $LOG_FILE
exit 1
fi
# Xóa các file backup cũ hơn 7 ngày
find $BACKUP_DIR -name "${DB_NAME}_backup_*.dump" -mtime +$RETENTION_DAYS -delete >> $LOG_FILE 2>&1
echo "=== Kết thúc backup lúc $(date) ===" >> $LOG_FILE
EOF
Cấp quyền thực thi cho script:
chmod +x /usr/local/bin/neo4j_backup.sh
Chạy thử script một lần để kiểm tra lỗi:
/usr/local/bin/neo4j_backup.sh
Kiểm tra log ngay lập tức:
tail -n 20 /var/log/neo4j_backup.log
Cấu hình Cron job để chạy lúc 2:00 sáng mỗi ngày. Mở crontab của user neo4j (hoặc root nếu script chạy bằng sudo):
crontab -u neo4j -e
Thêm dòng sau vào cuối file crontab (lưu ý phải có đường dẫn đầy đủ đến script):
0 2 * * * /usr/local/bin/neo4j_backup.sh
Verify cron job đã được lưu:
crontab -u neo4j -l
3. Thực hành khôi phục dữ liệu từ file backup
Khôi phục là bước quan trọng nhất để xác nhận file backup thực sự khả dụng khi sự cố xảy ra.
(1) Hành động: Dừng Neo4j, xóa dữ liệu hiện tại (trong môi trường test), và sử dụng lệnh neo4j-admin load để nạp lại dữ liệu từ file dump.
(2) Lý do: Lệnh load sẽ overwrite toàn bộ dữ liệu trong thư mục data của Neo4j. Cần xóa dữ liệu cũ để tránh xung đột hoặc dữ liệu bị lỗi (corruption).
(3) Kết quả mong đợi: Sau khi load xong, khi mở Neo4j Browser, dữ liệu (node, relationship) sẽ xuất hiện y hệt như thời điểm backup.
Cảnh báo: Bước này sẽ XÓA MẤT dữ liệu hiện tại trên server đang chạy. Chỉ thực hiện trên môi trường Test hoặc khi cần khôi phục khẩn cấp.
Dừng dịch vụ Neo4j:
systemctl stop neo4j
Xóa thư mục dữ liệu hiện tại (thay đổi đường dẫn nếu bạn cài đặt khác):
rm -rf /var/lib/neo4j/data/*
Thực hiện lệnh load từ file backup đã tạo ở phần 1 (thay thế tên file cho đúng):
neo4j-admin load --from=/var/backup/neo4j/neo4j_backup_$(ls -t /var/backup/neo4j/*.dump | head -n 1) --overwrite-confirmed
Khởi động lại dịch vụ:
systemctl start neo4j
Verify kết quả bằng cách kiểm tra số lượng node trong database:
neo4j-admin show-config | grep dbms.security.auth_enabled
cypher-shell "MATCH (n) RETURN count(n) as total_nodes;"
Nếu total_nodes > 0, quá trình khôi phục thành công.
4. Cấu hình Log Rotation để quản lý dung lượng disk
Neo4j tạo ra các file log (log, slow-log, query-log) rất lớn nếu không được quản lý, có thể làm đầy disk và gây sập server.
(1) Hành động: Tạo file cấu hình logrotate trong thư mục /etc/logrotate.d/ để tự động cắt và nén file log cũ.
(2) Lý do: Log rotation giúp giữ lại lịch sử log trong một khoảng thời gian nhất định (ví dụ 7 ngày) nhưng nén chúng lại để tiết kiệm dung lượng disk, đồng thời đảm bảo file log hiện tại không quá nặng.
(3) Kết quả mong đợi: File log cũ được nén (.gz), file log hiện tại được tạo mới, dung lượng disk ổn định theo thời gian.
Tạo file cấu hình /etc/logrotate.d/neo4j với nội dung hoàn chỉnh:
cat > /etc/logrotate.d/neo4j /dev/null 2>&1 || true
endscript
}
EOF
Giải thích các tham số:
daily: Thực hiện xoay log mỗi ngày.
rotate 7: Giữ lại 7 file log cũ.
compress: Nén file log cũ bằng gzip.
delaycompress: Chờ 1 chu kỳ sau mới nén file cũ nhất (để file mới nhất vẫn đọc được).
postrotate: Reload service Neo4j để nó nhận file log mới (tùy chọn nhưng tốt nhất).
Test cấu hình logrotate ngay lập tức (chế độ debug, không thực thi thật):
logrotate -d /etc/logrotate.d/neo4j
Thực thi mạnh ép logrotate chạy ngay để test (cẩn thận chỉ dùng khi cần test, không chạy thường xuyên):
logrotate -f /etc/logrotate.d/neo4j
Verify kết quả bằng cách kiểm tra danh sách file trong thư mục log:
ls -lh /var/log/neo4j/
Bạn sẽ thấy các file log.log.1.gz, log.log.2.gz... xuất hiện và file log.log hiện tại sẽ có kích thước nhỏ hơn.
Điều hướng series:
Mục lục: Series: Triển khai Database Graph với Neo4j và Ubuntu 24.04
« Phần 5: Quản lý dữ liệu nâng cao và tối ưu hóa truy vấn
Phần 7: Giải quyết sự cố phổ biến và các mẹo vận hành nâng cao »