1. 程式人生 > >定時任務和資料同步備份

定時任務和資料同步備份

1 定時任務

1.1 linux定時任務排程分為兩種

1、系統自動執行的任務工作

2、使用者執行的任務工作

crontab  適合週期性的執行任務

at 適合僅執行一次就結束的任務排程命令  對應的服務是atd,一般沒用,關閉

[[email protected] logrotate.d]# chkconfig --list atd

atd             0:關閉  1:關閉  2:關閉  3:啟用

  4:啟用  5:啟用  6:關閉

anacron    以天為週期或者在系統每次開機後執行的任務工作,沒什麼用

1.2 linux定時任務crond服務

[[email protected] ~]# 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  *  *  *       每天1719

, 分隔時段       *  17,18,19  *  *  *    每天171819

/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、定時任務中的路徑一定要絕對路徑

5crond服務必須開啟

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相當於scpcprm,但是還優於他們每一個命令。

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

1vi /etc/rsyncd.conf  加入一堆配置

2、建立rsync使用者,及共享目錄/backup

useradd rsync -s /sbin/nologin -M

3、建立密碼檔案

4rsync --daemon 啟動服務

5echo "rsync --daemon" >>/etc/rc.local 加入開機啟動

Rsync客戶端

1、建立密碼檔案

echo "wangxin" >/etc/rsync.password  只需要密碼

chmod 600 /etc/rsync.password

 

2push

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、增量備份同步,支援socketdaemon),集中備份

rsync缺點

1、大量小檔案同步的時候,比對時間比較長,有的時候,rsync程序停止

解決:1)打包同步   2drbd(檔案系統同步,複製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

inotifywaitinotifywatch

[[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:    設定inotifywaitinotifywatch命令可以監視的檔案數量(單程序)

max_user_instances:  設定每個使用者可以執行的inotifywaitinotifywatch命令的程序數

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實現NFSbackup實時同步

/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 高併發資料實時同步方案小結

1inotify+rsync sersync  檔案級別

2drbd  檔案系統級別

3、第三方軟體的同步功能:mysql同步。oraclemongodb

4、業務上,程式實現雙寫

5、業務邏輯解決