rsync เป็นโปรโตคอลที่สร้างขึ้นสำหรับระบบยูนิกซ์เหมือนที่ให้ความคล่องตัวที่ไม่น่าเชื่อสำหรับการสำรองข้อมูลและซิงโครไนซ์ข้อมูล สามารถใช้ในการสำรองไฟล์ไปยังไดเร็กทอรีอื่นหรือสามารถกำหนดค่าให้ซิงค์ผ่านอินเทอร์เน็ตไปยังโฮสต์อื่นได้
rsync สามารถ Backup ข้อมูล Directory หนึ่งไปยังอีก Directory ทำงานได้หลายโหมด และสามารถใช้ร่วมกับ ssh ก็สามารถ Backup ไฟล์ข้าม Server ได้ ซึ่ง rsync มีให้ใช้กับทุก OS นั่นหมายความว่าเรา สามารถ Backup Directory ข้าม Server ข้าม OS ได้
Linux ต้องติดตั้งโปรแกรม rsync
apt-get install rsync
Backup ในเครื่อง server เดียวกัน
เช่น ต้องการ backup ข้อมูลใน /var/www/html มาไว้ที่ /backup/xxx ใช้คำสั่ง
rsync -av --delete /var/www/html/ /backup/xxx/
"คำสั่งด้านบนจะทำการ sync ข้อมูลให้ตรงกันเนื้อหาของ /var/www/html/ ไปยัง /backup/xxx/ และถ้ามีการเปลี่ยนแปลง สร้างหรือลบ ใน /var/www/html/ ข้อมูลใน /backup/xxx/ จะเปลี่ยนแปลงเหมือนกันกับข้อมูลต้นฉบับ "
Backup จาก Server ไปไว้อีก Server
rsync -av --delete -e 'ssh -p 12345' root@192.168.0.1:/Directory2/ /Directory1/
เช่น rsync -av -e 'ssh -p 2233' root@43.241.57.186:/home/mysql/admin_db/ /home/mysql/admin_db/
#ผมตัด --delete ออกเพื่อความปลอดภัย
"คำสั่งด้านบน จะทำการ sync ข้อมูลจาก server ปลายทาง 43.241.57.186 ใน /home/mysql/admin_db/ มาไว้ในเครื่อง /home/mysql/admin_db/ ใน server ต้นทาง" (หรือเครื่องที่รันคำสั่ง)
ความหมาย Option แต่ละตัว
-a คือ archive ทำให้ ไฟล์ตันฉบับกับไฟล์ปลายทางเหมือนกันทุกอย่าง
-v คือ verbose ให้แสดงรายละเอียดระหว่างทำงานขึ้นมาบนหน้าจอ
--exclude คือไม่รวมไฟล์ .xxx ที่อยู่ใน Directory xxx
--delete ให้ลบไฟล์ปลายทางถ้าไฟล์ต้นทางถูกลบไป
-p เป็นการกำหนด port ssh กรณีที่ server เปลี่ยน port
การกำหนดให้ rsync backups อัตโนมัติ โดยใช้ crontab
#crontab -e
0 22 * * * rsync -av -e 'ssh -p 2233' root@43.241.57.186:/home/mysql/admin_db/ /home/mysql/admin_db/
//ใช้งาน
crontab -e 30 8 * * * ./rsyncdb.sh > backup.log
"คำสั่งด้านบน จะเป็นการตั้งเวลาในการ Backup ข้อมูล ทุกวันเวลา 4 ทุ่ม หรือ 22.00 น. จะทำการ sync ข้อมูลจาก server ปลายทาง 43.241.57.186 ใน /home/mysql/admin_db/ มาไว้ในเครื่อง /home/mysql/admin_db/ ใน server ต้นทาง"
** การ Sync โดย rsync กรณีที่ Network ขาดหรือหลุด จะหยุดทำงานทันที แล้วจะเริ่ม sync ใหม่ตามเวลาที่ตั้งไว้ **
ตัวอย่างการใช้งาน
step 1: เข้า terminal แล้วก็พิมพ์ vi /etc/crontab เพื่อแก้ไข crontab ที่จะใช้งาน รูปแบบการเขียน crontab คร่าวๆดังนี้
รูปแบบการกำหนดค่า : m h dom mon dow command
*** อธิบายเพิ่มเติม ***
............................................................................................................................................
Field ค่า รายละเอียด
............................................................................................................................................
m(minute) 0-59 เวลาเป็นนาที จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
h(hour) 0-23 เวลาเป็นชั่วโมง จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
dom(day of month) 1-31 เวลาเป็นวัน จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
mon(month) 1-12 เวลาเป็นเดือน จะสั่งให้คำสั่งที่กำหนดทำงานทันทีเมื่อถึง
dow(day of week) 0-6 วันของแต่ละสัปดาห์ มีค่าดังนี้(อาทิตย์=0,จันทร์=1,...,เสาร์=6)
command คำสั่ง เราสามารถกำหนดคำสั่งหรือ script ที่ต้องการรันลงไปได้ ............................................................................................................................................
step 2: เขียนคำสั่งลงไป เช่น
รูปแบบ
m h dom mon dow user command
0 0 * * * root /sbin/reboot
เป็นการสั่งให้รัน reboot script เวลา 24.00 น. ของทุกวัน โดยเครื่องหมาย * หมายถึงเอาทั้งหมด อย่างกรณีข้างต้น เครื่องหมาย * ตรง dom หมายถึงทำทุกๆวันของเดือน
step 3: หลังจากสร้าง crontab เสร็จก็ save พิมพ์ :wq แล้วก็ รันคำสั่ง reload
# /etc/ini.d/cron reload
หรือ
# service cron reload
ตัวอย่างการใช้งาน
0 17 * * * root /home/service.sh > /home/service.log
0 15 * * * root /home/service.sh > /home/service.log
0 12 * * * root /home/service.sh > /home/service.log
0 10 * * * root /home/service.sh > /home/service.log
30 7 * * * root /home/rsyncdb.sh > /home/backup.log
ไฟล์ service.sh
#!/bin/sh
killall httpd
echo "Start script on - "$(date+"%F") $(date + "%T")
service httpd restart
echo "End script on - "$(date+"%F") $(date + "%T")
สังให้เครื่องทำการ restart service httpd แล้วเขียน log ไปที่เก็บไว้ที่ /home/service.log
การใช้ shell script ข้าม Server โดยใช้ SSH
สร่้าง ssh key เพื่อไม่ให้ถามรหัสผ่าน ตอนเราใช้คำสั่ง ssh
step 1 รัน
ssh-keygen
step 2 ทำการคัดลอก keygen จาก step 1 ไปที่ server ปลายทาง
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2233 root@43.241.57.186
step 3 ทำการ ssh ไปที่เครื่องปลายทาง จะต้องไม่ถามให้ใส่รหัสผ่าน
ssh -p '2233' 'root@43.241.57.186
step 4 สร้าง shell script สำหรับ restart service
สร้างไฟล์ service .sh
#!/bin/sh
killall httpd
echo "Start script on - "$(date+"%F") $(date + "%T")
service httpd restart
echo "End script on - "$(date+"%F") $(date + "%T")
step 5 กำหนด perminssion
chmod a+x ./service.sh
step 6 ทดลองสั่งรันสคิป
./service.sh
step7 สั่งสคิปนี้ให้ run อัตโนมัติ โดยใช้ crontab
0 17 * * * root /home/service.sh > /home/service.log
0 15 * * * root /home/service.sh > /home/service.log
0 12 * * * root /home/service.sh > /home/service.log
0 10 * * * root /home/service.sh > /home/service.log
step8 ทำการ reload crontab
# service cron reload
การใช้ rsync เพื่อสำรองข้อมูลข้าม Server โดยใช้ SSH
สร่้าง ssh key เพื่อไม่ให้ถามรหัสผ่าน ตอนเราใช้คำสั่ง ssh
step 1 รัน
ssh-keygen
step 2 ทำการคัดลอก keygen จาก step 1 ไปที่ server ปลายทาง
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2233 root@43.241.57.186
step 3 ทำการ ssh ไปที่เครื่องปลายทาง จะต้องไม่ถามให้ใส่รหัสผ่าน
ssh -p '2233' 'root@43.241.57.186
step 4 สร้าง script สำหรับใช้งาน เช่นสั่งให้เครื่องปลายทาง restart service
สร้างไฟล์ rsyncdb .sh
#!/bin/sh
echo "Start script on - "$(date+"%F") $(date + "%T")
echo "start backup...."
rsync -av -e 'ssh -p 2233' root@43.241.57.186:/home/mysql/admin_db/ /home/mysql/admin_db/
mysqldump -u admin 1234 admin_db > /home/db.sql
echo "end backup."
echo "start copy database to backup server"
rsync -av -e 'ssh -p 2233' root@43.241.57.186:/home/mysql/admin_db/ /home/mysql/admin_db/
echo "End script on - "$(date+"%F") $(date + "%T")
step 5 กำหนด perminssion
chmod a+x ./rsyncdb.sh
step 6 ทดลองสั่งรันสคิป
./rsyncdb.sh
step7 สั่งสคิปนี้ให้ run อัตโนมัติ โดยใช้ crontab
30 7 * * * root /home/rsyncdb.sh > /home/backup.log
step8 ทำการ reload crontab
# service cron reload
#ข้อมูลเพิ่มเติม
https://arit.rmutsv.ac.th/th/blogs/82-วิธีการใช้-rsync-เพื่อสำรองข้อมูล-บน-linux-1052