Logo
Featured Image

Tự Động Backup Database Kubernetes (K8s) Lên Google Drive Bằng Rclone

Author
Tobi 24/03/2026 4 views

Xây dựng hệ thống tự động trích xuất dữ liệu (dump) từ các Pod Database (MySQL) đang chạy trong Kubernetes, nén lại và tải lên Google Drive. Hệ thống có khả năng tự động báo lỗi và dọn dẹp các bản sao lưu cũ (Retention Policy) để tối ưu dung lượng.

⚙️ Bước 1: Cài đặt và kết nối Rclone với Google Drive

  1. Cài đặt Rclone trên VPS: Mở Terminal trên VPS và chạy lệnh:

    Bash
     
    curl https://rclone.org/install.sh | sudo bash
    
  2. Cấu hình kết nối (Thiết lập Headless): Gõ lệnh rclone config và làm theo các bước sau:

    • Bấm n (New remote) -> Đặt tên là gdrive.

    • Chọn loại lưu trữ là drive (Google Drive).

    • Các mục client_id, client_secret, service_account_file -> Để trống (Enter).

    • Cấp quyền truy cập: Chọn 1 (Full access).

    • Hỏi Edit advanced config? -> Chọn n.

    • ĐẶC BIỆT LƯU Ý: Hỏi Use web browser to automatically authenticate...? -> BẮT BUỘC chọn n (Vì VPS không có trình duyệt web).

  3. Xác thực Token:

    • VPS sẽ sinh ra một lệnh dạng rclone authorize "drive" "...".

    • Mở Terminal trên máy tính cá nhân (Mac/Windows đã cài sẵn rclone), dán lệnh đó vào và chạy.

    • Trình duyệt web trên máy tính sẽ mở ra để bạn đăng nhập Google. Đăng nhập xong, Terminal máy tính sẽ trả về một chuỗi Token rất dài.

    • Copy toàn bộ chuỗi Token đó, quay lại dán vào VPS và ấn Enter.

    • Chọn n ở mục Share Drive. Nhấn y để xác nhận cấu hình và q để thoát.

  4. Kiểm tra kết nối:

    rclone lsd gdrive:
    

    (Nếu màn hình hiện ra danh sách các thư mục trên Drive của bạn tức là đã thành công 100%).


💻 Bước 2: Viết kịch bản Backup "Bọc Thép"

Kịch bản này được thiết kế để hút dữ liệu từ cả 2 hệ thống: Web SMM (PHP) và hệ thống com.quyenlt (Java), đồng thời kiểm soát lỗi chặt chẽ.

  1. Tạo file script trên VPS:

    vi /root/backup-db.sh
    
  2. Dán đoạn mã chuẩn sau vào và lưu lại (các bạn nhớ kiểm tra và thay đổi lại thông tin database của mình nhé). Ở script này mình đang thiết lập chỉ giữ lại 7 bản gần nhất và tí nữa sẽ set cron chạy 2 ngày 1 lần, nên mình sẽ xóa các bản backup được tạo hơn 14 ngày :

    #!/bin/bash
    
    # 1. Cài đặt biến thời gian và thư mục
    DATE=$(date +"%Y-%m-%d_%H-%M")
    BACKUP_DIR="/root/db_backups"
    mkdir -p $BACKUP_DIR
    
    echo "================================================="
    echo "BẮT ĐẦU TIẾN TRÌNH BACKUP LÚC $DATE"
    echo "================================================="
    
    # Biến cờ hiệu theo dõi trạng thái
    STATUS_SMM="FAIL"
    STATUS_JAVA="FAIL"
    
    # 2. Hút data của Web SMM
    SMM_POD=$(kubectl get pods -l app=smm-db -o jsonpath="{.items[0].metadata.name}" 2>/dev/null)
    if [ -n "$SMM_POD" ]; then
        if kubectl exec $SMM_POD -- mysqldump -utobi -p"12345pass" smmtobi > $BACKUP_DIR/smm_db_$DATE.sql 2>/tmp/smm_error.log; then
            echo "✅ [SMM DB]: Dump dữ liệu THÀNH CÔNG!"
            STATUS_SMM="OK"
        else
            echo "❌ [SMM DB]: LỖI khi dump dữ liệu! Chi tiết lỗi:"
            cat /tmp/smm_error.log
        fi
    else
        echo "❌ [SMM DB]: KHÔNG TÌM THẤY POD!"
    fi
    
    # 3. Hút data của Web com.quyenlt (Java)
    JAVA_POD=$(kubectl get pods -l app=mysqldb -o jsonpath="{.items[0].metadata.name}" 2>/dev/null)
    if [ -n "$JAVA_POD" ]; then
        if kubectl exec $JAVA_POD -- mysqldump -uroot -p"12345pass" quyenlt > $BACKUP_DIR/java_db_$DATE.sql 2>/tmp/java_error.log; then
            echo "✅ [JAVA DB]: Dump dữ liệu THÀNH CÔNG!"
            STATUS_JAVA="OK"
        else
            echo "❌ [JAVA DB]: LỖI khi dump dữ liệu! Chi tiết lỗi:"
            cat /tmp/java_error.log
        fi
    else
        echo "❌ [JAVA DB]: KHÔNG TÌM THẤY POD!"
    fi
    
    # 4. Kiểm tra, Nén và Upload
    if [ "$STATUS_SMM" = "OK" ] || [ "$STATUS_JAVA" = "OK" ]; then
        TAR_FILE="$BACKUP_DIR/all_databases_$DATE.tar.gz"
        cd $BACKUP_DIR
        tar -czvf $TAR_FILE *.sql > /dev/null 2>&1
    
        echo "⏳ Bắt đầu upload lên Google Drive..."
        if rclone copy $TAR_FILE gdrive:Backup_VPS/; then
            echo "✅ [GDRIVE]: Upload THÀNH CÔNG!"
        else
            echo "❌ [GDRIVE]: LỖI khi upload lên Google Drive!"
        fi
    else
        echo "⚠️ [CẢNH BÁO]: Cả 2 Database đều lỗi, hủy bỏ nén và upload!"
    fi
    
    # 5. Dọn dẹp rác trên VPS (Giữ file local 14 ngày)
    rm -f $BACKUP_DIR/*.sql
    find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +14 -delete
    
    # 6. Dọn dẹp rác trên Google Drive (Xóa file Cloud cũ hơn 14 ngày)
    echo "⏳ Đang dọn dẹp file cũ trên Google Drive..."
    if rclone delete gdrive:Backup_VPS/ --min-age 14d; then
        echo "✅ [GDRIVE]: Đã dọn sạch các bản backup cũ hơn 14 ngày!"
    else
        echo "⚠️ [GDRIVE]: Lỗi dọn dẹp (Hoặc chưa có file quá hạn)."
    fi
    
    echo "================================================="
    echo "HOÀN TẤT TIẾN TRÌNH LÚC $(date +"%Y-%m-%d_%H-%M")"
    echo "================================================="
    
  3. Cấp quyền thực thi cho kịch bản:

    chmod +x /root/backup-db.sh
    


⏰ Bước 3: Thiết lập tự động hóa (Crontab)

Cài đặt lịch trình để VPS tự động chạy kịch bản 2 ngày 1 lần vào lúc 2:00 sáng.

  1. Mở trình quản lý Cron:

    crontab -e
    
  2. Thêm dòng lệnh sau vào cuối file:

    0 2 */2 * * /root/backup-db.sh >> /root/backup_cron.log 2>&1
    
  3. Lưu và thoát. (Để kiểm tra log sau khi hệ thống chạy tự động, sử dụng lệnh: cat /root/backup_cron.log)

Bình luận (0)

+ =
Zalo