天天看點

Rsync+inotify 實作實時同步資料檔案

什麼是Rsync?

rsync可以實作增量備份,配合inotify可以實作時事的資料備份

Rsync的三種工作模式

1)本地備份,相當于 cp 指令

将 /etc/hosts 檔案拷貝到 /tmp/ 目錄下

rsync -avz /etc/hosts /tmp/

删除一個目錄

先建立一個空目錄,然後使用 rsync 指令同步

mkdir /zhao

添加 --delete參數,目錄 zhao 為空

rsync --delete /zhao/ /tmp/

指令解釋:以前面的目錄為準,前面目錄有啥後面目錄有啥,前面目錄沒有的,後面目錄也不能有

2)通過網絡遠端 shell

push(推)

将本地的 /tmp/ 目錄中的内容推到 192.168.133.130 的 /opt/ 目錄下

rsync -avzP -e 'ssh -p 22' /tmp/ [email protected]:/opt/

pull(拉)

将 192.168.133.130 的 /tmp/ 目錄下的檔案拉到本地的 /opt/ 目錄下

如果下面的指令 /tmp/ 寫為 /tmp 則拉去的是 tmp 的整個目錄

rsync -avzP -e 'ssh -p 22' [email protected]:/tmp/ /opt/

3)daemon模式

daemon是我們平時工作中最長用的一種模式,本篇文章也主要是介紹的daemon模式

rsync 用戶端的常用參數

-a 歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性

-v 詳細模式輸出,傳輸時的進度等資訊

-z 傳輸時進行壓縮以提高傳輸效率

-r 對子目錄以遞歸模式,即目錄下的所有目錄都同樣傳輸,注意是小寫r

-t 保持檔案時間資訊

-o 保持檔案屬主資訊

-p 保持檔案權限

-g 保持檔案屬組資訊

-P 顯示同步的過程及傳輸時的進度等資訊

-D 保持裝置檔案資訊

-l 保留軟連接配接

配置 daemon 模式

在配置 daemon 模式前需要準備兩台虛拟機,我的虛拟機是CentOS6.7 64位

兩台的系統都一樣,詳細截圖如下

uname -r

cat /etc/redhat-release      

<a href="http://s3.51cto.com/wyfs02/M01/8D/A6/wKiom1ikjL_yLwkhAAAQB9YE8V4165.png" target="_blank"></a>

正常情況下系統預設就已經安裝 rsync,是以我們需要先檢查一下兩台機器是否已經安裝

這裡我隻截圖了一張,但是兩台必須都有 rsync 哈

rpm -qa | grep rsync

<a href="http://s3.51cto.com/wyfs02/M01/8D/A3/wKioL1ikjMCwB638AAAIe9u3q5I896.png" target="_blank"></a>

rsync daemon 端操作如下

rsync 預設沒有配置檔案,那麼我們就手動在 daemon 端建立配置檔案

touch /etc/rsyncd.conf

編輯 rsyncd.conf 檔案

vim /etc/rsyncd.conf

檔案内容如下

#Rsync server

#yuci

uid = rsync

gid = rsync

use chroot = no

max connections = 2000

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

ignore errors

read only = false

list = false

hosts allow = 192.168.0.0/24

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

###################################

[backup]

comment = www by yuci

path = /backup

添加 rsync 使用者

useradd -s /sbin/nologin -M rsync

啟動 rsync

rsync --daemon

檢查 873 端口是否開啟

netstat -tlunp | grep 873

<a href="http://s3.51cto.com/wyfs02/M02/8D/A6/wKiom1ikjMCi1qjhAAASJFBkbRk120.png" target="_blank"></a>

建立共享目錄

mkdir /backup

并将 /backup 目錄的屬主改為 rsync 使用者

chown -R rsync /backup/

<a href="http://s3.51cto.com/wyfs02/M02/8D/A3/wKioL1ikjMHS-f5jAAAMIHYPtgs459.png" target="_blank"></a>

因為後面還需要用到 inotify 配合腳本做實時同步,是以需要建立一個密碼檔案

使用者就是之前 rsyncd.conf 檔案中的 auth rsync 使用者

echo "rsync_backup::123456" &gt; /etc/rsync.password

<a href="http://s3.51cto.com/wyfs02/M02/8D/A6/wKiom1ikjMHh7a02AAAI8Gz6nW8738.png" target="_blank"></a>

安全考慮還需要更改該檔案的權限

chmod 600 /etc/rsync.password

<a href="http://s3.51cto.com/wyfs02/M00/8D/A6/wKiom1ikjMKiNv2BAAALWxEr9jI234.png" target="_blank"></a>

将該服務加到開機自動中

echo "rsync --daemon" &gt;&gt; /etc/rc.local

tail -1 /etc/rc.local

<a href="http://s3.51cto.com/wyfs02/M00/8D/A3/wKioL1ikjMLwq0uvAAAM2hxQtPE448.png" target="_blank"></a>

到此為止,rsync 的 daemon 端操作完成

rsync 用戶端的操作

還是在 client 端檢視系統中安裝了 rsync 軟體

rpm -qa | grep rsync     

<a href="http://s3.51cto.com/wyfs02/M01/8D/A6/wKiom1ikjMOzi7P8AAAIgrF0d8Q402.png" target="_blank"></a>

建立一個密碼檔案,内容隻需要有密碼即可

因為我們下面連接配接時,必須要指定連接配接的使用者,并修改這個檔案的權限

echo "123456" &gt; /etc/rsync.password

現在開始測試服務是否搭建成功,在測試前介紹一下環境

服務端:daemon  位址 192.168.133.131

用戶端:client  位址 192.168.133.130

現在我在 client 端測試推送功能,在 133.130 機器的 /tmp/ 目錄裡我建立了從1到5的5個目錄,嘗試推送到 133.131 的 /backup 目錄中

rsync -avz /tmp/ [email protected]::backup --password-file=/etc/rsync.password

<a href="http://s3.51cto.com/wyfs02/M02/8D/A6/wKiom1ikjMTi6zpWAAAruZocJkE801.png" target="_blank"></a>

在 133.131 上檢視 /backup 目錄

<a href="http://s3.51cto.com/wyfs02/M02/8D/A6/wKiom1ikjMSyZdEoAAAGUCj3hmA711.png" target="_blank"></a>

推送成功。       

繼續傳回到 133.130 上測試拉取服務

我将 133.130 的 /tmp 目錄清空,嘗試拉取 133.131 上的 /backup 目錄中的檔案

rsync -avz [email protected]::backup /tmp/ --password-file=/etc/rsync.password

<a href="http://s3.51cto.com/wyfs02/M02/8D/A3/wKioL1ikjMfz9GyWAAA4aHEqKqQ003.png" target="_blank"></a>

拉取成功。

可以通過以下腳本配合定時任務完成簡單的資料備份

腳本内容如下

#!/bin/bash

path=/backup

dir="`ifconfig eth0 | awk -F '[ :]+' 'NR==2 {print $4}'`_$(date +%F)"

mkdir $path/$dir -p &amp;&amp; \

/bin/cp /var/spool/cron/root $path/$dir/cron_root_$(date +%F) &amp;&amp; \

/bin/cp /etc/rc.local $path/$dir/rc.local_$(date +%F) &amp;&amp; \

rsync -az $path/ [email protected]::backup/ --password-file=/etc/rsync.password

定時任務,每一小時同步一次增量備份(定時任務做好寫絕對路徑)

00 01 * * * /bin/sh /root/bak.sh &gt; /dev/null 2&gt;&amp;1

每一小時同步一次,在某些情況下似乎達不到預期的标準,那麼就需要配合 inotify 進行實時同步了

安裝 inotify 軟體

安裝 inotify 軟體的前提 rsync 服務安裝成功,可以在用戶端推送拉取資料

另外:inotify 是在用戶端配置安裝的軟體,别裝錯了

檢查系統的核心版本,必須要在 2.6.16 以上才可以

<a href="http://s3.51cto.com/wyfs02/M00/8D/A3/wKioL1ikjMeSA2rWAAAG8B80p2I633.png" target="_blank"></a>

檢視是否有以下三個檔案,有這三個檔案才表示系統支援 inotify 服務

ls -l /proc/sys/fs/inotify/

<a href="http://s3.51cto.com/wyfs02/M00/8D/A3/wKioL1ikjMjgivRPAAAVHa38X8Y405.png" target="_blank"></a>

編譯安裝 inotify

tar zxf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure --prefix=/usr/local/inotify-tools-3.14

make &amp;&amp; make install

做一個軟連接配接,取出版本号

ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify

inotify 安裝目錄下的各目錄介紹

bin   #inotify執行指令(二進制)

include   #inotify程式所需用的頭檔案

lib   #動态連結的庫檔案

share  #幫助文檔

手動測試監控,下面的實驗是在本機上操作

因為測試監控的是 133.130 上的 /backup 目錄,是以需要建立一個 backup 目錄,監控 create 指令

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e create /backup

(-m  持續監聽狀态)

在新開一個視窗,在 /backup 目錄下建立檔案和目錄,在之前的視窗檢視有無反應

在新視窗下操作

touch test.txt

mkdir zhao

<a href="http://s3.51cto.com/wyfs02/M01/8D/A6/wKiom1ikjMjjt-O_AAAQjLjl_pM194.png" target="_blank"></a>

在之前的視窗中檢視

<a href="http://s3.51cto.com/wyfs02/M02/8D/A6/wKiom1ikjMmjRzaOAAAt1EsOK88130.png" target="_blank"></a>

檢測成功。那麼我們隻需要結合 rsync 的通過推送指令,就可以實作實時同步了。

最終的實時同步腳本指令

host01=192.168.133.131

src=/backup

dst=backup/

user=rsync_backup

rsync_passfile=/etc/rsync.password

inotify_home=/usr/local/inotify/

#panduan

if [ ! -e "$src" ] \

|| [ ! -e "${rsync_passfile}" ] \

|| [ ! -e "${inotify_home}/bin/inotifywait" ] \

|| [ ! -e "/usr/bin/rsync" ];

then

   echo "Check File and Folder"

   exit 9

fi

${inotify_home}/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete,attrib $src | \

while read line

do

   cd $src &amp;&amp; rsync -aruz -R --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} &gt; /dev/null 2&gt;&amp;1

done

exit 0

本文轉自   mlwzby   51CTO部落格,原文連結:http://blog.51cto.com/aby028/1898276