使用rsync實現全網數據備份(模擬生產環境)+郵件告知php
項目要求來源於網絡:http://oldboy.blog.51cto.com/2561410/1856048html
假定3臺服務器主機名分別爲web01、backup、nfs01,主機信息以下表:linux
服務器說明nginx |
內網IPweb |
主機名算法 |
nginx web服務器shell |
192.168.1.222vim |
WEB-01bash |
NFS存儲服務器服務器 |
192.168.1.233 |
NFS-01 |
rsync備份服務器 |
192.168.1.244 |
BACKUP |
要求:天天晚上00點整在Web服務器上打包備份系統配置文件、網站程序目錄及訪問日誌並經過rsync命令推送備份服務器backup上備份保留(備份思路能夠是先在本地按日期打包,而後再推到備份服務器backup上),NFS存儲服務器同Web服務器,實際工做中就是所有的服務器。
具體要求以下:
1)全部服務器的備份目錄必須都爲/backup。
2)要備份的系統配置文件包括但不限於:
a.定時任務服務的配置文件(/var/spool/cron/root)(適合web和nfs服務器)。
b.開機自啓動的配置文件(/etc/rc.local)(適合web和nfs服務器)。
c.平常腳本的目錄 (/server/scripts)(適合web和nfs服務器)。
d.防火牆iptables的配置文件(/etc/sysconfig/iptables)。
e.本身思考下還有什麼須要備份呢?
3)Web服務器站點目錄假定爲(/var/html/www)。
4)Web服務器A訪問日誌路徑假定爲(/app/logs)
5)Web服務器保留打包後的7天的備份數據便可(本地留存不能多於7天,由於太多硬盤會滿)
6)備份服務器上,保留每週一的全部數據副本,其它要保留6個月的數據副本。
7)備份服務器上要按照備份數據服務器的內網IP爲目錄保存備份,備份的文件按照時間名字保存。
8)*須要確保備份的數據儘可能完整正確,在備份服務器上對備份的數據進行檢查,把備份的成功及失敗結果信息發給系統管理員郵箱中:
特別提示:本題在工做中是網站生產環境全網備份項目方案的一個小型模擬,頗有意義。
--準備好相應的機器(修改好機器名,關閉iptables,selinux,配置好yum源),並配置好相應的host解析,相同的時間(這裏上臺機子都已配置完成)
--host 解析
[root@backup ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.222 web01
192.168.1.233 nfs01
192.168.1.244 backup #添加
--使用ntpdate實現時間同步
[root@nfs-01 ~]# yum install ntpdate
[root@nfs-01 ~]# vim ntpdate.sh #腳本複製好用執行一遍讓時間一致
#!/bin/bash
ntpdate time.nist.gov
hwclock -w
[root@nfs-01 nfs-01 ~]# crontab -e
* * * * 1 /root/time.sh #每週同步一次
1、搭建rsync服務端(blackup服務器)
1.1.安裝rsync
[root@backup ~]# yum install rsync -y
1.2.修改/etc/xinetd.d/rsync
[root@backup ~]# vim /etc/xinetd.d/rsync
1.3.配置/etc/rsyncd.conf(須要手動生成)
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync #rsync以什麼用戶啓動
gid = rsync #rsync 以什麼組啓動
use chroot = no
max connections = 200 #最大鏈接數
timeout = 300 #超時時間
pid file = /var/run/rsyncd.pid #pid文件路徑
lock file = /var/run/rsync.lock #指定lock文件
log file = /var/log/syncd.log #日誌文件
[backup]
path = /backup/ #back目錄
ignore errors #忽略錯誤
read only = no #是否字符(若從客戶端同步到服務器必須設爲no)
list = no #在否容許列表
hosts allow = 192.168.1.0/24 #容許的ip端
auth users = rsync_backup #認證的用戶,服務器必須存在這個系統用戶
secrets file = /etc/rsync.password #指定用戶密碼文件
#以上配置文件需去除註釋才能直接複製,不然報錯
1.4.建立用戶,及目錄
[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@blackup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup
1.5.建立密碼文件
[root@backup ~]# vim /etc/rsync.password
rsync_backup:123456 #虛擬用戶及密碼
[root@backup ~]# chmod 600 /etc/rsync.password #權限必須爲600
1.6.啓動,添加開機啓動
[root@backup ~]# rsync --daemon
[root@backup ~]# ss -antup|grep rsync
[root@backup ~]# echo "/usr/bin/rsync --daemon">>/etc/rc.local #開機啓動
2.1客戶端配置(nfs01)
[root@nfs-01 ~]# yum install rsync -y
[root@nfs-01 ~]# mkdir /backup/
[root@nfs-01 ~]# touch /backup/1.txt #建立個測試文件
[root@nfs-01 ~]# echo "123456" >/etc/rsync.password #建立密碼文件
[root@nfs-01 ~]# chmod 600 /etc/rsync.password
[root@nfs-01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password
3.1客戶端配置(web01)
[root@web-01 ~]# yum install rsync -y
[root@web-01 ~]# mkdir /backup/
[root@web-01 ~]# touch /backup/2.txt
[root@web-01 ~]# echo "123456" >/etc/rsync.password
[root@web-01 ~]# chmod 600 /etc/rsync.password
[root@web-01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password
3.2模擬真實生產環境建立些文件
[root@web-01 ~]# mkdir -p /var/html/www
[root@web-01 ~]# touch /var/html/www/{1..10}
[root@web-01 ~]# mkdir -p /app/logs
[root@web-01 ~]# touch /app/logs/{1..g}
3.3建立備份腳本
[root@web-01 ~]# mkdir /server/scripts -p
[root@web-01 ~]# vim /server/scripts/sh.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
ip=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}') #獲取ip
backpath=/backup/ #備份目錄
name=`hostname` #主機名
mkdir -p $backpath/$ip
#判斷週一
if [ $(date +%w) -eq 2 ];then
date="$(date +%F -d "-1day")_week1"
else
date="$(date +%F -d "-1day")"
fi
cd / #切換到根目錄並回車
tar zcf $backpath/$ip/$name"_"${date}"_sysconfig".tar.gz var/spool/cron/ etc/rc.d/rc.local server/scripts/
tar zcf $backpath/$ip/$name"_"${date}"_data".tar.gz var/html/www/ #註釋掉,nfs服務器不須要備份web數據
tar zcf $backpath/$ip/$name"_"${date}"_logs".tar.gz app/logs/ #註釋掉,nfs服務器不須要備份web數據
find $backpath -type f -name "*.tar.gz"|xargs md5sum > $backpath/$ip/flag_$ip"_"${date} #給文件打標記
#備份到balackup服務器
rsync -az $backpath rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password
#刪除7天譴數據
find $backpath -type f -mtime +7|xargs rm -f
[root@web-01 ~]# crontab -e
00 00 * * * /bin/sh /server/scripts/sh.sh >/dev/null 2>&1 #添加
3.4建立定時任務,並將腳本文件複製到其餘服務器並修改(nfs01)
[root@nfs-01 ~]# mkdir -p /server/scripts/
[root@nfs-01 ~]# vim /server/scripts/sh.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
ip=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}') #獲取ip
backpath=/backup/ #備份目錄
name=`hostname` #主機名
mkdir -p $backpath/$ip
#判斷週一
if [ $(date +%w) -eq 2 ];then
date="$(date +%F -d "-1day")_week1"
else
date="$(date +%F -d "-1day")"
fi
cd / #切換到根目錄並回車
tar zcf $backpath/$ip/$name"_"${date}"_sysconfig".tar.gz var/spool/cron/ etc/rc.d/rc.local server/scripts/
#tar zcf $backpath/$ip/$name"_"${date}"_data".tar.gz var/html/www/ #註釋掉,nfs服務器不須要備份web數據
#tar zcf $backpath/$ip/$name"_"${date}"_logs".tar.gz app/logs/ #註釋掉,nfs服務器不須要備份web數據
find $backpath -type f -name "*.tar.gz"|xargs md5sum > $backpath/$ip/flag_$ip"_"${date} #給文件打標記
#備份到balackup服務器
rsync -az $backpath rsync://rsync_backup@192.168.1.244/backup --password-file=/etc/rsync.password
#刪除7天譴數據
find $backpath -type f -mtime +7|xargs rm -f
[root@nfs-01 ~]# crontab -e
00 00 * * * /bin/sh /server/scripts/sh.sh >/dev/null 2>&1 #添加
設置個就近的時間後查看nfs-01,web-01,可否正常推數據
[root@backup ~]# ls /backup/
4、mailx使用外部的SMTP來實現blackup服務器郵件報警
mailx是一個小型的郵件發送程序
具體步驟以下:
4.1、安裝
[root@blackup ~]# yum install mailx
4.2、編輯配置文件
[root@blackup ~]# vim /etc/mail.rc #添加以下內容
set from=xxxx@126.com
set smtp=smtp.126.com
set smtp-auth-user=xx@126.com
set smtp-auth-password=xxx
set smtp-auth=login
---說明
from:對方收到郵件時顯示的發件人
smtp:指定第三方發郵件的smtp服務器地址
set smtp-auth-user:第三方發郵件的用戶名
set smtp-auth-password:用戶名對應的密碼,有些郵箱須要填受權嗎
smtp-auth:SMTP的認證方式,默認是login,也能夠改爲CRAM-MD5或PLAIN方式
4.3、測試
[root@001 ~]# init 6
[root@001 ~]# mail -s "hesaucaq" xx@qq.com < /etc/passwd
[root@001 ~]# echo "測試郵件" | mail -s "測試" xxxxx@qq.com
轉自:http://www.cnblogs.com/imweihao/p/7250500.html
以上已經實現了發郵件功能!!!
4.4、在(backup)編輯腳本實現報警
[root@blackup ~]# mkdir -p /server/scripts/
[root@blackup ~]# cd !$
腳本以下:
#!/bin/bash
export LANG=en
ip1="192.168.1.222"
ip2="192.168.1.233" #機器增長需加更多的ip
logpath=/tmp/flag.log #日誌文件地址,後面彙總到這個文件來發送
#判斷週一
if [ $(date +%w) -eq 2 ];then
date="$(date +%F -d "-1day")_week1"
else
date="$(date +%F -d "-1day")"
fi
find /backup/$ip1 -name flag_$ip1"_"${date}|xargs md5sum -c &> $logpath
find /backup/$ip2 -name flag_$ip2"_"${date}|xargs md5sum -c &>> $logpath #需更改爲ip2和追加
find /backup/$ip1 -type f -name "*.tar.gz" -a ! -name "*week*" -mtime +180|xargs rm -f
find /backup/$ip2 -type f -name "*.tar.gz" -a ! -name "*week*" -mtime +180|xargs rm -f #須要更改爲ip2
mail -s "backup`date`" imweihao@126.com < $logpath #彙總到一個文件發送
[root@blackup scripts]# crontab -e
10 00 * * * /bin/sh /server/scripts/mail.sh >/dev/null 2>&1 #之間最好錯開,若是數據量大的話可能須要時間
測試:
設置兩個時間點,週一和週二的日期看是否正常,有些時候太會收不到郵件,那是由於被網易的垃圾郵件機制屏蔽了,一會再試,或者發到本身郵箱!
---以上已實現多機數據備份及郵件告警若是須要增長機器或者增長備份的數據,在腳本中添加便可
---附1:Rsync的命令格式能夠爲如下六種:
Rsync的命令格式能夠爲如下六種:
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
對應於以上六種命令格式,rsync有六種不一樣的工做模式:
對應於以上六種命令格式,rsync有六種不一樣的工做模式:
1)拷貝本地文件。當SRC和DES路徑信息都不包含有單個冒號」:」分隔符時就啓動這種工做模式。如:rsync -a /data /backup
2)使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號」:」分隔符時啓動該模式。如:rsync -avz *.c foo:src
3)使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號」:」分隔符時啓動該模式。如:rsync -avz foo:src/bar /data
4)從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含」::」分隔符時啓動該模式。如:rsync -avzP root@172.16.78.192::www /databack
5)從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含」::」分隔符時啓動該模式。如:rsync -avzP /databack root@172.16.78.192::www
6)列遠程機的文件列表。這相似於rsync傳輸,不過只要在命令中省略掉本地機信息便可。如:rsync -v rsync://172.16.78.192/www
rsync參數的具體解釋以下:
正常狀況下會使用 -avz至關與-vzrtopgD1,表示同步時文件和目錄屬性不變
-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞歸模式處理
-R, --relative 使用相對路徑信息
-b, --backup 建立備份,也就是對於目的已經存在有一樣的文件名時,將老的文件從新命名爲~filename。可使用--suffix選項來指定不一樣的備份文件前綴。
--backup-dir 將備份文件(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份文件前綴
-u, --update 僅僅進行更新,也就是跳過全部已經存在於DST,而且文件時間晚於要備份的文件。(不覆蓋更新的文件)
-l, --links 保留軟連接
-L, --copy-links 想對待常規文件同樣處理軟鏈結
--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹之外的鏈結
--safe-links 忽略指向SRC路徑目錄樹之外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持文件權限
-o, --owner 保持文件屬主信息
-g, --group 保持文件屬組信息
-D, --devices 保持設備文件信息
-t, --times 保持文件時間信息
-S, --sparse 對稀疏文件進行特殊處理以節省DST的空間
-n, --dry-run現實哪些文件將被傳輸
-W, --whole-file 拷貝文件,不進行增量檢測
-x, --one-file-system 不要跨越文件系統邊界
-B, --block-size=SIZE 檢驗算法使用的塊尺寸,默認是700字節
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行數據同步
--rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息
-C, --cvs-exclude 使用和CVS同樣的方法自動忽略文件,用來排除那些不但願傳輸的文件
--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新建立的文件
--delete 刪除那些DST中SRC沒有的文件
--delete-excluded 一樣刪除接收端那些被該選項指定排除的文件
--delete-after 傳輸結束之後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個文件
--partial 保留那些因故沒有徹底傳輸的文件,以是加快隨後的再次傳輸
--force 強制刪除目錄,即便不爲空
--numeric-ids 不將數字的用戶和組ID匹配爲用戶名和組名
--timeout=TIME IP超時時間,單位爲秒
-I, --ignore-times 不跳過那些有一樣的時間和長度的文件
--size-only 當決定是否要備份文件時,僅僅察看文件大小而不考慮文件時間
--modify-window=NUM 決定文件是否時間相同時使用的時間戳窗口,默認爲0
-T --temp-dir=DIR 在DIR中建立臨時文件
--compare-dest=DIR 一樣比較DIR中的文件來決定是否須要備份
-P --progress 顯示備份過程及傳輸進度
-z, --compress 對備份的文件在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不須要傳輸的文件模式
--include=PATTERN 指定不排除而須要傳輸的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 綁定到特定的地址
--config=FILE 指定其餘的配置文件,不使用默認的rsyncd.conf文件
--port=PORT 指定其餘的rsync服務端口
--blocking-io 對遠程shell使用阻塞IO
-stats 給出某些文件的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定日誌文件格式
--password-file=FILE 從FILE中獲得密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
-h, --help 顯示幫助信息
----附2:rsync 常見錯誤及解決方法
問題 @ERROR: chroot failed
@ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
緣由:服務器端的目錄不存在或無權限。
解決辦法:
建立目錄並修正權限可解決問題。
問題 skipping non-regular file
receiving incremental file list
skipping non-regular file "vendor/bin/doctrine"
skipping non-regular file "vendor/bin/doctrine.php"
sent 1990 bytes received 489209 bytes 327466.00 bytes/sec total size is 182515746 speedup is 371.57
緣由:source源文件有軟連接。
解決方法:修改成 rsync -va,其中 -a == -rlptgoD (no -H,-A,-X) 或者 rsync -rvltOD 也能夠。
解決後:
receiving incremental file list
vendor/bin/doctrine -> ../doctrine/orm/bin/doctrine
vendor/bin/doctrine.php -> ../doctrine/orm/bin/doctrine.php
sent 1998 bytes received 489279 bytes 327518.00 bytes/sec total size is 182515746 speedup is 371.51
問題@ERROR: module is read only
sending incremental file list
ERROR: module is read only
rsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [sender=3.0.6]
緣由:source源服務器端權限設置read爲only只讀權限。
解決方法:read only = false
問題@ERROR: auth failed on module tee
@ERROR: auth failed on module tee rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]
緣由:服務器端該模塊(tee)須要驗證用戶名密碼,但客戶端沒有提供正確的用戶名密碼,認證失敗。
解決方法:提供正確的用戶名密碼解決此問題。
問題 @ERROR: Unknown module 'tee_nonexists'
@ERROR: Unknown module 'tee_nonexists' rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]
緣由:服務器不存在指定模塊。
解決方法:提供正確的模塊名或在服務器端修改爲你要的模塊以解決問題。
問題 password file must not be other-accessible
password file must not be other-accessible
continuing without password file
Password:
緣由:這是由於rsyncd.pwd rsyncd.secrets的權限不對,應該設置爲600。
解決方法:chmod 600 rsyncd.pwd
問題 rsync: failed to connect No route to host
rsync: failed to connect to 192.168.1.10: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=3.0.6]
緣由:對方沒開機、防火牆阻擋、經過的網絡上有防火牆阻擋,都有可能。
解決方法:在iptables 中開放該端口,語句以下:
iptables -I INPUT -p tcp –dport 873 -j ACCEPT
rsync默認端口873,其實就是把tcp udp的873端口打開。
問題 rsync error: error starting client-server protocol
rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.6]
緣由:/etc/rsyncd.conf配置文件內容有錯誤。請正確覈對配置文件。
問題 rsync: chown "" failed: Invalid argument (22)
rsync: chown "" failed: Invalid argument (22)
緣由:權限沒法複製。去掉同步權限的參數便可。(這種狀況多見於Linux向Windows的時候)
問題 @ERROR: daemon security issue — contact admin
@ERROR: daemon security issue — contact admin rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]
緣由:同步的目錄裏面有權限不足的軟鏈接文件,須要服務器端的/etc/rsyncd.conf打開use chroot = yes。
問題 rsync: read error: Connection reset by peer (104)
rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.6]
解決:很大多是服務器端沒有開啓 rsync 服務,開啓服務。
問題 @ERROR: failed to open lock file
@ERROR: failed to open lock file rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.6]
解決:配置文件 rsync.conf 中添加 lock file = rsyncd.lock 便可解決。