rsync學習與實踐

1.介紹:開源的、快速的、多功能的能夠實現全量和增量備份的工具;還能實現文件的刪除等;能夠根據文件大小的變化和修改時間的變化來同步數據(快速)vim

2.描述:支持特殊文件的拷貝,例如設備文件,連接等;能夠排除目錄下指定文件的同步功能,至關於tar;能夠作到保持原文件的屬性和權限等不改變(-p);實現增量同步,傳輸效率很高;可使用rcp等方式來傳輸文件;能夠經過socket傳輸文件和數據(c/s);支持匿名認證的方式進行傳輸
3.企業應用:兩臺服務器之間的數據同步(nfs備份),時時同步,增量備份
4.rsync的工做模式:單個主機之間本地傳輸(相似於cp)
                                藉助rcp,ssh等通道來傳輸數據(相似於scp)
                                以守護進程socket的方式傳輸數據(重要功能)
5.使用方法:
       rsync [OPTION...] SRC... [DEST]
       全部屬性的拷貝rsync -avz
       刪除文件或者目錄(不一樣的目錄或者文件)rsync -r --delete 目錄1 目錄2
6.rsync的推拉複製
       rsync -avz file(須要發送的文件) -e(指定通道) 'ssh -p 65535'(指定協議) haha@172.1.1.1:~           文件的推送
       rsync -avz -e 'ssh -p 65535'  haha@172.1.1.3:~/hosts  /home/haha                                                        文件的拉取
7.客戶端的經常使用參數
       rsync -v:詳細方式輸出
                 -z:壓縮傳輸2w
                 -a:歸檔模式(rtopDI)
                 -e,--rsh=command:使用的信道協議
                 --exclude=PATTERN,--exclude-from
                 --bwlimit=10:傳輸限速
*8.socket方式傳輸
      daemon方式:
           拓撲:
rsync的server端的配置文件/etc/rsyncd.conf
#rsync_config_______________start
#created by oldboy 15:01 2007-6-5
#QQ 31333741 blog: http://oldboy.blog.51cto.com
##rsyncd.conf start##
uid = rsync
gid = rsync
use chroot = no                          #防止安全問題
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[oldboy]                                         #共享設置
path = /oldboy/
ignore errors
read only = false
list = false
hosts allow = 10.0.0.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#rsync_config_______________end
 服務以daemon方式啓動:rsync --daemon
netstat -lntup | grep 873     監聽在873端口
而後建立對應的目錄及用戶,將屬主和屬組修改
mkdir /oldboy              ----                 useradd -s /ssbin/nologin -M rsync      ------chown -R rsync.rsync /oldboy
接下來建立虛擬用戶以及密碼
echo "rsync_backup:oldboy" > /etc/rsync.password
chmod 600 /etc/rsync.password
客戶端的操做:
echo "oldboy" > /etc/rsync.password
chmod 600 /etc/rsync.password
數據的流向是服務端走向客戶端
在客戶端執行:(下面的oldboy是服務端[oldboy]模塊名,不是目錄)
rsync -avz rsync_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password         拉取操做
rsync -avz rsync :/rsyn_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password
rsync -avz /data/(data下的內容) rsync_backup@172.1.1.4::oldboy  --password-file=/etc/rsync.password      推操做
rsync -avz /data/  rsync://rsync_backup@172.1.1.4/oldboy --password-file=/etc/rsync.password
 
 
Access via rsync daemon:
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
****rsync拍錯過程:防火牆,seliux,參考日誌/var/log/syncd.log,文件命名和權限
 
 
深度講解rsync(873端口)
正常狀況下須要將服務端rsync寫到rc.local下(echo "/usr/bin/rsync --daemon" >> /etc/rc.local)保證開機自啓動
客戶端負責推送本地的文件到rsync服務端的對應模塊下
rsync拓展:
--exclude
--exclude-from
排除的方法:能夠在客戶端排除,也能夠在服務端設置參數進行排除
rsync -avz --exclude=log/ /data/  rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除目錄或者單個文件能夠這樣紙
rsync -avz --exclude={1.txt,2.txt,5.txt,log/} /data/ rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除多個文件和目錄的用法
rsync -avz --exclude-from=hehe.log /data/  rsync_backup@172.1.1.4::oldboy--password-file=/etc/rsync.password 
服務端的排除:(須要修改配置文件,會帶來麻煩)
 
********無差別同步實踐(主備機之間的需求)
參數:--delete
推送的場景:其一是備份(主要) --delete風險(文件丟失)
拉取【客戶端操做】的應用場景:代碼發佈,下載(遠端有啥本地有啥)
rsync -avz --delete  rsync_backup@172.1.1.4::oldboy /data/ --password-file=/etc/rsync.password         保證數據的時時同步
使用場景:負載均衡器之間和高可用服務器之間
 
防火牆配置:
iptables -A INPUT -s 172.1.1.0/255.255.255.0 -p tcp -m tcp --dport 873 -j ACCEPT
 
 
多模塊配置(共享多個目錄)
須要在服務器端操做的事項:配置文件中寫多個模塊,參考配置文件以下:
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
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 = 172.1.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
 
[oldboy]
path = /oldboy/
 
[data]
path = /data/
 
 
而後再對data目錄給以rsync屬主,此時就能夠實如今客戶端的操做了
 
 
 
 
排錯:密碼文件權限問題,目錄以及權限問題,防火牆問題,
前提是熟悉部署的流程;
原理要理解
學會看日誌(命令行和日誌輸出)
模擬錯誤,重視平常的錯誤
 
 
 
 
rsync+inotify時時同步
 
一、時時同步原理
      計劃任務結合rsync實現分鐘級別的同步
      inotify是一種異步文件系統時間監控機制,觸發同步
      首先在客戶端安裝inotify程序,在服務端啓動rsync --daemon;當客戶端檢測到的目錄及內容發生變化時而後客戶端會將發生變化的目錄及內容推送
二、inotify的實施
       準備條件:實現rsync daemon和客戶端之間的推拉傳輸數據
       配置inotify的要求:在客戶端安裝和配置
 
      先查看客戶端是否支持inotify
# ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 5月  18 17:32 max_queued_events          最大隊列事件(大一點比較好)
-rw-r--r-- 1 root root 0 5月  18 17:32 max_user_instances           
-rw-r--r-- 1 root root 0 5月  18 17:32 max_user_watches
51CTO下載-inotify-tools-3.14.tar.gz
./configure -prefix=/opt/inotify
make && make install
ln -s /opt/inotify /usr/local/inotify
三、詳細介紹
/opt/inotify/bin/inotifywait   
--exclude <pattern>      排除文件或者目錄時不區分大小寫
    --excludei <pattern>   排除文件或者目錄時不區分大小寫                    
    -m|--monitor              始終保持事件監聽狀態
    -d|--daemon                                                                     
    -r|--recursive               遞歸查詢目錄
    --fromfile <file>    
    -o|--outfile <file>
    -s|--syslog     
    -q|--quiet                     打印不多的信息,打印監控事件    
    -qq              
    --format <fmt>            打印使用指定的輸出相似格式的字符串  
    --timefmt <fmt>    strftime-compatible format string for use with
                      %T in --format string.
    -c|--csv          Print events in CSV format.
    -t|--timeout <seconds>
                      When listening for a single event, time out after
                      waiting for an event for <seconds> seconds.
                      If <seconds> is 0, inotifywait will never time out.
    -e|--event <event1> [ -e|--event <event2> ... ]              監控事件的變化
        Listen for specific event(s).  If omitted, all events are 
        listened for.
Exit status:
    0  -  An event you asked to watch for was received.
    1  -  An event you did not ask to watch for was received
          (usually delete_self or unmount), or some error occurred.
    2  -  The --timeout option was given and no events occurred
          in the specified interval of time.
 
Events:
    access         file or directory contents were read
    modify        file or directory contents were written
    attrib           file or directory attributes changed
    close_write    file or directory closed, after being opened in
                   writeable mode
    close_nowrite    file or directory closed, after being opened in
                   read-only mode
    close        file or directory closed, regardless of read/write mode
    open        file or directory opened
    moved_to    file or directory moved to watched directory
    moved_from    file or directory moved from watched directory
    move        file or directory moved to or from watched directory
    create        file or directory created within watched directory
    delete        file or directory deleted within watched directory
    delete_self    file or directory was deleted
    unmount        file system containing file or directory unmounted
4.實戰:
在inotify端執行:
/opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e create,delete,open /backup      在backup目錄下的建立操做進行監控
/opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e delete /backup 
簡化的事件輸出:
#!/bin/bash
/opt/inotify/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /backup
while read file
     do
        rsync -az "$file" --delete rsync_backup@serverip::backup --password-file=/etc/rsync.password
      done
執行上述的腳本,而後再往backup下建立和刪除文件測試,可是不能實現刪除同步操做。
 
 
優化版腳本以下:
 
#!/bin/bash
#parameter
host=172.1.1.4
src="/backup"
dst="oldboy"
user="rsync_backup"
pass="/etc/rsync.password"
cmd="/opt/inotify/bin/inotifywait"
 
#judge
if [ ! -e $src ] \
|| [ ! -e $pass ] \
|| [ ! -e $cmd ] \
|| [ ! -e "/usr/bin/rsync" ];
then
     echo "please check file and folder !"
     exit 9
fi
 
#exec
$cmd -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
        do
           # rsync -azP --delete --timeout=100 --password-file=$pass $src $user@$host::$dst &> /dev/null
           cd $src && rsync -az -R --delete ./ --timeout=100 $user@$host::$dst --password-file=$pass &> /dev/null
        done
exit 0
 
經過start|stop控制腳本事項inotify操做結合上述腳本實現開關操做
 
#!/bin/bash
. /etc/init.d/functions
 
if [ $# -ne 1 ];then
        usage:$0 {start|stop}
        exit 1
fi
case "$1" in
start)
        /bin/bash /server/scripts/inotify.sh &
        echo $$ > /opt/inotify/i.pid
        if [ `ps -ef | grep inotify|wc -l` -gt 2 ];then
            action "inotify server is started" /bin/true
        else
            action "inotify server is error" /bin/false
        fi
        ;;
stop)
        kill -9 `cat /opt/inotify/i.pid` > /dev/null 2>&1
        pkill inotifywait
        sleep 1
        if [ `ps -ef | grep inotify |wc -l` -eq 0 ];then
             action "inotify server is stopped" /bin/true
        else
             action "inotify server is stopped error" /bin/false
        fi
        ;;
*)
        usage :$0 {start|stop}
        exit 1
esac
 
 
壓力測試 及優化
查看inotify對應的內核參數
cd /proc/sys/fs/inotify/
 cat *
16384          表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
128              表示每個real user ID可建立的inotify instatnces的數量上限
8192            表示同一用戶同時能夠添加的watch數目(watch通常是針對目錄,決定了同時同一用戶能夠監控的目錄數量)       
上述三個參數能夠按照實際狀況儘量地調大一點
重啓機器以後會失效,永久操做的方法
 
vim /etc/sysctl.conf

fs.inotify.max_queued_events= 99999999
fs.inotify.max_user_watches= 99999999
fs.inotify.max_user_instances= 65535
 
修改完成以後sysctl -p 刷新生效便可

注意: max_queued_events 是inotify管理的隊列的最大長度,文件系統變化越頻繁,這個值就應該越大。
(小文件的最大併發數也就200左右,不然會有延遲)
 
echo {a..j} | tr " " "\n" > a.log     #豎着 寫文件
split -l 2 a.log                             #兩行一個分割文件
 
 
inotify的缺點
(1)、併發大於200有延遲
(2)、推送效率不高
 
改進版
#!/bin/bash
cmd="/opt/inotify/bin/inotifywait"
$cmd -mqr --format '%w%f' -e create,close_write,delete /backup|\
while read line
do
     [ ! -e "$line" ] && continue
     rsync -az --delete $line  rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password
 
done
                                                                                              
               
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 1.介紹:開源的、快速的、多功能的能夠實現全量和增量備份的工具;還能實現文件的刪除等;能夠根據文件大小的變化和修改時間的變化來同步數據(快速)
2.描述:支持特殊文件的拷貝,例如設備文件,連接等;能夠排除目錄下指定文件的同步功能,至關於tar;能夠作到保持原文件的屬性和權限等不改變(-p);實現增量同步,傳輸效率很高;可使用rcp等方式來傳輸文件;能夠經過socket傳輸文件和數據(c/s);支持匿名認證的方式進行傳輸
3.企業應用:兩臺服務器之間的數據同步(nfs備份),時時同步,增量備份
4.rsync的工做模式:單個主機之間本地傳輸(相似於cp)
                                藉助rcp,ssh等通道來傳輸數據(相似於scp)
                                以守護進程socket的方式傳輸數據(重要功能)
5.使用方法:
       rsync [OPTION...] SRC... [DEST]
       全部屬性的拷貝rsync -avz
       刪除文件或者目錄(不一樣的目錄或者文件)rsync -r --delete 目錄1 目錄2
6.rsync的推拉複製
       rsync -avz file(須要發送的文件) -e(指定通道) 'ssh -p 65535'(指定協議) haha@172.1.1.1:~           文件的推送
       rsync -avz -e 'ssh -p 65535'  haha@172.1.1.3:~/hosts  /home/haha                                                        文件的拉取
7.客戶端的經常使用參數
       rsync -v:詳細方式輸出
                 -z:壓縮傳輸2w
                 -a:歸檔模式(rtopDI)
                 -e,--rsh=command:使用的信道協議
                 --exclude=PATTERN,--exclude-from
                 --bwlimit=10:傳輸限速
*8.socket方式傳輸
      daemon方式:
           拓撲:
rsync的server端的配置文件/etc/rsyncd.conf
#rsync_config_______________start
#created by oldboy 15:01 2007-6-5
#QQ 31333741 blog: http://oldboy.blog.51cto.com
##rsyncd.conf start##
uid = rsync
gid = rsync
use chroot = no                          #防止安全問題
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[oldboy]                                         #共享設置
path = /oldboy/
ignore errors
read only = false
list = false
hosts allow = 10.0.0.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#rsync_config_______________end
 服務以daemon方式啓動:rsync --daemon
netstat -lntup | grep 873     監聽在873端口
而後建立對應的目錄及用戶,將屬主和屬組修改
mkdir /oldboy              ----                 useradd -s /ssbin/nologin -M rsync      ------chown -R rsync.rsync /oldboy
接下來建立虛擬用戶以及密碼
echo "rsync_backup:oldboy" > /etc/rsync.password
chmod 600 /etc/rsync.password
客戶端的操做:
echo "oldboy" > /etc/rsync.password
chmod 600 /etc/rsync.password
數據的流向是服務端走向客戶端
在客戶端執行:(下面的oldboy是服務端[oldboy]模塊名,不是目錄)
rsync -avz rsync_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password         拉取操做
rsync -avz rsync :/rsyn_backup@172.1.1.4::oldboy /data --password-file=/etc/rsync.password
rsync -avz /data/(data下的內容) rsync_backup@172.1.1.4::oldboy  --password-file=/etc/rsync.password      推操做
rsync -avz /data/  rsync://rsync_backup@172.1.1.4/oldboy --password-file=/etc/rsync.password
 
 
Access via rsync daemon:
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
****rsync拍錯過程:防火牆,seliux,參考日誌/var/log/syncd.log,文件命名和權限
 
 
深度講解rsync(873端口)
正常狀況下須要將服務端rsync寫到rc.local下(echo "/usr/bin/rsync --daemon" >> /etc/rc.local)保證開機自啓動
客戶端負責推送本地的文件到rsync服務端的對應模塊下
rsync拓展:
--exclude
--exclude-from
排除的方法:能夠在客戶端排除,也能夠在服務端設置參數進行排除
rsync -avz --exclude=log/ /data/  rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除目錄或者單個文件能夠這樣紙
rsync -avz --exclude={1.txt,2.txt,5.txt,log/} /data/ rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password     排除多個文件和目錄的用法
rsync -avz --exclude-from=hehe.log /data/  rsync_backup@172.1.1.4::oldboy--password-file=/etc/rsync.password 
服務端的排除:(須要修改配置文件,會帶來麻煩)
 
********無差別同步實踐(主備機之間的需求)
參數:--delete
推送的場景:其一是備份(主要) --delete風險(文件丟失)
拉取【客戶端操做】的應用場景:代碼發佈,下載(遠端有啥本地有啥)
rsync -avz --delete  rsync_backup@172.1.1.4::oldboy /data/ --password-file=/etc/rsync.password         保證數據的時時同步
使用場景:負載均衡器之間和高可用服務器之間
 
防火牆配置:
iptables -A INPUT -s 172.1.1.0/255.255.255.0 -p tcp -m tcp --dport 873 -j ACCEPT
 
 
多模塊配置(共享多個目錄)
須要在服務器端操做的事項:配置文件中寫多個模塊,參考配置文件以下:
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
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 = 172.1.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
 
[oldboy]
path = /oldboy/
 
[data]
path = /data/
 
 
而後再對data目錄給以rsync屬主,此時就能夠實如今客戶端的操做了
 
 
 
 
排錯:密碼文件權限問題,目錄以及權限問題,防火牆問題,
前提是熟悉部署的流程;
原理要理解
學會看日誌(命令行和日誌輸出)
模擬錯誤,重視平常的錯誤
 
 
 
 
rsync+inotify時時同步
 
一、時時同步原理
      計劃任務結合rsync實現分鐘級別的同步
      inotify是一種異步文件系統時間監控機制,觸發同步
      首先在客戶端安裝inotify程序,在服務端啓動rsync --daemon;當客戶端檢測到的目錄及內容發生變化時而後客戶端會將發生變化的目錄及內容推送
二、inotify的實施
       準備條件:實現rsync daemon和客戶端之間的推拉傳輸數據
       配置inotify的要求:在客戶端安裝和配置
 
      先查看客戶端是否支持inotify
# ll /proc/sys/fs/inotify/
-rw-r--r-- 1 root root 0 5月  18 17:32 max_queued_events          最大隊列事件(大一點比較好)
-rw-r--r-- 1 root root 0 5月  18 17:32 max_user_instances           
-rw-r--r-- 1 root root 0 5月  18 17:32 max_user_watches
51CTO下載-inotify-tools-3.14.tar.gz
./configure -prefix=/opt/inotify
make && make install
ln -s /opt/inotify /usr/local/inotify
三、詳細介紹
/opt/inotify/bin/inotifywait   
--exclude <pattern>      排除文件或者目錄時不區分大小寫
    --excludei <pattern>   排除文件或者目錄時不區分大小寫                    
    -m|--monitor              始終保持事件監聽狀態
    -d|--daemon                                                                     
    -r|--recursive               遞歸查詢目錄
    --fromfile <file>    
    -o|--outfile <file>
    -s|--syslog     
    -q|--quiet                     打印不多的信息,打印監控事件    
    -qq              
    --format <fmt>            打印使用指定的輸出相似格式的字符串  
    --timefmt <fmt>    strftime-compatible format string for use with
                      %T in --format string.
    -c|--csv          Print events in CSV format.
    -t|--timeout <seconds>
                      When listening for a single event, time out after
                      waiting for an event for <seconds> seconds.
                      If <seconds> is 0, inotifywait will never time out.
    -e|--event <event1> [ -e|--event <event2> ... ]              監控事件的變化
        Listen for specific event(s).  If omitted, all events are 
        listened for.
Exit status:
    0  -  An event you asked to watch for was received.
    1  -  An event you did not ask to watch for was received
          (usually delete_self or unmount), or some error occurred.
    2  -  The --timeout option was given and no events occurred
          in the specified interval of time.
 
Events:
    access         file or directory contents were read
    modify        file or directory contents were written
    attrib           file or directory attributes changed
    close_write    file or directory closed, after being opened in
                   writeable mode
    close_nowrite    file or directory closed, after being opened in
                   read-only mode
    close        file or directory closed, regardless of read/write mode
    open        file or directory opened
    moved_to    file or directory moved to watched directory
    moved_from    file or directory moved from watched directory
    move        file or directory moved to or from watched directory
    create        file or directory created within watched directory
    delete        file or directory deleted within watched directory
    delete_self    file or directory was deleted
    unmount        file system containing file or directory unmounted
4.實戰:
在inotify端執行:
/opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e create,delete,open /backup      在backup目錄下的建立操做進行監控
/opt/inotify/bin/inotifywait -mrq --timefmt '%d%m%y%H:%M' --format '%T%w%f' -e delete /backup 
簡化的事件輸出:
#!/bin/bash
/opt/inotify/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /backup
while read file
     do
        rsync -az "$file" --delete rsync_backup@serverip::backup --password-file=/etc/rsync.password
      done
執行上述的腳本,而後再往backup下建立和刪除文件測試,可是不能實現刪除同步操做。
 
 
優化版腳本以下:
 
#!/bin/bash
#parameter
host=172.1.1.4
src="/backup"
dst="oldboy"
user="rsync_backup"
pass="/etc/rsync.password"
cmd="/opt/inotify/bin/inotifywait"
 
#judge
if [ ! -e $src ] \
|| [ ! -e $pass ] \
|| [ ! -e $cmd ] \
|| [ ! -e "/usr/bin/rsync" ];
then
     echo "please check file and folder !"
     exit 9
fi
 
#exec
$cmd -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
        do
           # rsync -azP --delete --timeout=100 --password-file=$pass $src $user@$host::$dst &> /dev/null
           cd $src && rsync -az -R --delete ./ --timeout=100 $user@$host::$dst --password-file=$pass &> /dev/null
        done
exit 0
 
經過start|stop控制腳本事項inotify操做結合上述腳本實現開關操做
 
#!/bin/bash
. /etc/init.d/functions
 
if [ $# -ne 1 ];then
        usage:$0 {start|stop}
        exit 1
fi
case "$1" in
start)
        /bin/bash /server/scripts/inotify.sh &
        echo $$ > /opt/inotify/i.pid
        if [ `ps -ef | grep inotify|wc -l` -gt 2 ];then
            action "inotify server is started" /bin/true
        else
            action "inotify server is error" /bin/false
        fi
        ;;
stop)
        kill -9 `cat /opt/inotify/i.pid` > /dev/null 2>&1
        pkill inotifywait
        sleep 1
        if [ `ps -ef | grep inotify |wc -l` -eq 0 ];then
             action "inotify server is stopped" /bin/true
        else
             action "inotify server is stopped error" /bin/false
        fi
        ;;
*)
        usage :$0 {start|stop}
        exit 1
esac
 
 
壓力測試 及優化
查看inotify對應的內核參數
cd /proc/sys/fs/inotify/
 cat *
16384          表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
128              表示每個real user ID可建立的inotify instatnces的數量上限
8192            表示同一用戶同時能夠添加的watch數目(watch通常是針對目錄,決定了同時同一用戶能夠監控的目錄數量)       
上述三個參數能夠按照實際狀況儘量地調大一點
重啓機器以後會失效,永久操做的方法
 
vim /etc/sysctl.conf

fs.inotify.max_queued_events= 99999999
fs.inotify.max_user_watches= 99999999
fs.inotify.max_user_instances= 65535
 
修改完成以後sysctl -p 刷新生效便可

注意: max_queued_events 是inotify管理的隊列的最大長度,文件系統變化越頻繁,這個值就應該越大。
(小文件的最大併發數也就200左右,不然會有延遲)
 
echo {a..j} | tr " " "\n" > a.log     #豎着 寫文件
split -l 2 a.log                             #兩行一個分割文件
 
 
inotify的缺點
(1)、併發大於200有延遲
(2)、推送效率不高
 
改進版
#!/bin/bash
cmd="/opt/inotify/bin/inotifywait"
$cmd -mqr --format '%w%f' -e create,close_write,delete /backup|\
while read line
do
     [ ! -e "$line" ] && continue
     rsync -az --delete $line  rsync_backup@172.1.1.4::oldboy --password-file=/etc/rsync.password
 
done
相關文章
相關標籤/搜索