1 定時任務
1.1 linux定時任務調度分爲兩種
1、系統自動執行的任務工作
2、用戶執行的任務工作
crontab 適合週期性的執行任務
at 適合僅執行一次就結束的任務調度命令 對應的服務是atd,一般沒用,關閉
[root@localhost logrotate.d]# chkconfig --list atd
atd 0:關閉 1:關閉 2:關閉 3:啓用 4:啓用 5:啓用 6:關閉
anacron 以天爲週期或者在系統每次開機後執行的任務工作,沒什麼用
1.2 linux定時任務crond服務
[root@localhost ~]# chkconfig --list crond
crond 0:關閉 1:關閉 2:啓用 3:啓用 4:啓用 5:啓用 6:關閉
PS:crond服務是運行的程序,crontab命令用來管理crond服務的。crond是非常重要的
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 [root@localhost ~]# mkdir -p /server/log/ [root@localhost ~]# echo "wangxian">>/server/log/wangxian.txt [root@localhost ~]# 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端口
[
root@backup ~]# 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 [root@backup ~]# 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 [root@backup ~]# ss -lntup|grep rsync tcp LISTEN 0 5 :::873 :::* users:(("rsync",1845,5)) tcp LISTEN 0 5 *:873 *:* users:(("rsync",1845,3)) [root@backup ~]# 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)
增加傀儡用戶,改變權限
[root@backup ~]# useradd rsync -s /sbin/nologin [root@backup ~]# id rsync uid=505(rsync) gid=505(rsync) 組=505(rsync) [root@backup ~]# mkdir /backup [root@backup ~]# chown -R rsync /backup/ [root@backup ~]# ls -ld /backup/ drwxr-xr-x 2 rsync root 4096 6月 10 22:06 /backup/
創建密碼文件,並設置密碼,修改密碼文件的權限,讓其他用戶不可讀
[root@backup ~]# echo "rsync_backup:wangxin" >/etc/rsync.password [root@backup ~]# cat /etc/rsync.password rsync_backup:wangxin [root@backup ~]# chmod 600 /etc/rsync.password [root@backup ~]# 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服務的監聽地址
[
root@backup ~]# rsync --daemon --address=192.168.4.123 [root@backup ~]# 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配置參數
[root@backup ~]# 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安裝步驟
下載:
[root@nfs-server tools]#wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz [root@nfs-server 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
解壓
[root@nfs-server tools]# tar zxf inotify-tools-3.14.tar.gz root@nfs-server tools]# ls inotify-tools-3.14 inotify-tools-3.14.tar.gz
開始安裝
[root@nfs-server tools]# cd inotify-tools-3.14 [root@nfs-server inotify-tools-3.14]#./configure --prefix=/usr/local/inotify-tools-3.14
檢查是否有錯
[root@nfs-server inotify-tools-3.14]# echo $? 0 [root@nfs-server inotify-tools-3.14]# make && make install
檢查是否有錯
[root@nfs-server inotify-tools-3.14]# echo $? 0
做個軟鏈接使命令更短,又可以保留他的版本號
[root@nfs-server inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify-tools [root@nfs-server local]# cd /usr/local/inotify-tools [root@nfs-server 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
[root@nfs-server 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 事件(刪,增,改)
監控實例
[root@nfs-server 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、業務邏輯解決