การใช้งาน rsync สำหรับสำรองข้อมูลข้าม Server และภายใน Server แบบอัตโนมัติ

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

admin@bizqsoft.com

098-253-1845

จดโดเมน

@bizqsoft