Backup và Restore giữa 2 VPS bằng lệnh Rsync

Chức năng: Tự backup Source code + Database và đẩy sang VPS thứ 2 theo định kì. Tại VPS thứ 2 chỉ cần 1 câu lệnh sẽ tự động Restore.

Chú ý: Demo được thực hiện trên VPS Centminmod.

Tạm gọi VPS chính là VPS A, VPS phụ nhận file backup là VPS B có IP là: 192.168.0.1

I. BASIC

Trên VPS A.

Cài đặt rsync.

yum install -y rsync

Gõ tiếp

ssh-keygen -t dsa

Tới bước:  “Enter file in which to save the key (/root/.ssh/id_dsa):”

/root/.ssh/id_dsa_vps_a

Khi được hỏi

“Enter passphrase (empty for no passphrase):”
“Enter same passphrase again:”

Nhấn Enter

Copy Key vừa tạo sang VPS B bằng lệnh

scp /root/.ssh/id_dsa_vps_a.pub [email protected]:/root/

Tại VPS B

mkdir -p /root/.ssh/
touch -f /root/.ssh/authorized_keys
cat /root/id_dsa_vps_a.pub >> /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys

Tại VPS A

Đồng bộ hóa 2 thư mục /home/nginx/domains

rsync -aurzW -e "ssh -i /root/.ssh/id_dsa_vps_a" /home/nginx/domains [email protected]:/home/nginx/domains

Hẹn giờ đồng bộ hóa

crontab -e

Nhập (tự chạy đồng bộ hóa lúc 2h30 hàng ngày)

30 2 * * * rsync -aurzW -e "ssh -i /root/.ssh/id_dsa_vps_a" /home/nginx/domains [email protected]:/home/nginx/domains

Lưu và thoát

Ctrl + X --> Y --> Enter

II. Advanced

Nhiệm vụ là Backup toàn bộ Source và Database của Tất cả website bên VPS A, Đẩy sang VPS B và sau đó VPS B tự động Restore.

Chú ý: Tất cả đều thực hiện trên VPS nginx cài Centminmod, nên nếu bạn cài Apache hoặc gì gì đó thì tùy chỉnh thêm nhé.

Trên VPS A

Tạo 1 file backup.sh trong /root/ với nội dung như sau:

#!/bin/bash
{
printf "subject:Backup for VPS My_IP\nfrom:[email protected]\n\n"
echo "Deleting file Old Backups..."
rm -rf /var/backups
mkdir /var/backups/
chmod -R 777 /var/backups/
mkdir /var/backups/$(date +"%d-%m-%Y")/
mkdir /var/backups/$(date +"%d-%m-%Y")/websitecuaban.com/

echo "Starting backup database for websitecuaban.com..."
mysqldump --single-transaction --routines --triggers --add-drop-table --extended-insert -u usercuasql -h 127.0.0.1 -p'matkhau' tendatabase | gzip > /var/backups/$(date +"%d-%m-%Y")/websitecuaban.com/websitecuaban_$(date +"%d-%m-%Y")_database.sql.gz
echo "Starting backup files for websitecuaban.com..."
cd /home/nginx/domains/websitecuaban.com
zip -r /var/backups/$(date +"%d-%m-%Y")/websitecuaban.com/websitecuaban_$(date +"%d-%m-%Y")_source.zip public/ -q -x /public/wp-content/cache/**\*

echo "Starting backup database for All..."
passdata=`grep -oP "(?<=password=).*" ~/.my.cnf`
mysqldump -u root -p$passdata --all-databases | gzip > /var/backups/$(date +"%d-%m-%Y")/$(date +"%d-%m-%Y")_My_IP_database.sql.gz

echo "Starting Rsync to VPS Backup..."
rsync -aurzW -e "ssh -i /root/.ssh/id_dsa_vps_a" /usr/local/nginx/conf /var/backups/$(date +"%d-%m-%Y") [email protected]192.168.0.1:/var/backups

} | /usr/sbin/sendmail "[email protected]"

Bạn thay đổi phần màu đỏ cho phù hợp với VPS của bạn.

Trên VPS B

Tạo 1 file restore.sh trong /root/ với nội dung như sau:

#!/bin/bash
{
printf "subject:Restore for VPS\nfrom:[email protected]\n\n"
echo "Starting Restore source for All..."
day=22-12-2015
cd /var/backups/$day
find . -name "*.zip" | grep -oP "(?<=.).*/" | while read filename; do mkdir "/var/backups/"$day$filename"log/"; done;
yes | cp -rf /var/backups/$day/* /home/nginx/domains/
yes | cp -rf /var/backups/conf/* /usr/local/nginx/conf/
cd /home/nginx/domains
find . -name "*.zip" | while read filename; do unzip -o -d "`dirname "$filename"`" "$filename"; done;
find . -name *source.zip -exec rm -rf {} \;

echo "Starting Restore database for All..."
gunzip *.sql.gz
passdata=`grep -oP "(?<=password=).*" ~/.my.cnf`
mysql -u root -p$passdata < *.sql
find . -name "*database.sql" -exec rm -rf {} \;
find . -name "*database.sql.gz" -exec rm -rf {} \;
service nginx restart
} | /usr/sbin/sendmail "[email protected]"

Bạn thay đổi phần màu đỏ cho phù hợp với VPS của bạn.

Cấu hình Crontab cho chạy tự động, trong trường hợp VPS A có vấn đề là 1-2 phút sau mình đã có VPS B để dự phòng rồi.

Done!

12 thoughts on “Backup và Restore giữa 2 VPS bằng lệnh Rsync”

  1. Chào bạn Triều, mình comment không liên quan chút nhưng vì không tìm thấy contact của bạn. Mình rất cảm ơn vì bạn đã đặt link ở footer tới blog khuetran.net của mình nhưng vì Google mới phạt mình nên hiện tại các site của mình luôn dưới theo dõi, được mọi người ưu ái nhưng mình không dám đặt link tới blog. Bạn có thể địa chỉ blog thay vì tên mình và không đặt link tới blog của mình bạn nhé. Cảm ơn bạn rất nhiều!

    1. Chào bạn Khuê Trần !
      Mình không hiểu ý của bạn lắm có thể do cách viết, nhưng Blog của bạn rất hữu ích cho các Startup và mình muốn giới thiệu cho mọi người. Đây là chia sẽ tự nhiên không vì lợi ích hay trao đổi, nên bạn không cần phải áy náy vì không đặt link của mình trên website của bạn.
      Tất nhiên nếu bạn thấy link đặt ở TangDuongTrieu.Com có thể ảnh hưởng đến quá trình SEO hoặc xếp hạng tìm kiếm trên Google hãy cho mình biết, mình sẽ remove theo yêu cầu của bạn.
      Thân !

      1. Chào bạn, ý mình là mình rất thích bạn thêm blog của mình vào danh sách blog hay có điều do mình mới bị Google phạt nên lo trước, nhưng thôi không sao vì mình nghĩ là blog của m chia sẻ ae quen biết vào đọc ko quan trọng việc SEO nữa, cảm ơn bạn nhiều!

      1. Em làm hết cái các bước của BASIC mà nó vẫn hỏi pass khi copy ạ, với cho em hỏi thêm 1 cái ngoài lề là CURL em cho chạy vào crontab mà nó không nhận.
        VD: 30 2 * * * php -q /path/to/cron.php
        Hay là thằng CURL nó không chạy cron được
        Cám ơn bác nhiều

        1. Cái CURL đã xong còn cái sử dụng SCP key copy giữa 2 VPS mà không hỏi pass thì em chưa làm được, mong được chỉ giáo

        2. à cái copy key đó chỉ làm 1 lần ở bước setup ban đầu, nên bạn nhập Pass của VPS B nhé.
          Các lần sau không cần làm bước đó nữa.

          Còn về phần Curl nó khồng nằm trong phạm vi bài viết này. Nhưng sau khi add xong kiểm tra xem đã add được chưa bằng lệnh

          crontab -l

          Sau đó bạn chạy lệnh này để khởi động lại crontab xem sao:

          service crond start
          service crond restart
          chkconfig crond on

          Để test thử crontab có hoạt động không bạn có thể set thời gian là 3-5 phút chạy 1 lần để kiểm tra thực tế.

          1. Mình làm đến bươc “Đồng bộ hóa 2 thư mục /home/nginx/domains” phải nhập paas vào, sau chạy lại lệnh đồng bộ vẫn bắt nhập pass nữa
            Kiểm tra thì không làm thiếu bước nào cả.

          2. Vậy bạn có thể xem lại bước copy key.
            scp /root/.ssh/id_dsa_vps_a.pub [email protected].0.1:/root/
            Quá trình này nó sẽ đẩy file id_dsa_vps_a.pub sang VPS B có IP là 192.168.0.1 đổi IP VPS B của bạn vào đây.

            Tiếp đến sau khi xác nhận có file id_dsa_vps_a.pub trong thư mục root của VPS B thì tiến hành làm các bước.
            mkdir -p /root/.ssh/
            touch -f /root/.ssh/authorized_keys
            cat /root/id_dsa_vps_a.pub >> /root/.ssh/authorized_keys
            chmod 644 /root/.ssh/authorized_keys

            Mình nghĩ bạn chưa tạo được file authorized_keys để xác nhận tự động đăng nhập nên nó mới hỏi Pass.

            Bạn xem lại thử nhé !

  2. Ban ơi đủ hết các file như bạn có ghi ở trên mà vẫn hỏi pass, mình có mở thử 2 file key của 2 VPS lên thì nội dung là giống nhau, mình làm lại 2 lần mà vẫn như vậy.

Không cho phép ghi chú.