需求:對服務(wù)器數(shù)據(jù)進(jìn)行實時備份蝶棋,不能丟失任何已生成數(shù)據(jù)
思路:需要新增一臺備份服務(wù)器,利用inotify監(jiān)測主服務(wù)器需要備份的目錄下的數(shù)據(jù)忽妒,有任何改動立即調(diào)用rsync進(jìn)行數(shù)據(jù)同步玩裙。并且在備份服務(wù)器上對同步數(shù)據(jù)每天進(jìn)行定時備份(如果兩臺都是阿里云服務(wù)器,建議開通內(nèi)網(wǎng)通訊段直,這樣不會影響外網(wǎng)流量而且傳輸速度很快)
server name | IP |
---|---|
主服務(wù)器 | 171.12.13.36 |
備份服務(wù)器 | 171.12.13.37 |
安裝調(diào)試inotify(主服務(wù)器)
安裝inotify步驟參考:https://blog.51cto.com/sndapk/1252218
調(diào)試rsync
ubuntu 16.04默認(rèn)已安裝rsync吃溅,rsync服務(wù)默認(rèn)不是啟動的,我們要修改rsync文件鸯檬。
sudo vim /etc/default/rsync
1.修改配置項:
RSYNC_ENABLE=true #false改true
2.備份端創(chuàng)建賬號密碼文件决侈,主服務(wù)器端只需創(chuàng)建密碼文件
備份端創(chuàng)建:
vim /etc/rsyncd.secret
JackMa:wobuxihuanqian
主服務(wù)器創(chuàng)建:
vim /etc/rsyncd.pwd
wobuxihuanqian
3.創(chuàng)建配置文件(備份端)
將rsyncd.conf 復(fù)制到/etc目錄下,并進(jìn)行配置
sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
sudo vi /etc/rsyncd.conf
#日志存放地址
log file=/home/hyperledger_data/rsync_logs/rsync_log
pid file=/var/run/rsyncd.pid
syslog facility=daemon
#以下配置的代表名稱
[demo]
comment = demo
path = /home/hyperledger_data/volumes/
use chroot = no
lock file = /var/lock/rsyncd
read only = no
list = yes
uid = 0
gid = 0
#用戶名
auth users = JackMa
#密碼文件地址
secrets file = /etc/rsyncd.secret
strict modes = yes
#允許同步的客戶端地址
hosts allow = 171.12.13.36
ignore errors = yes
ignore nonreadable = yes
transfer logging = yes
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
#refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.
4.兩邊均啟動rsync服務(wù),并設(shè)置成開機(jī)啟動
service rsync start
update-rc.d rsync defaults 90
5.在主服務(wù)器端先執(zhí)行一次全量同步颜及,看下rsync能不能用
#-a 歸檔模式痊土,表示遞歸傳輸并保持文件屬性
#-v 顯示rsync過程中詳細(xì)信息
#-z 傳輸時進(jìn)行壓縮提高效率
#-R 在備份端創(chuàng)建絕對路徑上的所有目錄
rsync -avzR --password-file=/etc/rsync.pwd /var/lib/docker/volumes/ JackMa@171.12.13.37::demo
編寫實時同步腳本(主服務(wù)器)
本腳本參考自:http://www.ttlsa.com/web/let-infotify-rsync-fast/
vim /home/backups_script/rsync_scripts
#!/bin/bash
src=/var/lib/docker/volumes/ # 需要同步的源路徑
des=demo # 目標(biāo)服務(wù)器上 rsync --daemon 發(fā)布的名稱,rsync --daemon這里就不做介紹了,網(wǎng)上搜一下痰娱,比較簡單鲸睛。
rsync_passwd_file=/etc/rsync.pwd # rsync驗證的密碼文件
ip1=171.12.13.37 # 目標(biāo)服務(wù)器1
user=JackMa # rsync --daemon定義的驗證用戶名
cd ${src} # 此方法中拳亿,由于rsync同步的特性,這里必須要先cd到源目錄,inotify再監(jiān)聽 ./ 才能rsync同步后目錄結(jié)構(gòu)一致瞬雹,有興趣的同學(xué)可以進(jìn)行各種嘗試觀看其效果
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move $src | while read file # 把監(jiān)控到有發(fā)生更改的"文件路徑列表"循環(huán)
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify輸出切割 把事件類型部分賦值給INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify輸出切割 把文件路徑部分賦值給INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加胖缤、修改初烘、寫入完成哆料、移動進(jìn)事件
#增唬渗、改放在同一個判斷卒稳,因為他們都肯定是針對文件的操作,即使是新建目錄,要同步的也只是一個空目錄份企,不會影響速度降宅。
if [ "$INO_EVENT" = "CREATE" ] || [ "$INO_EVENT" = "MODIFY" ] || [ "$INO_EVENT" = "CLOSE_WRITE" ] || [ "$INO_EVENT" = "MOVED_TO" ];then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} # INO_FILE變量代表路徑哦 -c校驗文件內(nèi)容
#仔細(xì)看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})變量 即每次只針對性的同步發(fā)生改變的文件的目錄(只同步目標(biāo)文件的方法在生產(chǎn)環(huán)境的某些極端環(huán)境下會漏文件 現(xiàn)在可以在不漏文件下也有不錯的速度 做到平衡) 然后用-R參數(shù)把源的目錄結(jié)構(gòu)遞歸到目標(biāo)后面保證目錄結(jié)構(gòu)一致性
fi
#刪除瘸恼、移動出事件
if [ "$INO_EVENT" = "DELETE" ] || [ "$INO_EVENT" = "MOVED_FROM" ];then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
#看rsync命令 如果直接同步已刪除的路徑${INO_FILE}會報no such or directory錯誤 所以這里同步的源是被刪文件或目錄的上一級路徑冰啃,并加上--delete來刪除目標(biāo)上有而源中沒有的文件扇调,這里不能做到指定文件刪除碳柱,如果刪除的路徑越靠近根涎拉,則同步的目錄月多季俩,同步刪除的操作就越花時間店归。這里有更好方法的同學(xué)肄满,歡迎交流汇陆。
fi
#修改屬性事件 指 touch chgrp chmod chown等操作
if [ "$INO_EVENT" = "ATTRIB" ];then
echo 'ATTRIB'
if [ ! -d "$INO_FILE" ] # 如果修改屬性的是目錄 則不同步毡代,因為同步目錄會發(fā)生遞歸掃描,等此目錄下的文件發(fā)生同步時导梆,rsync會順帶更新此目錄看尼。
then
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
fi
fi
done
~
將實時腳本設(shè)置成開機(jī)自啟動
vim /etc/rc.local
#這句話加在exit0之前
nohup bash /home/backups_script/rsync_scripts >> /home/backups_script/rsync.log 2>&1 &
編寫定時備份腳本(備份端)
vim /home/hyperledger_data_bakup/backup.sh
#!/bin/bash
bak_dir=/home/hyperledger_data_bakup
tmp_dir=/home/hyperledger_data_bakup/tmp
target_dir=/home/hyperledger_data
#創(chuàng)建一個臨時文件(要保存?zhèn)浞莸穆窂剑?mkdir $tmp_dir
#數(shù)據(jù)存在backups目錄下藏斩,備份到beifen目錄下媳拴,所以先將數(shù)據(jù)拷過來
cp -r $target_dir $tmp_dir
#將數(shù)據(jù)所在文件夾beifen打包
tar -zcPvf $bak_dir/backup$(date +%Y%m%d).tar.gz $tmp_dir
#刪除臨時文件內(nèi)容
rm -rf $tmp_dir
#刪除改文件夾下超過10天的文件
find $bak_dir -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
~
利用crontab進(jìn)行定期執(zhí)行備份腳本
crontab -e
#每天的凌晨兩點(diǎn)對同步數(shù)據(jù)進(jìn)行全量備份
0 2 * * * bash /home/hyperledger_data_bakup/backup.sh