03-inotify+rsync sersync lsyncd實時同步服務

一、Inotify簡介

inotify是Linux內核的一個功能,它能監控文件系統的變化,好比刪除、讀、寫和卸載等操做。要使用inotify,Linux內核版本必須是大於2.6.13,實現inotify的軟件爲inotify-toolscss

二、Inotify實時同步

2-1 查看當前系統是否支持inotify

# 查看系統內核版本
[root@nfs ~]# uname  -r
3.10.0-1062.12.1.el7.x86_64

# 查看inotify的內核參數的文件是否存在
[root@nfs ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jul  8 09:43 max_queued_events
-rw-r--r-- 1 root root 0 Jul  8 09:43 max_user_instances
-rw-r--r-- 1 root root 0 Jul  8 09:43 max_user_watches
max_queued_events   ---設置inotify實例事件(event)隊列可容納的事件數量,默認值16384
max_user_instances  ---設置每一個用戶單個進程監控文件的數量,默認是8129
max_user_watches    ---設置i用戶建立inotify實例的最大值,默認是128

# 修改max_queued_events內核參數
[root@nfs ~]# echo 'fs.inotify.max_queued_events=999999' >> /etc/sysctl.conf 
[root@test ~]# cat /proc/sys/fs/inotify/max_queued_events
999999

2-2 安裝inotify-tools

安裝inotify-tools須要用到epel源html

[root@nfs ~]# yum -y install inotify-tools
[root@nfs ~]# rpm -ql inotify-tools
/usr/bin/inotifywait    --- 監控目錄數據信息變化 
/usr/bin/inotifywatch   --- 對監控的變化信息進行統計
......

2-3 inotifywait使用

  • 參數說明
## inotifywait參數說明
參數名稱            參數說明
-m ,-monitor       始終保持事件監聽狀態
-r,-recursive      遞歸查詢目錄
-q,-quiet          只打印監控事件的信息
-exclude           排除文件或目錄時,不區分大小寫
-t,-timeout        超時時間
--timefmt          指定時間輸出格式
--format           指定輸出格式
-e,event           後面指定增,刪,改等事件

## --timefmt <fmt>時間格式
    %Y: ---表示年份信息,包含世紀信息
    %y: ---表示年份信息,不包含世紀信息
    %m: ---表示月份,範圍01-12
    %d: ---表示每個月的第幾天,範圍01-31
    %H: ---表示小時信息,使用24小時制度,範圍00-24
    %M: ---表示分鐘,範圍00-59

## --format<fmt>輸出信息格式定義
    %T:	 ---輸出時間格式中定義的時間格式,這個表示調用咱們前面定義時間格式,一般狀況--timefmt選項和--format結合使用
    %w:	 ---表示事件出現時,監控文件或目錄的名稱信息。也就是監控資源名稱信息
    %f:  ---時間出現時,顯示監控目錄下觸發事件的文件或目錄信息
    %e:  ---顯示發生的事件信息,不一樣事件默認用逗號分隔
	%Xe: ---顯示發生的事件,不一樣的時間指定用"X"分割
    
## -e選項指定監控事件類型說明
    access          ---讀取文件或目錄內容
    modify          ---修改文件或目錄內容
    attrib          ---文件或目錄的屬性改變
    close_write     ---修改真實文件內容
    close_nowrite   ---示文件或目錄關閉,在只讀模式打開以後關閉的
    close   		---表示文件或目錄關閉,不論是讀仍是寫模式
    open            ---文件或目錄被打開
    moved_to        ---文件或目錄移動到
    moved_from      ---文件或目錄從...移動到
    move            ---移動文件或目錄移動到監視目錄
    create          ---在監視目錄下建立文件或目錄
    delete          ---刪除監視目錄下的文件或目錄
    delete_self     ---表示文件或目錄被刪除,目錄自己被刪除
    umount          ---卸載文件系統
  • 測試環境,兩臺服務器
服務器 主機名 外網IP 內網IP 軟件
NFS服務器 nfs 192.168.1.31 172.16.1.31 nfs-utils+rpcbind
web服務器 web01 192.168.1.7 172.16.1.7 nfs-utils
  • nfs服務器部署好NFS存儲服務,存儲目錄爲/backup
  • web服務器遠程掛載/backup目錄到本地 /mnt
# 長時間遞歸監聽/mnt目錄
[root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data

# /mnt目錄下操做文件或目錄
[root@web01 mnt]# touch aaa
[root@web01 mnt]# echo "hello" > aaa
[root@web01 mnt]# rm -f aaa
[root@web01 mnt]# mv bbs /root

# 監聽信息
[root@nfs ~]# inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f event_info:%e' -e delete,create,modify,moved_to,close_write /data
2020-07-08 14:34 /data/ aaa event_info:CREATE
2020-07-08 14:34 /data/ aaa event_info:CLOSE_WRITE,CLOSE
2020-07-08 14:35 /data/ aaa event_info:MODIFY
2020-07-08 14:35 /data/ aaa event_info:CLOSE_WRITE,CLOSE
2020-07-08 14:35 /data/ aaa event_info:DELETE
2020-07-08 14:35 /data/ bbs event_info:DELETE,ISDIR

2-4 rsync+Inotify實時同步

[root@nfs scripts]# cat 01-inotify_rsync.sh
#!/bin/sh

backup_Server=172.16.1.41
export RSYNC_PASSWORD=123456

/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line
do
  echo ${line}
  if [ -f ${line} ]
  then
    rsync -az ${line} rsync_backup@${backup_Server}::data
  else
    rsync -az --delete /data/ rsync_backup@${backup_Server}::data
  fi
done

三、sersync同步服務

簡介

sersync相似於inotify,一樣用於監控,但它克服了inotify的缺點.linux

inotify最大的不足是會產生重複事件,或者同一個目錄下多個文件的操做會產生多個事件,例如,當監控目錄中有5個文件時,刪除目錄時會產生6個監控事件,從而致使重複調用rsync命令。好比:vim文件時,inotify會監控到臨時文件的事件,但這些事件相對於rsync來講是不該該被監控的c++

sersync 優勢:git

  • sersync是使用c++編寫,並且對linux系統文件系統產生的臨時文件和重複的文件操做進行過濾,因此在結合rsync同步的時候,節省了運行時耗和網絡資源。所以更快。
  • sersync配置很簡單,其中提供了靜態編譯好的二進制文件和xml配置文件,直接使用便可
  • sersync使用多線程進行同步,尤爲在同步較大文件時,可以保證多個服務器實時保持同步狀態
  • sersync有出錯處理機制,經過失敗隊列對出錯的文件從新同步,若是仍舊失敗,則按設定時長對同步失敗的文件從新同步
  • sersync不只能夠實現實時同步,另外還自帶crontab功能,只需在xml配置文件中開啓,即也能夠按要求隔一段時間總體同步一次,而無需再額外配置crontab功能

環境準備:兩臺服務器,一臺NFS服務器,一臺備份服務器(部署好Rsync守護進程服務)github

NFS服務器上操做:web

3-1 安裝sersync

# 下載軟件
[root@nfs tools]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz

# 解壓
[root@nfs tools]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz

# 修更名稱
[root@nfs tools]# mv GNU-Linux-x86/ sersync

# 移動到/usr/local
[root@nfs tools]# mv sersync /usr/local/
[root@nfs tools]# cd /usr/local/sersync
[root@nfs sersync]# cp confxml.xml confxml.xml.bak

3-2 編寫配置文件

[root@nfs sersync]# vim confxml.xml 

## 排除指定數據信息不要進行實時傳輸同步
<filter start="false"> <!--爲true時生效-->
	<exclude expression="(.*)\.svn"></exclude>
	<exclude expression="(.*)\.gz"></exclude>
	<exclude expression="^info/*"></exclude>
	<exclude expression="^static/*"></exclude>
</filter>

## 定義inotify程序須要監控的事件
<inotify>
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
</inotify>

## 監控目錄	  
<localpath watch="/data">
# 同步數據遠程服務器ip 模塊名
	<remote ip="172.16.1.41" name="data"/> 
 	<!--<remote ip="192.168.8.39" name="tongbu"/>-->
 	<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>

<rsync>
	# 同步參數
   <commonParams params="-artuz"/>
   # rsync遠程認證用戶,認證密碼文件
   <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>            # 端口,默認874              
   <userDefinedPort start="false" port="874"/><!-- port=874 -->
   <timeout start="false" time="100"/><!-- timeout=100 -->
   <ssh start="false"/>
</rsync>

3-3 sersync參數

[root@nfs conf]# sersync -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
______________________________________________________
參數-d:啓用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
參數-n:指定開啓守護線程的數量,默認爲10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啓用其餘模塊,使用 -m refreshCDN 開啓刷新CDN模塊
參數-m:單獨啓用其餘模塊,使用 -m socket 開啓socket模塊
參數-m:單獨啓用其餘模塊,使用 -m http 開啓http模塊
不加-m參數,則默認執行同步程序
_______________________________________________________

3-4 啓動服務

[root@nfs conf]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

3-5 測試sersync

  • 備份服務器操做:
cd /data
while true ;do ls |wc -l;sleep 0.1;done
  • NFS服務器操做
cd /data
for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done

說明:使用sersync是能夠解決以前的缺陷問題,可是這個服務自生也是存在缺陷問題,例如:不能同時監控多個目錄,該服務實現多目錄監控只能將以前的配置文件從新複製一份重命名,以後與以前啓動守護進程同樣,在從新啓動一個新的進程,這樣就比較麻煩。這個問題在lsyncd這個服務中就很好地解決了這個問題shell

四、lsyncd同步服務

簡介

Lysncd 其實是lua語言封裝了 inotify 和 rsync 工具,採用了 Linux 內核(2.6.13 及之後)裏的 inotify 觸發機制,而後經過rsync去差別同步,達到實時的效果。我認爲它最使人稱道的特性是,完美解決了 inotify + rsync海量文件同步帶來的文件頻繁發送文件列表的問題 —— 經過時間延遲或累計觸發事件次數實現。另外,它的配置方式很簡單,lua自己就是一種配置語言,可讀性很是強。lsyncd也有多種工做模式能夠選擇,本地目錄cp,本地目錄rsync,遠程目錄rsyncssh。express

官方地址vim

官方配置手冊

4-1 安裝lsyncd

[root@nfs ~]# yum -y install lsyncd

4-2 編寫配置文件

這裏在上面的基礎上在主機名爲nfs新建一個目錄data1,對應在backup新建一個backup1目錄

[root@nfs ~]# cat /etc/lsyncd.conf
settings {
  logfile = "/var/log/lsyncd/lsyncd.log",
  statusFile = "/var/log/lsyncd/lsyncd.status",
  inotifyMode = "CloseWrite",
  maxProcesses = 8,
}
sync {
  default.rsync,
  source = "/data1",
  target = "rsync_backup@172.16.1.41::data",
  delete = true,
  exclude = { ".*" },
  delay = 1,
  rsync = {
    binary = "/usr/bin/rsync",
    archive = true,
    compress = true,
    verbose = true,
    password_file = "/etc/rsync.password",
    _extra = {"--bwlimit=200"}
  }
}

sync {
  default.rsync,
  source = "/backup1",
  target = "rsync_backup@172.16.1.41::backup",
  delete = true,
  exclude = { ".*" },
  delay = 1,
  rsync = {
    binary = "/usr/bin/rsync",
    archive = true,
    compress = true,
    verbose = true,
    password_file = "/etc/rsync.password",
    _extra = {"--bwlimit=200"}
  }
}

4-3 配置文件說明

lsyncd.conf配置選項說明
settings
裏面是全局設置,--開頭表示註釋,下面是幾個經常使用選項說明:

logfile 定義日誌文件
stausFile 定義狀態文件
nodaemon=true 表示不啓用守護模式,默認
statusInterval 將lsyncd的狀態寫入上面的statusFile的間隔,默認10秒
inotifyMode 指定inotify監控的事件,默認是CloseWrite,還能夠是Modify或CloseWrite or Modify
maxProcesses 同步進程的最大個數。假如同時有20個文件須要同步,而maxProcesses = 8,則最大能看到有8個rysnc進程
maxDelays 累計到多少所監控的事件激活一次同步,即便後面的delay延遲時間還未到
sync

裏面是定義同步參數,能夠繼續使用maxDelays來重寫settings的全局變量。通常第一個參數指定lsyncd以什麼模式運行:rsync、rsyncssh、direct三種模式:

default.rsync :本地目錄間同步,使用rsync,也能夠達到使用ssh形式的遠程rsync效果,或daemon方式鏈接遠程rsyncd進程;
default.direct :本地目錄間同步,使用cp、rm等命令完成差別文件備份;
default.rsyncssh :同步到遠程主機目錄,rsync的ssh模式,須要使用key來認證

source 同步的源目錄,使用絕對路徑。

target 定義目的地址.對應不一樣的模式有幾種寫法:
/tmp/dest :本地目錄同步,可用於direct和rsync模式
172.29.88.223:/tmp/dest :同步到遠程服務器目錄,可用於rsync和rsyncssh模式,拼接的命令相似於/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的內容了,好比指定username,免密碼同步
172.29.88.223::module :同步到遠程服務器目錄,用於rsync模式
三種模式的示例會在後面給出。

init 這是一個優化選項,當init = false,只同步進程啓動之後發生改動事件的文件,原有的目錄即便有差別也不會同步。默認是true

delay 累計事件,等待rsync同步延時時間,默認15秒(最大累計到1000個不可合併的事件)。也就是15s內監控目錄下發生的改動,會累積到一次rsync同步,避免過於頻繁的同步。(可合併的意思是,15s內兩次修改了同一文件,最後只同步最新的文件)

excludeFrom 排除選項,後面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",若是是簡單的排除,可使用exclude = LIST。
這裏的排除規則寫法與原生rsync有點不一樣,更爲簡單:
監控路徑裏的任何部分匹配到一個文本,都會被排除,例如/bin/foo/bar能夠匹配規則foo
若是規則以斜線/開頭,則從頭開始要匹配所有
若是規則以/結尾,則要匹配監控路徑的末尾
?匹配任何字符,但不包括/
*匹配0或多個字符,但不包括/
**匹配0或多個字符,能夠是/
delete 爲了保持target與souce徹底同步,Lsyncd默認會delete = true來容許同步刪除。它除了false,還有startup、running值,請參考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。
rsync

(提示一下,delete和exclude原本都是rsync的選項,上面是配置在sync中的,我想這樣作的緣由是爲了減小rsync的開銷)

bwlimit 限速,單位kb/s,與rsync相同(這麼重要的選項在文檔里居然沒有標出)
compress 壓縮傳輸默認爲true。在帶寬與cpu負載之間權衡,本地目錄同步能夠考慮把它設爲false
perms 默認保留文件權限。
其它rsync的選項
其它還有rsyncssh模式獨有的配置項,如host、targetdir、rsync_path、password_file,見後文示例。rsyncOps={"-avz","--delete"}這樣的寫法在2.1.*版本已經不支持。

lsyncd.conf能夠有多個sync,各自的source,各自的target,各自的模式,互不影響。

4-4 啓動lsyncd

[root@nfs ~]# systemctl start lsyncd

測試

# backup測試
cd /data
while true ;do ls |wc -l;sleep 0.1;done

# NFS測試
cd /data
for i in {1..1000};do echo "${i}"; echo "${i}" > ${i}.txt;sleep 0.1;done
相關文章
相關標籤/搜索