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
Gõ
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") root@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!
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!
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 !
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!
Bác ơi sao em làm khi chạy nó vẫn hỏi pass vậy ạ, làm không thiếu bước nào cả ạ :(
Làm tới buớc nào vậy bác?
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
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
à 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ế.
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ả.
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é !
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.
Note lại để làm theo
chào admin.
bạn cho mình hỏi làm sao chỉ để tầm 5 file backup gần nhất thôi nhỉ,
nó sẽ tự động xóa các backup cũ đi ý.
thanks you