rsync+inotify組合實現實時同步

首先準備兩臺服務器(centos7)html

A:192.168.75.160   git

B:192.168.75.161  github

A機器當作客戶端,B機器當作服務端shell

rsync 安裝vim

客戶端服務器端都要安裝rsync ,可是客戶端A不須要啓動,服務器端B須要啓動centos

接下來先安裝rsync,能夠用源碼安裝,從rsync官網:rsync.samba.org,下載源碼包,或者用yum安裝bash

1)源碼安裝:服務器

能夠進到 https://rsync.samba.org/ftp/rsync/下載socket

也能夠用wget下載工具

 

# tar -xzvf rsync-3.1.3.tar.gz 

# ./configure   (默認的安裝路徑是/usr/local 能夠經過 ./configure --help查看到)

# make && make install

安裝完成,若是須要開機啓動的話,須要把rsync啓動命令放到 rc.local 文件中,服務端須要開機啓動,客戶端不須要

echo "/usr/local/bin/rsync --daemon --config=/etc/rsyncd.conf" >>/etc/rc.local

2)rpm安裝(yum)

# yum install rsync

yum 安裝會把rsync安裝到 /usr/bin目錄下,而且會生成 /etc/xinetd.d/rsync文件;

若是想要開機啓動和源碼安裝方式相同,還有另外方法:

用yum安裝時,會生成/etc/xinetd.d/rsync文件

centos7 下 rsync 默認會以xinetd方式運行rsync服務,因此只需啓動xinetd服務便可

可是要修改下配置文件/etc/xinetd.d/rsync 

  1 # default: off                                                                                                  
  2 # description: The rsync server is a good addition to an ftp server, as it \
  3 #   allows crc checksumming etc.
  4 service rsync
  5 {
  6     disable = no
  7     flags       = IPv6
  8     socket_type     = stream
  9     wait            = no
 10     user            = root
 11     server          = /usr/bin/rsync
 12     server_args     = --daemon --config=/etc/rsyncd.conf
 13     log_on_failure  += USERID
 14 }

配置完畢後 ,還須要安裝xinetd包,不然xinetd服務沒法啓動,

# yum install xinetd  安裝

# /etc/init.d/xinetd start  啓動

# chkconfig xinetd on   設置開機啓動

# netstat -tunlp | grep 873  檢查是否啓動成功 

rsync配置

服務器端配置:

rsync服務器端須要兩個配置文件 rsyncd.conf rsyncd.password

1)rsyncd.conf文件

rsyncd.conf 默認放在/etc 目錄下此文件須要手動建立,是rsync服務的主配置文件;rsyncd.password 主要 用戶存儲rsync用戶名和密碼

uid = root
gid = root
use chroot = no
max connections = 10
timeout=600
log file = /var/run/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock

[backup]
path = /root/backup/
ignore errors
read only = no
list = no
auth users = cap
secrets file = /etc/rsyncd.password
host allow = 192.168.75.160

rsync默認是在nobody用戶下運行,爲了以後因爲不明權限問題影響,此處uid=root用戶

[backup]爲要同步的模塊名稱 能夠隨意命名,但以後用到模塊須要名稱保持一致 ,能夠有多個模塊,此處指舉了一個例子

path 爲該模塊要同步的目錄 

auth users 爲用戶,這個用戶是本身命名,跟系統用戶沒有關係,是在 rsyncd.password 文件中與之對應的

secrets file 爲用戶、密碼文件

2) rsyncd.password

只需添加 用戶名 : 密碼便可 (能夠有多組用戶名和密碼)

# vim /etc/rsyncd.password

cap:cap

建立完成以後更改這個文件的權限爲600 

# chmod 600 /etc/rsyncd.password

建立完畢以後,須要對模塊中的目錄受權

chown root:root -R /root/backup/

客戶端配置

客戶端配置只須要建立 /etc/rsyncd.password文件

客戶端rsyncd.password文件裏面只須要添加密碼便可,不須要用戶,可是有多個用戶名和密碼時,注意與服務器端rsyncd.password文件順序對應上

# vim /etc/rsyncd.password

cap

一樣受權 600  

# chmod 600 /etc/rsyncd.password

啓動rsync服務

若是使用源碼安裝rsync  使用 rsync-daemon 來啓動rsync

# echo PATH=$PATH:/usr/local/bin/ >> /etc/profile
# source /etc/profile
# rsync -daemon
# ps aux | grep rsync
# netstat -tunlp | grep 873

若是 rsync 的配置文件不在 /etc/目錄下,那麼啓動時須要在參數中手動加上配置文件路徑,好比

rsync --daemon --config=/RSYNCPATH/

若是用yum安裝

/etc/init.d/xinetd start

中止服務

源碼安裝中止方法 

# pkill rsync

yum安裝中止方法

/etc/init.d/xinetd stop

inotify的安裝

再客戶端進行安裝,inotify主要功能是監視客戶端被監控目錄是否有變化,若是有變化,就向服務器端進行推送

先查看當前系統是否支持inotify

[root@VM_8_32_centos ~]# ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Dec 18 15:50 max_queued_events
-rw-r--r-- 1 root root 0 Dec 18 15:50 max_user_instances
-rw-r--r-- 1 root root 0 Dec 18 15:50 max_user_watches

顯示這三個文件證實支持

這三個文件說明

max_user_watches:設置inotifywait或inotifywatch命令能夠監視的文件數量(單進程)
max_user_instances:設置每一個用戶能夠運行的inotifywait或inotifywatch命令的進程數。
max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。

安裝inotify方式能夠用源碼包安裝 也能夠用yum安裝

源碼安裝:

# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar -xzvf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure  --prefix=/usr/local/inotify
# make
# make install
 
 

[root@VM_8_32_centos bin]# ls /usr/local/inotify/bin/
inotifywait inotifywatch

一共安裝了2個工具(命令),即inotifywait和inotifywatch

inotifywait:在被監控的文件或目錄上等待特定文件系統事件(open、close、delete等)發生,執行後處於阻塞狀態,適合在shell腳本中使用。

inotifywatch:收集被監視的文件系統使用度統計數據,指定文件系統事件發生的次數統計

接下來編寫腳本,rsynctest.sh

#!/bin/bash
#
src=/root/backup/
des=backup
host=192.168.75.161
user=cap
/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 -vzrtopg --delete --progress --password-file=/etc/rsyncd.password $src $user@$host::$des
    echo "${files} was fsynced " >>/tmp/rsync.log 2>&1
done

運行rsynctest.sh腳本,這個腳本是我在網上找的,有個問題就是裏面  inotifywait 監控到變化的 files 變量 ,在下面rsync中實際並無用到,這樣每次雖然監控到是哪些文件有變化,可是rsync都是作的全量同步,又找了其餘文檔,有以下寫法

#!/bin/bash
#
src=/root/backup/
user=cap
host=192.168.75.161
des=backup

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e modify,delete,create,attrib,close_write,move $src | while read file
do
    INO_EVENT=$(echo $file | awk '{print $4}')
    INO_FILE=$(echo $file | awk '{print $3}')
    echo "------------------------------$(date)--------------------------"
    echo "$file"
    echo "$INO_EVENT"
    echo "$INO_FILE"
    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
    then
        echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
        rsync -avzcR --password-file=/etc/rsyncd.password $(dirname ${INO_FILE}) $user@$host::${des}
    fi
    if [[ $INO_EVENT =~ 'DELETE' ]]    || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
    then
        echo 'DELETE or MOVED_FROM'
        rsync -avzcR --delete --password-file=/etc/rsyncd.password $(dirname ${INO_FILE}) $user@$host::${des}
    fi
    if [[ $INO_EVENT =~ 'ATTRIB' ]]
    then
        echo 'ATTRIB'
        if [ ! -d "$INO_FILE" ]
        then
            rsync -avzcR --password-file=/etc/rsyncd.password $(dirname ${INO_FILE}) $user@$host::${des}
        fi
    fi
done

如今能夠進行測試,在客戶端 /root/backup/ 目錄下進行文件操做(增刪改查等),服務器端會隨之更新變化

 PS

rsync --delete /空目錄 /要刪除的目錄
ctrl + R --> 輸入歷史命令的關鍵字 --> 按下右光標鍵

參考文獻:https://yq.aliyun.com/articles/43197

      https://www.ilanni.com/?spm=a2c4e.11153940.blogcont43197.26.1aad7857f1yu9o&p=8513

      https://www.cnblogs.com/hackerer/p/5243639.html

      https://www.cnblogs.com/ginvip/p/6430986.html

相關文章
相關標籤/搜索