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

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!

Dương Triều Blog © 2016