linux服務器之間的文件同步;rsync+inotifywait;同步多個目錄

一、雙向同步:unison+inotifynode

二、單向同步:rsync+inotifypython

 

 

python版的pyinotify
linux

本文介紹第二種方法:nginx

一、Inotify 是一個 Linux特性,它監控文件系統操做,好比讀取、寫入和建立。Inotify 反應靈敏,用法很是簡單,而且比 cron 任務的繁忙輪詢高效得多。學習如何將 inotify 集成到您的應用程序中,並發現一組可用來進一步自動化系統治理的命令行工具。inotify是一種強大的,細粒度的,異步文件系統時間監控機制,它能夠替代crond實現與rsync的觸發式文件同步,從而監控文件系統中添加,刪除,修改,移動等細粒事件,從LINUX 2.6.13起,就已加入了對inotify的支持,因此咱們只須要安裝一個第三方軟件inotify-tools便可管理此服務git

二、inotify安裝:github

官網:http://inotify.aiken.cz/?section=inotify&page=download&lang=enweb

裏面就兩個C語言的頭文件inotify.h和inotify-syscalls.hshell

linux內核2.6.13之後開始支持這個特性,查看支持狀況:[admin@19-56 ~]$ ls -lsart /proc/sys/fs/inotify/安全

上圖表示是支持的bash

三、inotify-tools安裝:其實就是inotify的命令行工具包,這樣你就能夠經過命令行使用inotify特性

官網:https://github.com/rvoicilas/inotify-tools

https://github.com/rvoicilas/inotify-tools/wiki

inotify-tools is a C library and a set of command-line programs for Linux providing a simple interface to inotify. These programs can be used to monitor and act upon filesystem events.

inotify-tools安裝完成以後會有兩個命令,inotifywait 和 inotifywatch。inotifywait用於等待文件或者文件集上的一個特定事件,能夠監控任何文件或者目錄位置,而且能夠遞歸地監控整個目錄樹;inotifywatch 用於收集被監控的文件系通通計數據,包括每一個inotify事件發生多少次等信息。

源碼安裝:./configure --prefix=/usr && make && su -c 'make install'

yum安裝:yum install -y inotify-tools

四、inotifywait -h查看inotifywait的幫助信息,經常使用選項(options)

    -r|--recursive     Watch directories recursively. 遞歸查詢目錄

    -m|--monitor      Keep listening for events forever.  Without
                         this option, inotifywait will exit after one
                         event is received. 始終監控

    -q|--quiet         Print less (only print events). 打印較少信息,僅打印監控相關信息

經常使用事件(Events):

    modify        file or directory contents were written

    create        file or directory created within watched directory

    delete        file or directory deleted within watched directory

 五、rsync -h查看rsync的幫助信息

 -v, --verbose               increase verbosity

 -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)

     --delete                delete extraneous files from destination dirs  意思是刪除目的目錄多餘源目錄的內容。這樣源目錄和目的目錄的內容才能一致,不然,目的目錄的內容不斷增長。保持兩個目錄同步增長和刪除

 

六、重點來了,配置文件

host ip status kernel bit file
A
192.168.10.220
master x86_64 64 /tmp
B
192.168.10.221
slave x86_64 64 /tmp

注意,不要把容易變化又不是監控目標的東西放到監控目錄裏,這樣的話,就不會頻繁產生同步操做。更加須要注意的是,不要把下文的日誌記錄放到監控目錄裏,這樣就產生了死循環:開始同步,產生日誌,日誌文件發生變化,繼續同步,再次產生日誌,日誌文件再次發生變化,再次同步……

1、主服務器A:

創建密碼認證文件

[root@nginx rsync-3.0.9]# cd /usr/local/rsync/
[root@nginx rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync.pwd

其中rsync-pwd能夠本身設置密碼,rsync.passwd名字也能夠本身設置
[root@nginx rsync]# chmod 600 rsync.passwd

不管是爲了安全,仍是爲了不出現如下錯誤,密碼文件都須要給600權限

建立rsync複製腳本 此項功能主要是將master端的目錄/tmp裏的內容,若是修改了(不管是添加、修改、刪除文件)可以經過inotify監控到,並經過rsync實時的同步給client的/tmp裏,下面是經過shell腳本實現的。

#!/bin/bash 
host=192.168.10.221 #slave地址
src=/tmp/    #被監控目錄
des=web 
user=webuser 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \ 
| while read files 
do
/usr/bin/rsync -va --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des 
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1 
done

read的用法

若是把rsync.log的放到tmp(備份的目錄)就會發送一直複製的問題,因此建議各位吧rsync的日誌放到其餘的目錄下(非備份目錄)。
其中host是slave的ip,src是master端要實時監控的目錄,des是認證的模塊名,須要與slave一致,user是創建密碼文件裏的認證用戶。
把這個腳本命名爲rsync.sh,放到監控的目錄裏,好比個人就放到/tmp下面,並給予764權限

[root@nginx tmp]# chmod 764 rsync.sh

而後運行這個腳本

[root@nginx tmp]# sh /tmp/rsync.sh &

請記住,只有在備份服務器client端的rsync安裝並啓動rsync以後,在啓動rsync.sh腳本,不然有時候會滿屏出現:

rsync: failed to connect to 192.168.10.221: Connection refused (111) 
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8] 

咱們還能夠把rsync.sh腳本加入到開機啓動項裏

[root@nginx tmp]# echo "/tmp/rsync.sh" >> /etc/rc.local

2、備份服務器(slave)

創建用戶與密碼認證文件

[root@nginx-backup rsync-3.0.9]# echo "webuser:rsync-pwd" > /usr/local/rsync/rsync.passwd

請記住,在master端創建的密碼文件,只有密碼,沒有用戶名;而在備份服務端slave裏創建的密碼文件,用戶名與密碼都有。

[root@nginx-backup rsync]# chmod 600 rsync.passwd 須要給密碼文件600權限

創建rsync配置文件

uid = root 
gid = root 
use chroot = no 
max connections = 10 
strict modes = yes
pid file = /var/run/rsyncd.pid 
lock file = /var/run/rsync.lock 
log file = /var/log/rsyncd.log 
[web] 
path = /tmp/   #同步的目的目錄
comment = web file
ignore errors 
read only = no 
write only = no 
hosts allow = 192.168.10.220 
hosts deny = * 
list = false
uid = root 
gid = root 
auth users = webuser 
secrets file = /usr/local/rsync/rsync.pwd

其中web是master服務端裏的認證模塊名稱,須要與主服務器裏的一致,以上的配置個人本身服務器裏的配置,以供參考。

把配置文件命名爲rsync.conf,放到/usr/local/rsync/目錄裏

啓動rsync
[root@nginx-backup rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf

咱們能夠把rsync腳本加入到開機啓動項裏

[root@nginx-backup rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local

如今rsync與inotify在master端安裝完成,rsync在備份服務器slave端也安裝完成

 

參考:http://www.showerlee.com/archives/678

http://www.jb51.net/article/57011.htm

 

20181117更新:

注意點:

一、rsync+inotifywait的同步模式是阻塞模式,必定放到後臺執行,不要影響其餘任務執行

二、rc.local啓動的任務帳號都是root帳號,因此注意對文件的讀寫和執行權限

三、啓動日誌:/var/log/boot.log,能夠經過這個日誌查看rc.local裏的開機啓動任務啓動狀況,是否有異常

四、只能夠同步目錄和目錄下的文件,可是不能夠直接同步文件

目的:把服務器A的兩個目錄的全部變化同步到服務器B

先上服務器配置A

rc.local配置:

#!/bin/sh -x
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
exec 1>/tmp/rc.local.log 2>&1  # send stdout and stderr from rc.local to a log file rc.local的日誌默認是在/var/log/boot.log裏的,這裏把它的日誌寫到/tmp/rc.local.log中
set -x  # tell sh to display commands before execution
touch /var/lock/subsys/local          # 做用是確保rc.local不會被執行兩次
/bin/sh /usr/local/rsync/rsyncJobs.sh &    # 這裏必定要加 & 符號,由於這個同步任務是個阻塞的任務,讓它在後臺執行,這樣能夠繼續執行其餘開機啓動項
/bin/sh /usr/local/rsync/rsyncNodes.sh &   # 上面加了後臺執行符號 &,這個任務纔會執行

目錄一的rsyncJobs.sh配置

#!/bin/bash
host=服務器B的IP
srcJobs=/var/lib/jenkins/jobs/  # 被監控的目錄以及遞歸的目錄和文件,可是不能夠直接寫某個具體的文件
desJobs=jobs  # 目的
user=webuser  # 下面配置的做用是監控目錄/var/lib/jenkins/jobs/的任何變化,而後同步到目的地
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $srcJobs \
| while read files
do
sleep 5
rsync -va --delete --progress --password-file=/usr/local/rsync/rsync.pwd $srcJobs $user@$host::$desJobs
echo "${files} was rsynced" >> /tmp/rsyncJobs.log 2>&1  # 把同步文件的簡要信息放在這裏,大部分相信信息存在/tmp/rc.local.log裏
done

目錄二的rsyncNodes.sh配置:

#!/bin/bash
host=服務器B的IP
srcNodes=/var/lib/jenkins/nodes/
desNodes=nodes
user=webuser
# inotifwait的做用是監控文件的變化,而後通知rsync進行同步工做 inotifywait
-mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $srcNodes \ | while read files do sleep 5 rsync -va --delete --progress --password-file=/usr/local/rsync/rsync.pwd $srcNodes $user@$host::$desNodes # --delete刪除目標文件比源文件多的文件 echo "${files} was rsynced" >> /tmp/rsyncNodes.log 2>&1 done

密碼的rsync.pwd配置:

rsync-pwd  # 只有密碼

 

服務器B配置:

rc.local

#!/bin/sh -x
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
# 放在rc.local屢次執行
touch /var/lock/subsys/local
# 開啓rsync服務進程,等待服務器A發起的同步任務 rsync
--daemon --config=/usr/local/rsync/rsync.conf

rsync.conf配置

uid=admin  # 決定被同步的文件到服務器A上的用戶
gid=admin  # 決定被同步的文件到服務器A上的用戶組
use chroot=no
max connections=10
strict modes=yes
pid file=/usr/local/rsync/rsyncd.pid  # 有的時候啓動不了,是由於kill -9後,pid文件還存在。自動生成
lock file=/usr/local/rsync/rsyncd.lock  # 有的時候新增長的目錄或者修改的配置不生效,是由於這個配置文件沒有更新,能夠刪除下,它會自動生成
log file=/usr/local/rsync/rsyncd.log  # 服務器B的rsync服務日誌;自動生成
[jobs]  # 目錄一的配置
path=/var/lib/jenkins/jobs/ # 服務器A的目錄一的位置,能夠是任意目錄,不須要和服務器A的目錄保持一致
comment=web file
ignore errors
read only=no
write only=no
hosts allow= 服務器A的IP  # 容許鏈接的IP
hosts deny=*
list=false
uid=admin
gid=admin
auth users=webuser
secrets file=/usr/local/rsync/rsync.pwd
[nodes]  # 目錄二的配置
path=/var/lib/jenkins/nodes/  # 目錄二在服務器B上的位置
comment=web file
ignore errors
read only=no
write only=no
hosts allow=服務器A的IP
hosts deny=*
list=false
uid=admin
gid=admin
auth users=webuser
secrets file=/usr/local/rsync/rsync.pwd

密碼的rsync.pwd的配置

webuser:rsync-pwd  # 用戶名:密碼

 

啓動日誌:/var/log/boot.log


rsync -azv --delete --exclude .svn --exclude "compile" --exclude "session_cache" --exclude "web"
/cygdrive/c/www/test/trunk/ username@IP:/home/test/
這裏要說的是,同步的時候排除多個文件/文件夾的作法是:
--exclude "文件夾名字(1.惟一的時候,能夠直接用文件/文件夾名 2.用絕對路徑)"
如下示例,排除3個文件夾:
--exclude .svn --exclude "compile" --exclude "session_cache"
rsync經常使用參數:

--delete 刪除目標文件比源文件多餘的文件

--exclude 排除文件(文件不會被同步)

下面使用nload -u M觀察到的同步效果圖。使用左右方向鍵能夠切換觀察的接口

相關文章
相關標籤/搜索