?實時數據同步方案{ rsync; inotify; }

實時數據同步方案{ rsync; inotify; }



rsync 傳輸數據

Rsync uses a reliable algorithm to bring remote and host files into sync very quickly. Rsync is fast because it just sends the differences in the files over the network instead of sending the complete files. Rsync is often used as a very powerfulmirroring process or just as a more capable replacement for the rcp command. A technical report which describes the rsync algorithm is included in this package.

rsync is a file transfer program capable of efficient remote update via a fast differencing algorithm.

特點概括如下:

  1. 僅傳輸發生變化的文件,傳輸效率高

  2. 傳輸速度快,安全,可靠

  3. 能鏡像備份完整的文件系統

  4. 配置簡單,使用簡單

安裝 rsyncd 服務

CentOS 6

  • 安裝 
    rsync非獨立服務代理于xinetd守護進程,因此必須安裝并啟動xinetd守護進程,在啟動rsync服務;

yum install rsync xinetd        #base repo提供
rpm -ql rsync
  • 主要文件 
    程序文件:/usr/bin/rsync 
    文檔文件:/usr/share/doc/rsync-3.0.6 
    托管配置:/etc/xinetd.d/rsync 
    服務配置(手動創建):/etc/rsyncd.conf

CentOS 7

  • 安裝 
    yum -y install rsync

  • 主要文件 
    程序文件:/usr/bin/rsync 
    服務配置:/etc/rsyncd.conf 
    Unit File/usr/lib/systemd/system/rsyncd.service

配置 rsyncd 服務

  • 配置文件簡介 
    分為一個公共配置段與多個同步共享段(module name)

# configuration example:

# uid = nobody                      #運行rsync用戶
# gid = nobody
# use chroot = yes                  #關閉chroot
# max connections = 4               #最大并發連接數
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/             #排除的目錄
# transfer logging = yes            #記錄傳輸日志
# timeout = 900                     #超時時間
# ignore nonreadable = yes          #忽略不可讀
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  #壓縮

# [ftp]
#        path = /home/ftp           #同步目錄
#        comment = ftp export area  

配置 rsync 手動同步示例

  • rsyncd 服務端配置

#Configure
uid = nobody                      
gid = nobody                    
use chroot = no                  
max connections = 10              
strict modes = yes                #開啟嚴格模式
pid file = /var/run/rsyncd.pid    #pid文件位置
log file = /var/log/rsyncd.log    #日志文件位置

#module name
[share]
path = /data/rsync
ignore errors = yes              
read only = no                    
write only = no                  
hosts allow = 10.1.253.0/24       #白名單
hosts deny = *                    #黑名單
list = false                      #不允許查看文件列表
uid = root                        #進程以root用戶執行,覆蓋默認配置
gid = root                        
auth users = alice                #被被允許登錄的用戶
secrets file = /etc/rsync.passwd  #該用戶的認證文件

  • 服務端生成授權用戶的認證文件

echo alice:alicepass > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
  • 客戶端為了自動驗證創建的密碼文件

echo alicepass > /etc/rsync_login.passwd
chmod 600 /etc/rsync.passwd

啟動 rsyncd 服務

CentOS 6

service xinetd start
chkconfig rsync on          #啟動rsync服務,chkconfig --list查看xinetd代理的服務
ss -tnl | grep ':873\>'

CentOS 7

systemctl start rsyncd.service
ss -tnl | grep ':873\>'

rsync 客戶端命令

支持兩種傳輸方式: 
一種是兩個shell之間無需rsyncd服務的數據傳輸,使用 :指明SRC文件系統路徑,登錄用戶為系統用戶; 
另一種是C/S模型的rsyncd服務端與rsync客戶端之間的數據傳輸,使用::指明同步段名(module name),登錄用戶為rsyncd配置文件中授權的用戶;

Usage: rsync [OPTION]... SRC [SRC]... DEST
 or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
 or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
 or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
 or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
 or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
 or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect to an rsync daemon, and require SRC or DEST to start with a module name.

如:
rsync -avz user@host::modName /path/rsync
rsync -avz /path/rsync rsync://user@host/modName

rsync 數據傳輸功能

基于 ssh 協議完成數據傳輸(無rsyncd服務)

該用法類似于scp命令,可實現PUSH本地文件至遠程,或PULL遠程文件到本地,只需主機安裝rsync程序即可;也就是說沒有rsync服務端一說;

  • PUSH 
    rsync -avz /data/rsync/ root@10.1.253.69:/data/rsync/

  • PULL 
    rsync -avz root@10.1.253.29:/data/rsync/* /data/rsync/

基于 rsync 協議完成數據傳輸(需rsyncd服務)

基于C/S模型的rsyncd服務端與rsync客戶端命令完成單向數據傳輸,數據傳輸使用rsync協議;

  1. 同步時無論是PUSHPULL都在客戶端完成,即客戶端同步對方到本機或同步本機到對方;

  2. 不能指定傳輸的文件,必須以共享目錄下的所有文件為單位進行傳輸;

  3. 必須使用-a-r遞歸選項,否則無法傳輸任何數據;

  4. 認證的用戶為rsyncd.conf文件中auth users指定的用戶和secrets file指定的mode為600的明文密碼文件。

    • Client PUSH 
      rsync -av /data/rsync/ alice@10.1.253.29::share 
       
      rsync -av /data/rsync/ rsync://alice@10.1.253.29/share

    • Client PULL 
      rsync -vr alice@10.1.253.29::share /data/rsync/ 
       
      rsync -vr rsync://alice@10.1.253.29/share /data/rsync/

rsync 數據同步功能

基于 rsync 協議完成數據同步(需rsyncd服務)

基于C/S模型的rsyncd服務端與rsync客戶端命令實現數據同步,數據傳輸使用rsync協議;

  1. 為了實現數據同步:與上文數據傳輸的區別是能夠--delete刪除服務端多出的文件,以及同步所有文件的元數據;

  2. 為了實現實時數據同步:即無需每次手動輸入密碼,通常把認證用戶的密碼文件寫在文件中;

  3. 同步時無論是PUSHPULL都在客戶端完成,即客戶端同步對方到本機或同步本機到對方;

  4. 同步時以共享目錄下的所有文件為單位進行傳輸;

  5. 必須使用-a-r遞歸選項,否則無法傳輸任何數據;

  6. 認證的用戶為rsyncd.conf文件中auth users指定的用戶和secrets file指定的權限為600的明文賬戶密碼文件。

  7. 客戶端登錄時使用的明文密碼存放在文件中,權限為600,用戶名則在user@host指定,username和password與服務端想對應即可。

    • Client PULL 
      rsync -vzrtopg --delete --password-file=/etc/rsync_login.passwd rsync://alice@10.1.253.29/share /data/rsync/ 
       
      rsync -avz --delete --password-file=/etc/rsync_login.passwd alice@10.1.253.29::share /data/rsync/

    • Client PUSH 
      rsync -vzrtogp --delete --password-file=/etc/rsync_login.passwd /data/rsync/ rsync://alice@10.1.253.29/share/ 
       
      rsync -vzrtogp --delete --progress --password-file=/etc/rsync_login.passwd /data/rsync/ alice@10.1.253.29::share 
       
      rsync -avz --delete ……因為-a可實現遞歸與歸檔的效果,同-rltogpD

  8. 同步參數說明: 
    -v, –verbose:詳細輸出同步的文件 
    –progress:顯示備份過程,進度條 
    -u, –update:僅更新舊文件,判斷mtime,不同步相同的文件 
    -z, –compress:壓縮傳輸 
    -r, –recursive:遞歸子目錄 
    -a, –archive:歸檔且遞歸,保留所有屬性,相當于-rltogpD 
    -l, –links:保留軟鏈接 
    -H, –hard-links:保留硬鏈結 
    -t, –times:保留時間戳 
    -o, –owner:保留屬主 
    -g, –group:保留屬組 
    -p, –perms:保留權限 
    -D, –devices:保留設備文件屬性 
    –delete:刪除多余的文件 
    –delete-after:傳輸完成后再刪除多余的文件 
    –force:強制刪除目錄,即使不為空 
    –password-file=login.passwd:從文件讀取密碼,代替手動輸入 
    –ignore-errors:忽略IO錯誤進行刪除 
    –partial:保留未完全傳輸的文件,恢復后斷點續傳 
    –compare-dest=DIR 比較DIR中的文件來決定是否需要同步 
    -c, –checksum:對傳輸完成的文件進行校驗 
    -b, –backup:不覆蓋原有文件,為其重命名name~ 
    –exclude=PATTERN:指定排除的文件或目錄,可模式匹配 
    –include=PATTERN:指定不排除的文件或目錄 
    –bwlimit=number:限制傳輸帶寬,KBytes per second

顯示rysncd服務端的目錄列表

  • 僅列出rsyncd服務端同步目錄下的所有文件,驗證用戶為服務端已經定義好的用戶; 
    rsync -v --password-file=/etc/rsync_login.passwd rsync://alice@10.1.253.29/share 
    或 
    rsync -v alice@10.1.253.29::share需手動輸入口令;

inotify監測文件

inotify-tools is 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.

使用inotifywait進程實時監控指定目錄下的所有文件,一旦有文件發生變化,通過管道觸發處于循環等待的rsync同步本地數據到遠程,借此實現了實時的數據同步;

安裝 inotify-tools 工具

  • yum安裝要求配置好Fedora Epel倉庫

yum install inotify-tools           #fedora-epel repo
rpm -ql inotify-tools
  • 主要文件 
    程序文件:/usr/bin/inotifywait/usr/bin/inotifywatch

inotifywait 命令

inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
   -m|--monitor:保持對指定目錄下文件的監控狀態,檢測到變化依然不退出
   -r|--recursive:遞歸子目錄
   -s|--syslog:輸出到日志文件
   -q|--quiet:靜默模式,只輸出events
   -e|--event <event1> [ -e|--event <event2> ... ]:指定監控的events(access,modify,attrib,close,move,delete,……)
   --timefmt <fmt>:指定時間格式,用 %T 代替輸出
   --format:指定輸出文件events變化的信息格式,如'%T %w%f %e'為:16-2-2 09:00 /data/rsync/xxATTRIB

如:
inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /data/rsync/

inotifywait+rsync 實時同步數據示例

inotifywait進程將持續監控指定路徑的events發生,如果發現修改或增加了文件,就會立即按照指定格式輸出相應的events;再結合rsync快速同步文件的功能,通過管道觸發rsync執行同步操作并循環接收inotifywait的輸出,即可實現數據的實時同步; 
建議在實現此步驟之前,必須先搞清楚rsync同步或傳輸數據的過程,以及在手動實現了數據同步的基礎上再嘗試與inotify相結合的實時數據同步; 
以下命令可使用&運行在后臺,也可寫成后臺執行的shell腳本,以實現將本地文件同步給多臺rsync服務器的效果;

inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /data/rsync/|while read line;do rsync -avz --delete --password-file=/etc/rsync_login.passwd /data/rsync/ alice@10.1.253.29::share; done

總結

rsync具有高效傳輸文件的特點,inotify能夠實時監控文件變化,相結合就能夠實時地將本地文件同步至服務端,尤其解決了小型站點的多臺Web服務器實時同步數據的問題。但是此方案并非真正的實時數據同步,畢竟inotify監控文件events只能在文件描述符close之后才有相應的輸出。但是,即便大型站點普遍采用分布式文件存儲的方案實現數據共享與同步,也不能否認rsync+inotify基本能夠實現數據的實時同步。

原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/56151

(0)
hellochelloc
上一篇 2016-10-29
下一篇 2016-10-29

相關推薦

  • LVS工作原理淺析

    一、什么是LVS         LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。         LVS集群采用IP負載均衡技術和基于內容…

    Linux干貨 2016-11-29
  • httpd配置支持https

    httpd配置支持https 建一臺私有CA 配置httpd支持ssl協議以及使用證書 測試基于https訪問的相應主機 rpm包安裝的httpd https https 超文本傳輸安全協議(英語:Hypertext Transfer Protocol Secure,縮寫:HTTPS,也被稱為HTTP over TLS,HTTP over SSL或HTTP …

    Linux干貨 2016-12-21
  • 第七周博客作業

    1、創建一個10G分區,并格式為ext4文件系統; (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; [root@localhost tmp]# cat /proc/partitions major minor #blocks name 8 16 52428800 sdb 8 17 1049041…

    Linux干貨 2017-03-06
  • 文本查看及處理工具

    文本查看及處理工具 wc wc命令用來計算數字。利用wc指令我們可以計算文件的Byte數、字數或是列數 語法 wc(選項)(參數) 選項 -c或–bytes或——chars:只顯示Bytes數; -l或——lines:只顯示列數; -w或——words:只顯示字數。 參數 文件:需要統計的文件列表 實例 [root@localhost tmp]# cat …

    Linux干貨 2018-03-18
  • 用shell腳本實現每天定時收集全網日志到一臺服務器

    需求 現在公司有這樣一個需求,需要收集每天全網運行業務的設備上的某個特定目錄底下的日志到一臺服務器(這臺服務器我們簡稱logserver),這并在這臺logserver上生成以日期為名字的目錄 解決思路: 在logserver的crontab里設置兩個腳本,在當日晚上23:30執行腳本1收集當日即將被刪除的全網腳本;在并在早上8:30執行腳本2,收集昨日全網…

    Linux干貨 2015-07-27
  • 馬哥教育網絡班22期+第1周課程練習

    1.描述計算機的組成及其功能 計算機的組成及各功能:  計算機主要由硬件、操作系統、軟件三大部分組成 硬件 :主要由五部分組成 :運算器:主要是做數據運算              控制器:控制計算機各部件的協調和尋址操作         …

    Linux干貨 2016-08-15
欧美性久久久久