Ubuntu14.04 實現rsync+inotify 實時同步文件


  在分布式系統中通常要用到文件同步功能,一是為了備份,另一個原因則是用於代碼的一致性,在查閱了大多數的關於Ubuntu 下利用rsync 同步的文章,發現沒能有一個比較好的,或者說比較清析的文章來告知一些想用rsync 同步功能的人,現在博主我也僅僅做一些梳理,並提及我在配置rsync時遇到的問題,讓大家好繞過這些坑,省下程序員寶貴的時間。

  看一下需求具體化的圖

以實踐為主導,啥也不多說,讓服務跑起來。

一、在主服務器上(例中為192.168.52.130)

1.安裝rsync

sudo apt-get install rsync

2.修改 /etc/default/rsync

sudo vim /etc/default/rsync

可以看到對於服務的默認配置,修改以下配置

RSYNC_ENABLE=true //設置開啟同步
//在從服務器中需指定,主服務中不需要
RSYNC_CONFIG_FILE = '/etc/rsync/rsyncd.conf'// 設置配置文件位置

3.為了方便管理,添加rsync 文件同步的配置目錄(目錄可以自定義,沒有規定)

sudo mkdir -p /etc/rsync/

4.建立同步時的密碼文件rsyncd.secrects,並設置為600權限(必須),在里面只放密碼

#/etc/rsync/rsyncd.secrects
www-data

5.啟動服務

service rsync start // 修改配置也要重啟服務

 

二、在從服務器上(例中192.168.52.129)

從服務器上的1,2,3步跟主服務器一樣,裝安rsync前開啟同步,這邊就不再累贅了

4.復制默認配置至步驟3中的目錄下

cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsync/

5.修改配置文件

# sample rsyncd.conf configuration file

# GLOBAL OPTIONS

#motd file=/etc/motd
#開戶log日志
log file=/var/log/rsyncd.log
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the "pid file" line completely in that case.
#指定pid
pid file=/var/run/rsyncd.pid
#syslog facility=daemon
#socket options=

# MODULE OPTIONS

[www-data]
        #指定同步目錄    
        path = /data/www/
        use chroot = yes
#       max connections=10
        lock file = /var/lock/rsyncd
# the default for read only is yes...
        #不只是讀,還要寫權限
        read only = no
        list = yes
        uid = www-data
        gid = www-data
#       exclude = 
#       exclude from = 
#       include =
#       include from =
        #指定同步校驗用戶(與主服務中用於同步時用戶相同)    
        auth users = www-data
        #指定同步校驗用戶時的密碼文件
        secrets file = /etc/rsync/rsyncd.secrets
        strict modes = yes
        #指定host
        hosts allow = 192.168.52.130
        hosts deny = *
        ignore errors = no
        transfer logging = yes
        log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.

三、測試同步

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]

上面是一些rsync 語法的使用規則,具體可通過rsync –h 獲得詳細使用說明

sudo rsync -avzP --delete /home/user/test.log www-data@192.168.52.129::www-data --password-file=/etc/rsync/rsyncd.secrets

在上面命令是從192.168.52.130中運行的,www-data@192.168.52.129 這個www-data 與從服務中配置的auth users 是一致的, –password-file=/etc/rsyunc/rsyncd.secrets  中記錄的密碼須與從服務中一致,但僅記錄密碼,如下圖比較示

image

在從服務器中要記錄用戶及密碼用“:”分隔開。

測試結果如下在從服務器中已存在test.log文件

image

四、實現實時同步

1.對於上面的同步,並不能做到實時,在初期時,可能會做定時器做定時同步,但終究是不能達到業務需求的,所以還需要借助inotify

2.查看是否安裝inotify

ls /proc/sys/fs/inotify

如果能看到

max_queued_events  max_user_instances  max_user_watches

三個值的話說明已經安裝了,如果沒有,則要通過apt安裝

3.編寫監控腳本(在主服務器上)

#!/bin/bash
#param
host=192.168.52.129
src=/data/www/
dst_module=www-data
user=www-data
rsync_passwd=/etc/rsync/rsyncd.secrets
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e modify,delete,create,attrib ${src} | while read file
do
        /usr/bin/rsync -avzP --delete --progress ${src} ${user}@${host}::${dst_module} --password-file=${rsync_passwd}
        echo "${file} was rsyncd" >>/var/log/rsyncd.log 2>&1
done

通過inotifywait 方式實時監控對應文件夾下文件的變化,具體看inotifywait 命令,這邊不再累贅了。

最后對上面的腳本添加執行權限,並運行至后台進程,或是加入啟動運行。

關於在操作過程遇到的問題可以參考:http://blog.chinaunix.net/uid-13954085-id-158637.html

五、總結

1.由主向從推送同步文件,在主服務中不用配置同步配置文件,他只提供同步功能就可以。

2.在主服務器中要通過infotifywait 來實時監控要同步的文件。

3.在其他從服務器中要配置同步配置文件,並提供用戶:密碼格式的密碼文件與配置文件中對應的用戶。

4.inotify 服務會在多文件時報觀察數太少問題,應該對/proc/sys/fs/inotify/max_user_watches下的值進行修改,以便填加觀察數。

5.實時同步的同時為了提高同步文件的完整性,應在定時器中添加全量同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM