1. 程式人生 > >rsync+inotify-tools實時同步

rsync+inotify-tools實時同步

linux

rsync概述:

rsync是類unix系統下的數據鏡像備份工具——remote sync。一款快速增量備份工具 Remote Sync,遠程同步 支持本地復制,或者與其他SSH、rsync主機同步

Rsync(remote sync)是UNIX及類UNIX平臺下一款神奇的數據鏡像備份軟件,它不像FTP或其他文件傳輸服務那樣需要進行全備份,Rsync可以根據數據的變化進行差異備份,從而減少數據流量,提高工作效率。你可以使用它進行本地數據或遠程數據的復制,Rsync可以使用SSH安全隧道進行加密數據傳輸。Rsync服務器端定義源數據,Rsync客戶端僅在源數據發生改變後才會從服務器上實際復制數據至本地,如果源數據在服務器端被刪除,則客戶端數據也會被刪除,以確保主機之間的數據是同步的。Rsync使用TCP 873端口。


實驗描述:

192.168.1.155 ###目標主機(主)

192.168.1.156 ###源主機(客戶端)

通過rsync將源主機上的test1文件夾中的文件復制到目標主機test文件夾中。

然後使用cron定時任務定時執行

關閉兩臺服務器的防火墻( systemctl stop firewalld、setenforce 0)


rsync安裝配置:

在源主機配置:

[[email protected] ~]# yum -y install rsync

[[email protected] ~]# mkdir /root/test1

[[email protected] ~]# vim /etc/rsync_exclude.lst ###指定要排除復制的文件或目錄

123 123.txt ####指定排除123、123.txt文件或目錄

在test1文件夾中創建一個test.123文件,便於同步時,看是否成功


在目標主機配置:

[[email protected] /]# mkdir /root/test

[[email protected] /]# yum -y install rsync

[[email protected] /]# vim /etc/rsyncd.conf

uid = nobody

gid = nobody

use chroot = yes

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

path = /root/test

hosts allow = 192.168.1.156

hosts deny = *

[[email protected] /]# systemctl start rsyncd

[[email protected] /]# systemctl enable rsyncd


配置完成後,在源主機上執行rsync,並設置cron定時任務

[[email protected] ~]# rsync -avz --delete /root/test1/ 192.168.1.155:/test ###az參數是增量備份 aP是完整備份

[[email protected] ~]# rsync -avz --delete /root/test1/ 192.168.1.155:/test

The authenticity of host ‘192.168.1.155 (192.168.1.155)‘ can‘t be established.

ECDSA key fingerprint is df:21:e3:6c:36:9a:9d:b5:7e:28:ec:ba:a2:a9:f8:fb.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘192.168.1.155‘ (ECDSA) to the list of known hosts.

[email protected]‘s password:

sending incremental file list

./

test.123

sent 90 bytes received 34 bytes 22.55 bytes/sec

total size is 0 speedup is 0.00

[[email protected] ~]#

[[email protected] ~]# crontab -l

* 02 * * * rsync -avz --delete /root/test1/ 192.168.1.155:/test

rsync中的參數:

-r 是遞歸   -l 是鏈接文件,意思是拷貝鏈接文件;-p 表示保持文件原有權限;-t 保持文件原有時間;-g 保持文件原有用戶組;-o 保持文件原有屬主;-D 相當於塊設備文件;   -z 傳輸時壓縮;   -P 傳輸進度;   -v 傳輸時的進度等信息,和-P有點關系,自己試試。可以看文檔;   -e ssh的參數建立起加密的連接。   -u只進行更新,防止本地新文件被重寫,註意兩者機器的時鐘的同時   --progress是指顯示出詳細的進度情況   --delete是指如果服務器端刪除了這一文件,那麽客戶端也相應把文件刪除,保持真正的一致   --password-file=/password/path/file來指定密碼文件,這樣就可以在腳本中使用而無需交互式地輸入驗證密碼了,這裏需要註意的是這份密碼文件權限屬性要設得只有屬主可讀。

--bwlimit rsync限速參數(限制速度很簡單,添加個參數即可bwlimit,後面的值是多少k Bytes/s,有些機房會限制機器的流量,為了不觸及底線,在使用scp和rsync的時候都要註意。

為了避免你的scp或者rsync因為無良&懶惰的OPS設置防火墻的偷懶而造成的斷流現象,我們必須對自己的數據傳輸進行一定的限流措施,慢一點總比被斷了的好)


Rsync+Inotify-tools實現數據實時同步

上面已經說過,使用rsync進行同步,就算是定時任務,也不是實時的,這時我們要用到一個軟件進行輔助 inotify-tools

inotify-tools 是為linux下inotify文件監控工具提供的一套c的開發接口庫函數,同時還提供了一系列的命令行工具,這些工具可以用來監控文件系統的事件。 inotify-tools是用c編寫的,除了要求內核支持inotify外,不依賴於其他。inotify-tools提供兩種工具,一是inotifywait,它是用來監控文件或目錄的變化,二是inotifywatch,它是用來統計文件系統訪問的次數

下載地址:https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

由於rsync同步時,要輸入對方的賬號密碼,每次同步時都要輸入,這時可以用ssh免秘鑰登陸,前面章節已經講過,這裏不做敘述。

1.inotify安裝步驟:

wget https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz

tar zvxf inotify-tools-3.13.tar.gz

cd inotify-tools-3.13/

./configure && make && make install

2.編寫腳本

vim /auto_inotify.sh (這裏是從rsync服務器同步到客戶端,推流)

#!/bin/sh

src=/root/test/

des=/root/test1/

ip=192.168.1.156

inotifywait -mrq --timefmt ‘%d/%m/%y-%H:%M‘ --format ‘%T %w%f‘ -e modify,delete,create,attrib ${src} | while read file

do

for i in $ip

do

/bin/rsync -a --delete $src [email protected]$ip:$des

done

done

解釋:

#!/bin/sh

src=/root/test/ ###inotify監控的目錄 (服務端目錄)

des=/root/test1/###客戶端目錄

ip=192.168.1.156###客戶端IP

inotifywait -mrq --timefmt ‘%d/%m/%y-%H:%M‘ --format ‘%T %w%f‘ -e modify,delete,create,attrib ${src} ###檢查服務器哪個文件在實時變化 | while read file ###讀取文件

do

for i in $ip ###通過循環進行同步

do

/bin/rsync -a --delete $src [email protected]$ip:$des

done

done

3.運行腳本並在後臺執行

[[email protected] test]# 【nohup】sh /auto_inotify.sh &(最好加上nohup 如果只加上&那麽關閉終端,運行程序也隨之關閉加上nohup終端關閉後臺也會運行)

[1] 8856

nohup sh /auto_inotify.sh &

[email protected] test]# ps -ef | grep auto_inotify.sh

root 16486 1 0 11:32 ? 00:00:00 sh /auto_inotify.sh

root 16488 16486 0 11:32 ? 00:00:00 sh /auto_inotify.sh

root 16573 16493 0 11:33 pts/1 00:00:00 grep --color=auto auto_inotify.sh

[[email protected] test]# ps -ef | grep inotifywait

root 16487 16486 0 11:32 ? 00:00:00 inotifywait -mrq --timefmt %d/%m/%y-%H:%M --format %T %w%f -e modify,delete,create,attrib /root/test/

root 17545 16493 0 11:37 pts/1 00:00:00 grep --color=auto inotifywait

擴展:nohup

原程序的的標準輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用。(也就是原本輸出在屏幕上的,現在輸到一個文件中,相當於一個日誌)


本文出自 “帥小欣” 博客,請務必保留此出處http://jiaxinwang.blog.51cto.com/12273793/1967114

rsync+inotify-tools實時同步