定時任務和數據同步備份

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:關閉

PScrond服務是運行的程序,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
[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、定時任務中的路徑一定要絕對路徑

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端口

[

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

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服務的監聽地址

[

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、增量備份同步,支持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配置參數

[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

inotifywaitinotifywatch

[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:    設置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、業務邏輯解決

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章