?實時數據同步方案{ 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 17:30
下一篇 2016-10-29 18:42

相關推薦

  • Linux的基本介紹

    1、Linux的發行版分為:Debin,Slackware,Rhel,Redora,CentOS,Gentoo等,其中Rhel(Red Hat Enterprise Linux)使用的是版本比較老的內核,但它的系統比較穩定,一個發行周期是36個月,Fedora使用最新的應用和華麗的節目,但系統比較不穩定,一個發行周期是6個月。 2、Linux的哲學思想是一切…

    Linux干貨 2016-02-14
  • 學習宣言

    讓學習溶入生活,做一個優秀的專業人才。

    Linux干貨 2016-10-30
  • 教你如何在Fedora,CentOS,RHEL中檢查RPM包的依賴性

    我們都知道,在基于紅帽的Linux系統中,一個RPM包,需要把先將它依賴的其他包安裝好才能正常的工作。對于終端用戶,RPM的安裝、更新、刪除中存在的依賴關系已經被工具透明化了(如 yum或 DNF等)。但如果你是系統管理員或者RPM包的管理員,你需要諳熟RPM包的依賴關系,以便及時更新、刪除適當的包來保證系統的正常運行。 在本教程中,我將教大家如何檢查RPM…

    Linux干貨 2015-02-10
  • DHCP簡單闡述及配置實現方法

    DHCP是什么…… DHCP是Dynamic Host Configuration Protocol的縮寫,它是TCP/IP協議簇中的一種,主要是用來給網絡客戶機分配動態的IP地址。 其主要功能是: 用于內部網絡或網絡服務供應商自動分配IP地址給用戶 用于內部網絡管理員作為對所有電腦作中央管理的手段 直接點就是,這些被…

    Linux干貨 2016-12-05
  • linux初期了解

    計算機的組成及其功能 計算機有運算器,控制器,存儲器,輸出設備和輸入設備組成: 1.運算器:運算器又稱算術邏輯單元(Arithmetic Logic Unit簡稱ALU)。它是計算機對數據進行加工處理的部件,包括算術運算2.控制器:控制器負責從存儲器中取出指令,并對指令進行譯碼 3.存儲器:存儲器是計算機記憶或暫存數據的部件。 4.輸入設備:輸入設備是給計算…

    Linux干貨 2016-10-30
  • 變量

    變量     在shell腳本中,單獨的字符或者命令只能引用一次,對于變量,我們可以多次引用,且對變量的賦值修改方便。對于一條很長的命令或者頻繁使用的路徑等,我們可以賦值給一個變量,比如獲得系統中所有用戶的uid,要輸入很長的一段命令,我們如果每次使用都輸入命令是件很麻煩的事情,如果賦值變量,那么就會很方便。設置變量userui…

    Linux干貨 2017-08-06
欧美性久久久久