定時任務和資料同步備份
1 定時任務
1.1 linux定時任務排程分為兩種
1、系統自動執行的任務工作
2、使用者執行的任務工作
crontab 適合週期性的執行任務
at 適合僅執行一次就結束的任務排程命令 對應的服務是atd,一般沒用,關閉
[[email protected] logrotate.d]# chkconfig --list atd
atd 0:關閉 1:關閉 2:關閉 3:啟用
anacron 以天為週期或者在系統每次開機後執行的任務工作,沒什麼用
1.2 linux定時任務crond服務
[[email protected] ~]# chkconfig --list crond
crond 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
PS:
crond 守護程序 一直執行著
crontab 設定命令 -l list -e edit編輯
crontab -e ==vi /var/spool/cron/root<=======crond對應的配置檔案
crontab -l ==cat /var/spool/cron/root
1.3 crond的配置引數詳解
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
定時任務中*所對應的時間引數 如上圖所示
* 每 * 19 * * * 每天19點
- 範圍 17-19 * 17-19 * * * 每天17到19點
, 分隔時段 * 17,18,19 * * * 每天17,18,19點
/n 每單位時間,n數字 */10 * * * * 每10分鐘
例如:30 3,12 * * * /bin/sh /scripts/test.sh 每天上午3點半和中午12點半執行此指令碼任務
30 */6 * * * /bin/sh /scripts/test.sh 每隔6個小時的半點時刻
30 8-18/2 * * * /bin/sh /scripts/test.sh 每天8點到18點之間每隔2個小時的半點時刻
強調:周和日儘量不要同時用,否則可能達不到想要的結果
案例:
編寫一個定時任務追加字元到指定檔案
* * * * * echo "wangxian">>/server/log/wangxian.txt [[email protected] ~]# mkdir -p /server/log/ [[email protected] ~]# echo "wangxian">>/server/log/wangxian.txt [[email protected] ~]# tail -f /server/log/wangxian.txt wangxian wangxian wangxian
1.4 定時任務總結
解答小結:
1、定時任務要加註釋
2、結尾不要有>/dev/null 2>&1 只針對上題
3、/server/log/必須存在
4、定時任務中的路徑一定要絕對路徑
5、crond服務必須開啟
6、指令碼習慣 /bin/sh /server/scripts/test.sh 習慣用/bin/sh 不用考慮指令碼檔案的執行許可權
7、生產任務程式不要隨意列印輸出資訊
8、定時任務執行的指令碼要規範路徑,配置定時任務要規範操作過程,防止出錯。
1)首先在命令列測試,然後複製到指令碼
2)然後測試指令碼,成功後複製指令碼的規範路徑到定時任務配置裡
3)先在測試環境下測試,然後正式環境部署
9、生產環境的指令碼結尾要考慮加>/dev/null 2>&1 因為指令碼執行會發郵件到臨時郵件目錄增加小檔案導致inode被佔用
/var/spool/postfix/maildrop/ C6郵件臨時目錄
10、定時任務命令或程式最好寫到腳本里執行
定時任務打包總結:
1、到目標內容的上級目錄打包
2、打包的頻率是分鐘,包名必須精確到分
3、確保命令列執行正確,然後寫到指令碼(複製)
4、定時任務命令或程式最好寫到腳本里執行
5、測試指令碼正確性(定時任務怎麼寫,命令列就怎麼測試)
6、指令碼測試好了,命令列的命令也要複製
7、定時任務,不要在螢幕輸出,可以列印到一個日誌檔案裡
例:*/2 * * * * /bin/sh /server/scripts/test1.sh >/tmp/test1.log 2>&1
通過crond定時任務服務日誌除錯定時任務(/var/log/cron)
tail -f /var/log/cron
1.5 定時任務生產應用問題
1、環境變數的問題
2、定時任務要用絕對路徑
3、指令碼許可權問題加/bin/sh
4、時間變數問題用反斜線\轉義,最好用指令碼(不需要轉義)
5、>/dev/null 2>&1問題
6、定時任務規則之前加註釋
7、避免不必要的程式及命令輸出
8、使用指令碼程式代替命令列做定時任務
9、切換到目標目錄的上一級打包目標
2 資料同步備份(rsync+inotify)
2.1 rsync簡介
Rsync全稱為remote synchronization,具有使本地和遠端兩臺主機之間的資料快速複製同步映象、遠端備份的功能,它可以增量拷貝。利用Rsync還可以實現刪除檔案和目錄的功能,總之,一個rsync相當於scp,cp,rm,但是還優於他們每一個命令。
Rsync是一款開源的、快速的、多功能的、可實現全量及增量的本地或遠端資料同步備份的優秀工具。
2.2 rsync常用引數說明
-v,--verbose 詳細模式輸出,傳輸時的進度等資訊
-z,--compress 傳輸時進行壓縮以提高傳輸效率
--compress-level=NUM 可按級別壓縮
-a,--archive 歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性,
-a = -rtopgD1
-r,--recursive 對子目錄以遞迴模式傳輸
-t,--times 保持檔案時間資訊
-o,--owner 保持檔案屬主資訊
-p,--perms 保持檔案許可權
-g,--group 保持檔案屬組資訊
-P,--progress 顯示同步的過程及傳輸時的進度等資訊
-D,--devices 保持裝置檔案資訊
-l,--links 保留軟連結
2.3 rsync工作模式
第一種工作模式:本地 local
rsync -avz /etc/hosts /tmp<======cp
rsync -avz --delete /null/ /tmp/ <======rm
第二種工作模式:remote shell
pull 拉 遠端==》本地 rsync -avzP -e 'ssh -p 22' [email protected]:/opt/ /tmp/
push 推 本地==》遠端 rsync -avzP -e 'ssh -p 22' /tmp/ [email protected]:/opt/
引數說明
1)-avz,表示同步時檔案和目錄屬性不變
2)-P 顯示同步的過程,可以用--progress替換
3)-e 'ssh -p 22' 表示通過ssh的通道傳輸資料,-p 22可以省略
4) [email protected]:/opt/ 遠端主機使用者地址路徑
5)/tmp/ 本地目錄
第三種工作模式:daemon
啟動服務
rsync --daemon
檢查服務啟動情況 873埠
[
[email protected] ~]# ps -ef|grep rsync root 1845 1 0 22:00 ? 00:00:00 rsync --daemon root 1852 1815 0 22:00 pts/0 00:00:00 grep rsync [[email protected] ~]# netstat -lntup|grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1845/rsync tcp 0 0 :::873 :::* LISTEN 1845/rsync [[email protected] ~]# ss -lntup|grep rsync tcp LISTEN 0 5 :::873 :::* users:(("rsync",1845,5)) tcp LISTEN 0 5 *:873 *:* users:(("rsync",1845,3)) [[email protected] ~]# lsof -i :873 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync 1845 root 3u IPv4 12538 0t0 TCP *:rsync (LISTEN) rsync 1845 root 5u IPv6 12539 0t0 TCP *:rsync (LISTEN)
增加傀儡使用者,改變許可權
[[email protected] ~]# useradd rsync -s /sbin/nologin [[email protected] ~]# id rsync uid=505(rsync) gid=505(rsync) 組=505(rsync) [[email protected] ~]# mkdir /backup [[email protected] ~]# chown -R rsync /backup/ [[email protected] ~]# ls -ld /backup/ drwxr-xr-x 2 rsync root 4096 6月 10 22:06 /backup/
建立密碼檔案,並設定密碼,修改密碼檔案的許可權,讓其他使用者不可讀
[[email protected] ~]# echo "rsync_backup:wangxin" >/etc/rsync.password [[email protected] ~]# cat /etc/rsync.password rsync_backup:wangxin [[email protected] ~]# chmod 600 /etc/rsync.password [[email protected] ~]# ll /etc/rsync.password -rw------- 1 root root 20 6月 10 22:10 /etc/rsync.password
2.4 rsync配置步驟總結
Rsync server
1、vi /etc/rsyncd.conf 加入一堆配置
2、建立rsync使用者,及共享目錄/backup
useradd rsync -s /sbin/nologin -M
3、建立密碼檔案
4、rsync --daemon 啟動服務
5、echo "rsync --daemon" >>/etc/rc.local 加入開機啟動
Rsync客戶端
1、建立密碼檔案
echo "wangxin" >/etc/rsync.password 只需要密碼
chmod 600 /etc/rsync.password
2、push:
rsync -avz /tmp/ [email protected]::backup --password-file=/etc/rsync.password
pull:
rsync -avz [email protected]::backup /tmp/ --password-file=/etc/rsync.password
::後面指的是模組[backup]
2.5指定rsync服務的監聽地址
[
[email protected] ~]# rsync --daemon --address=192.168.4.123 [[email protected] ~]# netstat -lntup|grep rsync tcp 0 0 192.168.4.123:873 0.0.0.0:* LISTEN
cat /var/log/rsyncd.log 看日誌排錯
2.6 rsync各項總結
rsync優點
1、增量備份同步,支援socket(daemon),集中備份
rsync缺點
1、大量小檔案同步的時候,比對時間比較長,有的時候,rsync程序停止
解決:1)打包同步 2)drbd(檔案系統同步,複製block)
2、同步大檔案,10G以上的大檔案有時也會有問題,中斷。未完整同步前,是隱藏檔案;同步完改名為正常檔案
rsync無差異同步
不建議使用,會造成本地或遠端檔案被刪除
rsync -avz --delete [email protected]::backup /tmp/ --password-file=/etc/rsync.password
如果是推,本地有,遠端就有;刪除本地,遠端消失;刪除遠端,本地無影響
如果是拉,遠端有,本地就有;刪除遠端,本地消失;刪除本地,遠端無影響
排除引數exclude
客戶端排除引數
--exclude=檔名 排除單個檔案
--exclude={a,b,c} 排除多個檔案
服務端排除引數
/etc/rsyncd.conf里加--exclude=檔名
2.7 rsync排錯思路
服務端:1.檢視rsync服務配置檔案路徑是否正確,/etc/rsyncd.conf
2.檢視配置檔案裡host allow,host deny,是否允許了客戶端訪問的IP網段
3.檢視配置檔案中path引數裡的路徑是否存在,許可權是否正確
4.檢視rsync服務是否啟動ps –ef|grep rsync,埠是否存在netstat –lntup|grep 873
5.檢視iptables防火牆和selinux是否開啟允許rsync服務通過
6.檢視服務端rsync配置的密碼檔案是否為600許可權,密碼檔案格式是否正確
7.如果是推送資料,檢視配置rsyncd.conf中使用者是否對模組下目錄有可讀寫許可權
客戶端:1.檢視客戶端rsync配置的密碼檔案是否為600的許可權,密碼檔案格式是否正確,注意:需要有密碼,並且和服務端的密碼一致
2.用telnet連線rsync伺服器ip地址873埠,檢視服務是否啟動
3.客戶端執行命令時,命令細節記清楚,雙冒號後面為模組名稱
2.8 rsyncd.conf配置引數
[[email protected] ~]# cat /etc/rsyncd.conf #Rsync server #created by wangxian 2017-06-10 ##rsyncd.conf start## uid = rsync gid = rsync use chroot = no max connections = 2000 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = false list = false hosts allow = 192.168.4.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password ######################################### [backup] comment = backup server by wangxian 21:34 2017-06-10 path = /backup
2.9 inotify
inotify安裝步驟
下載:
[[email protected] tools]#wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [[email protected] tools]# ls -l /proc/sys/fs/inotify/ 檢視當前系統是否支援inotify 總用量 0 -rw-r--r-- 1 root root 0 6月 11 13:22 max_queued_events -rw-r--r-- 1 root root 0 6月 11 13:22 max_user_instances -rw-r--r-- 1 root root 0 6月 11 13:22 max_user_watches
解壓
[[email protected] tools]# tar zxf inotify-tools-3.14.tar.gz [email protected] tools]# ls inotify-tools-3.14 inotify-tools-3.14.tar.gz
開始安裝
[[email protected] tools]# cd inotify-tools-3.14 [[email protected] inotify-tools-3.14]#./configure --prefix=/usr/local/inotify-tools-3.14
檢查是否有錯
[[email protected] inotify-tools-3.14]# echo $? 0 [[email protected] inotify-tools-3.14]# make && make install
檢查是否有錯
[[email protected] inotify-tools-3.14]# echo $? 0
做個軟連結使命令更短,又可以保留他的版本號
[[email protected] inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify-tools [[email protected] local]# cd /usr/local/inotify-tools [[email protected] inotify-tools]# ll
總用量 16
drwxr-xr-x 2 root root 4096 6月 11 13:27 bin drwxr-xr-x 3 root root 4096 6月 11 13:27 include drwxr-xr-x 2 root root 4096 6月 11 13:27 lib drwxr-xr-x 4 root root 4096 6月 11 13:27 share
inotifywait和inotifywatch
[[email protected] inotify-tools]# ll bin
總用量 88
-rwxr-xr-x 1 root root 44287 6月 11 13:27 inotifywait <=======重點
-rwxr-xr-x 1 root root 41409 6月 11 13:27 inotifywatch <=======重點
inotifywait:監控目錄變化的工具,執行後處於阻塞狀態,適合在shell指令碼中使用
inotifywatch:收集被監視的檔案系統使用度統計資料,指檔案系統事件發生的次數統計
inotifywait常用引數 inotifywait --help
-r recursive 遞迴查詢目錄
-q quiet 列印的資訊很少,僅僅列印監控事件的資訊
-m monitor 始終保持事件監聽狀態
-e event 事件(刪,增,改)
監控例項
[[email protected] inotify-tools]# /usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,close_write,delete /data 14/06/17 22:25 /data/test.txt 14/06/17 22:25 /data/test.txt
限制inotify的三個引數
在/proc/sys/fs/inotify目錄下有三個檔案,對inotify機制有一定的限制
max_user_watches: 設定inotifywait或inotifywatch命令可以監視的檔案數量(單程序)
max_user_instances: 設定每個使用者可以執行的inotifywait或inotifywatch命令的程序數
max_queued_events: 設定inotify例項事件event佇列可容納的事件數量
echo "50000000" >/proc/sys/fs/inotify/max_user_watches
echo "50000000" >/proc/sys/fs/inotify/max_queued_events
inotify總結
inotify優點:
可以配合rsync實現實時資料同步
inotify缺點:
併發如果大於200-300個檔案,同步就會有延遲。
監控到事件後,呼叫rsync同步是單程序的
運用inotify+rsync實現NFS到backup實時同步
/server/scripts/inotify_rsync.sh 編寫實時同步指令碼
/bin/sh /server/scripts/inotify_rsync.sh & 把指令碼的命令放進rc.local
3 資料同步備份(sersync)
3.1 sersync配置步驟詳解
建立sersync目錄結構
# mkdir /usr/local/sersync # mkdir /usr/local/sersync/conf # mkdir /usr/local/sersync/bin # mkdir /usr/local/sersync/log # tar zxvf sersync2.5_32bit_binary_stable_final.tar.gz # cd GNU-Linux-x86/ # cp confxml.xml /usr/local/sersync/conf # cp sersync2 /usr/local/sersync/bin
配置sersync
1.首先建立連線rsyncd的密碼檔案 # echo "123456" >/etc/rsync.pas # chmod 600 /etc/rsync.pas 2.配置confxml.xml # cd /usr/local/sersync/conf # vi confxml.xml 按照註釋進行修改 <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> # 設定本地IP和埠 <host hostip="localhost" port="8008"></host> # 開啟DUBUG模式 <debug start="false"/> # 開啟xfs檔案系統 <fileSystem xfs="false"/> # 同步時忽略推送的檔案(正則表示式),預設關閉 <filter start="false"> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> # 設定要監控的事件 <delete start="true"/> <createFolder start="true"/> <createFile start="true"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="true"/> <modify start="true"/> </inotify> <sersync> # 本地同步的目錄路徑 <localpath watch="/data"> # 遠端IP和rsync模組名 <remote ip="192.168.100.29" name="data"/> <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> # rsync指令引數 <commonParams params="-auvzP"/> # rsync同步認證 <auth start="true" users="user" passwordfile="/etc/rsync.pas"/> # 設定rsync遠端服務埠,遠端非預設埠則需開啟自定義 <userDefinedPort start="false" port="874"/><!-- port=874 --> # 設定超時時間 <timeout start="true" time="100"/><!-- timeout=100 --> # 設定rsync+ssh加密傳輸模式,預設關閉,開啟需設定SSH加密證書 <ssh start="false"/> </rsync> # sersync傳輸失敗日誌指令碼路徑,每隔60會重新執行該指令碼,執行完畢會自動清空。 <failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> # 設定rsync+crontab定時傳輸,預設關閉 <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression="*.PHP"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> # 設定sersync傳輸後呼叫name指定的外掛指令碼,預設關閉 <plugin start="false" name="command"/> </sersync> # 外掛指令碼範例 <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin> # 外掛指令碼範例 <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="http://pic.xoyo.com/cms"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head> 3.建立推送端sersync同步目錄 # mkdir /data 4.設定環境變數: # echo "export PATH=$PATH:/usr/local/sersync/bin/" >> /etc/profile # source /etc/profile 5.啟動sersync # sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml 注:重啟操作如下: # killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml 6.設定開機啟動 # echo "sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml" >> /etc/rc.local 驗證: (推送端) # cd /data # touch 1 2 3 4 5 # echo "test sersync" > 1 (接收端) # cd /data # ls -------------------- 1 2 3 4 5 -------------------- # cat 1 -------------------- test sersync --------------------
注:如果接收端伺服器本地建立或修改/data同步目錄下的檔案,當服務端進行目錄同步時則不會對接收端伺服器本地建立或修改的檔案產生影響。
7. 新增指令碼監控sersync是否正常執行
先建立/opt/check_sersync.sh檔案
vi /opt/check_sersync.sh #編輯,新增以下程式碼
-----------------------------------程式碼開始-----------------------------------------------
#!/bin/sh
sersync="/usr/local/sersync/sersync2"
confxml="/usr/local/sersync/confxml.xml"
status=$(ps aux |grep 'sersync2'|grep -v 'grep'|wc -l)
if [ $status -eq 0 ];
then
$sersync -d -r -o $confxml &
else
exit 0;
fi
:wq! #儲存退出
chmod -R 777 /opt/check_sersync.sh #新增指令碼執行許可權
vi /etc/crontab #編輯,在最後新增下面一行
*/5 * * * * root /home/crontab/check_sersync.sh > /dev/null 2>&1 #每隔5分鐘執行一次指令碼
service crond reload #重新載入服務
8.測試sersync實時觸發rsync同步指令碼是否正常執行
在源伺服器增加檔案,檢視目標伺服器是否同步
如果以上測試都通過,說明inotify實時觸發rsync同步指令碼執行正常
4 高併發資料實時同步方案小結
1、inotify+rsync (sersync) 檔案級別
2、drbd 檔案系統級別
3、第三方軟體的同步功能:mysql同步。oracle,mongodb
4、業務上,程式實現雙寫
5、業務邏輯解決