rsync+inotify實現實時同步

一、數據同步:linux

1.數據同步:git

A服務器的一個目錄同步到B服務器上的一個目錄github

方法是:能夠在A服務器上把這個目錄共享(如ftp,http等),而後B服務器上寫shell腳本,用crontab作定時任務下載過來(數據同步不實時)算法

實時同步shell

方法是:rsync遠程目錄實時同步apache

             drbd遠程存儲實時同步(很老的方案)vim

             共享存儲,就是同一個磁盤設備同時被不少人用瀏覽器

             分佈式存儲(雲存儲)安全

二、同步、異步和遠程同步bash

sync同步

async異步

rsync 遠程同步

這裏主要說rsync,在開始以前須要瞭解如下幾個問題:

rsync是什麼;rsync的工做原理;rsync優勢不足;rsync認證方式;安裝rsync;rsync命令參數詳解;配置rsync;rsync的啓動與關閉;rsync同步實例

2.1 rsync是什麼

rsync(remote synchronize)是Liunx/Unix下的一個遠程數據同步工具。它可經過LAN/WAN快速同步多臺主機間的文件和目錄,並適當利用rsync算法(差分編碼)以減小數據的傳輸。

rsync第一次會全量傳輸,後續會對比兩個文件的不一樣,只傳輸文件更新的部分,傳輸速度比通常工具快。

rsync還能夠拷貝、顯示目錄屬性及拷貝文件,並可選擇性的壓縮及遞歸拷貝。

2.2 rsync的工做原理

2.2.1 命令或者腳本運行以後,同步端開始構造FileList,FileList就是被同步端須要同步的文件索引,name->id(每一個文件都有一個id值,如MD5)

2.2.2 同步端構造完成以後,將FileList發送到被同步端,被同步端rsync處理髮送的FileList,而後開始同步。

2.2.3第二次同步時,由於兩邊的都有文件,同步端構造發送這邊的FileList,被同步端rsync處理同步端發送的FileList,根據MD5值比較,刪除同步端已經相同的文件信息,保留不存在和更新的文件,來構建新的FileList。

2.2.4 同步端收到被同步端新的FileList,而後開始同步文件到同步端。

2.3 rsync有點

優勢:

安全性高

備份迅速,使用同步算法,只比較變化

支持增量備份

保存源目錄整個目錄樹和文件系統

保持源文件的權限、時間、軟硬鏈接等

無需特使權限便可安裝

優化流程和比較高的文件傳輸效率。

多樣方式來傳輸文件。

支持匿名運行,方便網站鏡像。

與scp相比,rsync傳輸速度遠在scp之上。(局域網測試,rsync是scp的20倍)

解決對實時性要求不高的數據備份需求

不足:

同步數據,須要掃描全部文件進行對比,才進行差量傳輸。若是文件數量達到百萬甚至千萬級,掃描文件對比文件將很是耗時,下降了rsync效率。

rsync不能實時地區監測、同步數據。雖然能夠經過守護進程方式觸發同步,但兩次動做間有時間差,致使數據不一致,沒法應對出現故障時徹底恢復數據。

解決: rsync+inotify來彌補不足。

2.4 認證方式

2.4.1 兩種方式

rsync-daemon

ssh

注意:在使用rsync時,同步端和被同步端都必須安裝rsync程序。

2.4.2 rsync-daemon認證

rsync-daemon認證方式下,默認監聽毒tcp的873端口

在rsync-daemon認證下,rsync能夠把密碼寫入到一個文件中。

注意:被同步端的rsync必須啓動,配置文件。同步端能夠不起動服務,但必須有這個應用。

2.4.3 ssh認證

經過ssh隧道進行傳輸,相似於scp工具,同步操做不在侷限於rsync中定義的同步文件夾,而且雙方只要安裝rsync,也不要雙方啓動rsync。

如:rsync -avz /root/test root@192.168.19.248:/root/

若rsync服務端SSH爲非標準端口,可經過rsync的-e參數進行端口指定。使用方式以下:

rsync -avz /root/test -e ‘ssh -p1234’ root@192.168.19.248:/root/

2.5通常用到的工具跟實例

2.5.1 wget工具

wget http://10.1.1.9/linux_basic01.txt   --直接下載到當前目錄
wget --no-check-certificate https://www.baidu.com/img/bd_logo1.png   # 有https鏈接的,下載時須要加--no-check-certificate參數
wget http://10.1.1.9/linux_basic01.txt -O /test/123  #把文件下載下來更名爲/test/123
wget -m -k -np http://10.1.1.9/shell/#只下載shell目錄,但注意shell後面必定要加/
wget -m  http://www.xxx.com#下載整個網站

2.5.2 轉化本地yum源:

如何下載一個epel的擴展yum源,並轉化成本地的yum源

使用wget下載;使用reposync下載

reposync下載的作法步驟以下:

先在本地yum配置裏寫上你要下載的yum源的路徑,如

# vim /etc/yum.repos.d/rhel-source.repo
[epel]
server=epel
baseurl=http://xxx.xxx.xxx/--網絡路徑
gpgcheck=0
enabled=1
# yum repolist    --列出你如今全部配置的repo的名字
# reposync --repoid=epel--把epel路徑的全部軟件包下載到本地當前目錄
下載到本機目錄後,cd進去,使用createrepo  .命令建立軟件倉庫的貨物清單目錄repodata
把yum的寫法改爲
# vim /etc/yum.repos.d/rhel-source.repo
[epel]
server=epel
baseurl=file:///xxx/--寫上你的本地目錄路徑(也就是repodata的上級目錄地址)
gpgcheck=0
enabled=1

3 安裝rsync

兩種方式:源碼安裝和rpm安裝

3.1源碼安裝

3.1.1 下載

先去官網下載源碼包

https://rsync.samba.org/
wget --no-check-certificate https://download.samba.org/pub/rsync/rsync-3.1.2.tar.gz

有https鏈接的,下載時須要加--no-check-certificate參數

3.1.2 安裝

[root@localhost rsync-3.1.2]# tar xf rsync-3.1.2.tar.gz 
[root@localhost rsync-3.1.2]# cd rsync-3.1.2
[root@localhost rsync-3.1.2]# ./configure
[root@localhost rsync-3.1.2]# make && make install
注意:須要gcc庫要提早安裝
默認會安裝到/usr/local/下,經過./configure --help

wKiom1keTdDhsqfGAAANQJJ3kUE385.png-wh_50

安裝完成後,查看rsync幫助,須要切換到/usr/local/bin目錄下:
/usr/local/bin
rsync -h
[root@localhost rsync-3.1.2]# cd /usr/local/bin
[root@localhost bin]# ll
total 1344
-rwxr-xr-x 1 root root 1373922 May 16 18:46 rsync
[root@localhost bin]# pwd
/usr/local/bin
源碼安裝的rsync,須要開機啓動,把啓動命令放在rc.local文件中,以下:
echo 「/usr/local/bin/rsync –daemon –config=/etc/rsyncd.conf」>>/etc/rc.local
也能夠寫成:
echo 「/usr/local/bin/rsync –daemon」>>/etc/rc.local
cat /etc/rc.local

3.2 RPM方式安裝

直接yum安裝:yum -y install rsync
查看rsync安裝位置,以下:
[root@localhost bin]# rpm -ql rsync
rsync安裝到了/usr/bin,而且生成一個/etc/xinetd.d/rsync文件。
查看安裝時產生的幫助文檔:
[root@localhost bin]# more /usr/share/doc/rsync-3.0.6/README
which rsync
rsync --help

3.3 可否把rsync作成服務的形式,加上一些控制功能或日誌記錄功能

3.3.1兩個知識點:

xinetd

man rsyncd.conf

兩個一塊兒共存,共同控制rsync

3.3.2 xinetd介紹

xinetd相似於一個託管服務,託管其餘一些其它小服務,好處是可使用xinetd強大的參數來控制這些服務

如:

/etc/xinetd.conf--主配置文件,通常不用配置,主要配置子配置文件
/etc/xinetd.d--子配置文件目錄
xinetd服務至關因而全部被拖管服務的總開關
# yum install  -y xinetd
xinted須要配置文件:
vi /etc/xinetd.d/rsync    --(man xinetd.conf參考幫助)
service rsync
{
disable = no     --yes表示關閉,no表示開啓 (啓動rsync服務,兩個條件:1,disable = no 2,xinetd服務要啓動)
flags = IPv6
socket_type = stream
wait = no        --併發鏈接
user = root      --跑守護進程的用戶
server = /usr/bin/rsync  --啓動程序路徑
server_args = –daemon –config=/etc/rsyncd.conf --啓動參數(這三個參數合起來就是表示用root身份執行/usr/bin/rsync --daemon來啓動rsync服務)
log_on_failure += USERID  --控制日誌格式,表示登陸服務失敗時,在日誌原格式上加上記錄USERID
}
配置完畢,還須要安裝xinted軟件包,不然沒法啓動xinetd
root@localhost bin]# yum install -y xinetd
[root@localhost bin]# /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]
[root@localhost bin]# /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]
[root@localhost bin]# chkconfig xinetd on
[root@localhost bin]# netstat -tlunp |grep 873
tcp        0      0 :::873                      :::*                        LISTEN      8831/xinetd

4 rsync命令參數詳解

查看參數最好的方法就是去查看幫助信息:

rsync --help

4.1 經常使用參數

-v, –verbose詳細模式輸出。

-a, –archive歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性不變。

-l 保留軟連接

-R 保留相對路徑

-H 保留硬連接

-p,-o,-g,-A  分別保留權限,屬主,屬組,acl等,但若是加了-a,這些就都包括了

-z, –compress對備份的文件在傳輸時進行壓縮處理。

-D    等於--devices  --specials    表示支持b,c,s,p類型的文件

–delete:刪除那些DST中存在而在SRC中沒有的文件。

4.2 普通應用

rsync -av  /home/    /backup/                           --本機上的同步,把/home目錄下的內容同步到/backup目錄下(包括隱藏文件)
rsync -av /home/ 192.168.19.248:/backup/                     --把本地的/home目錄內容,同步到遠端218的/backup目錄下,須要遠程的192.168.19.248的密碼
rsync -av 192.168.19.248:/backup/ /backup/                   --把遠端218的/backup目錄下的內容同步到本地的/backup目錄,須要遠程的192.168.19.248的密碼
rsync  -a /test/ '-e ssh -p 2222' 192.168.19.248:/test1/  --若是遠程機192.168.19.248的ssh端口不爲默認的22,好比改爲了2222,那麼須要這樣寫

注意的問題:

同步時保留原路徑,也就是把/home同步到/backup會變成/backup/home/*再內容

--原目錄後面加不加/也影響你的同步

下面這三個有區別:

rsync -av /home/ /backup/       
--/home下的內容直接同步到/backup下
 
rsync -av  /home    /backup/
rsync -aRv  /home/    /backup/
--這兩上是/home被同步成/backup/home/*
 
# rsync -av /share/20160516 /backup/
--被同步成/backup/20160516/*
 
# rsync -aRv /share/20160516  /backup/
--被同步成/backup/share/20160516/*
 
若是源目錄有文件被刪除了,那同步的目標目錄是刪除仍是不刪除,是否能夠用參數來控制?
--delete
# rsync  -aHAX --delete /test/ /test1/        --比較完整的一個寫法
擴展file extended attributes
# lsattr /etc/shadow        --列出文件屬性
-------------e- /etc/shadow
# chattr +i /etc/shadow        --對這個文件加一個i屬性(i屬性表示文件徹底不可變,不可刪),會讓全部用戶不能修改密碼
# lsattr /etc/shadow
----i--------e- /etc/shadow
# chattr -i /etc/shadow        --去掉i屬性

5 配置rsync

5.1rsync被同步端配置

兩個文件:rsyncd.conf rsyncd.password

字面上看,一個是主配置文件,一個是存放認證用戶密碼的。安裝完成rsync時,不會生成這個兩個配置文件,須要手工建立。cat /etc/rsyncd.conf --此文件不存在,須要手動創建(man rsyncd.conf參考幫助),路徑必須是/etc/rsyncd.conf

motd file=/etc/rsyncd.welcome  --歡迎文件,路徑自定義
uid = root
gid = root
user chroot = no
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
 
[backup]       -共享給客戶端看到的名字,名字自定義
path = /backup/  --實際共享的服務器路徑,名字必須是你要共享的實際路徑
ignore errors
read only = no
list = no
hosts allow = 192.168.19.0/255.255.255.0
auth users = test
secrets file = /etc/rsyncd.password
 
[www]
path = /www/
ignore errors
read only = no
list = no
hosts allow = 192.168.19.0/255.255.255.0
auth users = apache
secrets file = /etc/rsyncd.password
vim /etc/rsyncd.welcome--手動創建本身定義的motd文件,並寫上自定義的歡迎信息
rsyncd.password的配置
echo 「test:test」>>/etc/rsyncd.password
echo 「apache:apache」>>/etc/rsyncd.password
cat /etc/rsyncd.password

注意:該密碼文件中的用戶和密碼能夠進行自定義,同時該用戶不必定要在服務器中的系統用戶存在。

密碼文件建立完畢後,要把其權限要設置爲600,不然會在之後同步時提示驗證出錯。以下:

chmod 600 /etc/rsyncd.password

以上兩個文件建立完畢後,咱們來建立其對應的目錄並受權,以下:

mkdir /{backup,www}
chown root:root –R /backup/
chown root:root –R /www/

5.2同步端配置

不須要啓動rsync服務,建立密碼文件便可。

echo 「apache」>>/etc/rsyncd.password

chmod 600 /etc/rsyncd.password

注意:該密碼文件中只能存放一個用戶的密碼,而且該文件與rsync服務器端的密碼文件同樣也須要把其權限設置爲600。


5.3 驗證

# rsync -a 10.1.1.9::--直接這樣能夠查看10.1.1.9這個服務器共享了哪些
        "hello today! @_@"--這就是你rsyncd.welcome裏寫的歡迎內容
notes                   --這就是共享的名字
# rsync -a 10.1.1.9::notes /notes/

--這樣同步,是不須要密碼的;注意notes爲共享名,前面有兩個:: 後面/notes爲本地目錄

--沒有密碼有好處也有壞處,好處是不須要密碼方便寫腳本作遠程同步。若是要密碼寫腳本就要用到expect自動應答。壞處就是不安全,但你可使用iptables等來增強安全。

--若是你但願有密碼,也不用傳密碼的話,能夠用rsyncd自己自帶的secrets file來作驗證的用戶

5.4 同步出現的問題

若是同步報permission denied這種,多是服務端selinux沒有關閉

關閉selinux的方法:

# setenforce 0    --這是立刻把selinux由強制模式改爲警告模式

# vim /etc/selinux/config

SELINUX=disabled--把這個改爲disabled,而後須要重啓電腦才能生效

同步時間慢

解決方法:綁定對方主機名

5.5在上面的基礎上加上一些功能

要求:

把日誌記錄到/var/log/rsyncd.log

共享模塊要求隱藏(也就是說客戶端查看不到這個模塊名)  

而且同時只能1個客戶端鏈接進行同步這個module

只能容許192.168.19.x(ip你自定義)同步這個module

只能早上9點到下午6點同步

實現:

方法1:在/etc/xinetd.d/rsync 加上參數log_type file /var/log/rsyncd.log;

方法2:在/etc/xinetd.d/rsync 加上參數log_type syslog local5;

方法3:在/etc/rsyncd.conf加上參數 log file=/var/log/rsyncd.log;

方法4:在/etc/rsyncd.conf加上參數syslog facility=local5;   --但這一句在rhel6.5經測試,必需要放在global配置裏,放到modules配置裏不能產生日誌

--方法2和4還須要在/etc/rsyslog.conf里加上local5.*  /var/log/rsyncd.log

# vim /etc/rsyncd.conf
motd file=/etc/rsyncd.welcome
[notes]
path=/share/20160516
list=false
max connections=1
log file=/var/log/rsyncd.log
hosts allow=192.168.19.x   
 
# vim /etc/xinetd.d/rsync
access_times = 9:00-18:00
# /etc/init.d/xinetd restart

6 rsync的啓動與關閉

6.1啓動服務

源碼包安裝的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 –daemon –config=/etc/rsyncd.conf

若是加載能夠查看幫助文檔: rsync –daemon –help

rpm的加入到xinetd中,直接啓動xinetd便可

6.2關閉服務

源碼 pkill rsync

rpm /etc/init.d/xinetd stop

實現實時同步(也就是源一變化,它就會觸發同步)


7 inotify

7.1 inotify是什麼

inotify是一種強大的、細粒度的、異步的文件系統事件監控機制。

 經過inotify能夠監控文件系統中的添加、刪除、修改、移 動等各類細微事件。利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools就是這樣一個第三方軟件。rsync同步數據的實時性問題恰好有inotify獲得彌補

7.2 inotify相關參數解析

inotify定義了三個接口參數,能夠用來限制inotify消耗kernel memory的大小。

這些參數是內存參數,能夠根據需求實時調節大小

/proc/sys/fs/inotify/max_queued_evnets

表示請求events數的最大值,超出這個值的事件將被丟棄。該值默認爲16384。 

注意:max_queued_events是inotify管理的隊列的最大長度,文件系統變化越頻繁,這個值就應該越大。

若是你在日誌中看到Event Queue Overflow,說明max_queued_events過小須要調整參數後再次使用。

 

/proc/sys/fs/inotify/max_user_instances

表示每一個user可建立的instances數量上限。該值默認爲128。

 

/proc/sys/fs/inotify/max_user_watches

表示可監控目錄的最大數。該值默認爲8192。

要修改以上默認值,咱們可使用如下相似手段修改。以下:

echo 30000000>/proc/sys/fs/inotify/max_user_watches

8 inotify監控文件事件類型

inotify可監控的文件系統事件類型,以下:

IN_ACCESS:文件被訪問。

IN_MODIFY:文件被write。

IN_ATTRIB:文件屬性被修改,如chmod、chown等。

IN_CLOSE_WRITE:可寫文件被close。

IN_CLOSE_NOWRITE:不可寫文件被close。

IN_OPEN:文件被open。

IN_MOVED_FROM:文件被移出被監控目錄,如mv。

IN_MOVED_TO:文件被移入被監控目錄,如mv、cp。

IN_CREATE:文件/文件夾被建立。

IN_DELETE:文件/文件夾被刪除,如rm。

IN_DELETE_SELF:自刪除,即一個可執行文件在執行時刪除本身。

IN_MOVE_SELF:自移動,即一個可執行文件在執行時移動本身。

IN_UNMOUNT:宿主文件系統被umount。

IN_CLOSE:文件被關閉,等同於(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。

IN_MOVE:文件被移動,等同於(IN_MOVED_FROM|IN_MOVED_TO)。

注意:上面所說的文件也包括目錄。

9 inotify-tools是什麼

inotify是一個API,須要經過開發應用程序進行調用。inotify-tools就是這樣的一個inotify軟件,它是一套組件,包括一個C庫和幾個命令行工具。

inotify是爲替代dnotify而設計的,它克服了dnotify的缺陷,提供了更好用的,更簡潔而強大的文件變化通知機制。

1)inotify不須要對被監視的目標打開文件描述符,若是被監視目標在可移動介質上,那麼在umount該介質上的文件系統後,被監視目標對應的watch將被自動刪除,而且會產生一個umount事件。

2)inotify既能夠監視文件,又能夠監視目錄。

3)inotify使用系統調用而非SIGIO信號來通知文件系統事件。

4)inotify使用文件描述符做爲接口,於是可使用一般的文件I/O操做select和poll來監視文件系統的變化。

10 安裝inotify-tools

兩種方式:源碼和rpm

注意:inotify-tools主要是經過inotifywait和inotifywatch,這兩個命令進行工做。而inotifywait命令,是生產環境中使用最多的命令。


10.1 源碼包安裝

下載地址:https://github.com/rvoicilas/inotify-tools/wiki

注意:不建議使用wget下載inotify-tools,由於網站緣由下載不成功,wget https://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

咱們能夠先經過瀏覽器下載本地,而後經過rz命令上傳到服務器。

要使用rz命令,咱們須要安裝lrzsz軟件,以下:

yum -y install lrzsz
tar -xf inotify-tools-3.14.tar.gz
./configure
make&&make install
ls /usr/local/bin/
# /usr/local/bin/inotifywait --help
/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or director 
若是報錯,找不到那個庫,這個庫其實是在/usr/local/lib下的
解決方法 
# echo /usr/local/lib/  > /etc/ld.so.conf.d/abc.conf
# ldconfig

10.2 rpm包安裝

配置yum源

咱們能夠去下面這個鏈接下載最新的yum源,以下:

http://dl.fedoraproject.org/pub/epel/6/x86_64/
下載epel-release-6-8.noarch.rpm軟件包並安裝,以下:
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 
rpm -ivh epel-release-6-8.noarch.rpm
yum –y install inotify-tools
rpm -ql inotify-tools
安裝完成後,會產生下面兩個命令
[root@localhost test]# ls /usr/bin/inotify*
/usr/bin/inotifywait  /usr/bin/inotifywatch

11.inotifywait使用詳解

inotifywait是一個監控等待事件,它主要用於監控文件或目錄的變化,而且能夠遞歸地監控整個目錄樹。

11.1 .inotifywait命令詳解

經過inotifywait -h來查看幫助信息

-m表示始終保持事件監聽狀態。

-r表示遞歸查詢目錄。

-q表示打印出監控事件。

-e經過此參數能夠指定要監控的事件。可監聽的事件,以下:

access:訪問,讀取文件。

modify:修改,文件內容被修改。

attrib:屬性,文件元數據被修改。

move:移動,對文件進行移動操做。以及重命名,對文件進行重命名。

create:建立,生成新文件

open:打開,對文件進行打開操做。

close:關閉,對文件進行關閉操做。

delete:刪除,文件被刪除。

–timefmt是指定時間的輸出格式,用於–format選項中的%T格式。

–format指定文件變化的詳細信息輸出格式。格式參數以下:

%w表示發生事件的目錄

%f表示發生事件的文件

%e表示發生的事件

%T使用由–timefmt定義的時間格式

%Xe事件以「X」分隔

11.2 inotifywait命令實例

咱們要監測/home目錄下全部文件及目錄的變化狀況,命令以下:

inotifywait -mrq –timefmt ‘%y/%m/%d/%H:%M’ –format ‘%T %w %f %e’ -e modify,delete,create,attrib,move,open,close,access /home/

這條命令是對/home目錄下全部文件及目錄的操做進行監控。

打開一臺機的兩個窗口,一邊建文件,一邊查看狀態看看是否會有變化

12. inotifywatch使用詳解

inotifywatch主要用於收集被監控的文件系通通計數據,包括每一個inotify事件發生多少次等信息。

12.1.inotifywatch命令詳解

inotifywatch -h 查看幫助信息

inotifywatch參數說明以下:

-h:輸出幫助信息。

-v:輸出詳細信息。

@:排除不須要監視的文件,能夠是相對路徑,也能夠是絕對路徑。

–-fromfile:從文件讀取須要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。

-z:輸出表格的行和列,即便元素爲空。

–-exclude:正則匹配須要排除的文件,大小寫敏感。

–-excludei:正則匹配須要排除的文件,忽略大小寫。

-r:監視一個目錄下的全部子目錄。

-t:設置超時時間。

-e:只監聽指定的事件。該事件與inotifywait監聽的事件類型同樣。

-a:以指定事件升序排列。

-d:以指定事件降序排列。

要求統計60秒內/home目錄下文件系統的事件,使用以下命令:

inotifywatch -v -e modify,delete,create,attrib,move,open,close,access -e modify -t 60 -r /home

打開一臺機的兩個窗口,一邊建文件,一邊查看狀態看看是否會有變化

13 inotify-tools與rsync集成

inotify-tools與rsync的集成主要是經過inotifywait命令與rsync命令集成來實現的,而且該集成主要是體現的rsync被同步端,而rsync同步端不須要太多配置。

注意:該集成的主要目的是把rsync被同步端須要備份的文件實時推送到rsync同步端上。

經過下面的實例來講明


14 應用實例

14.1 實現單向本地目錄實時同步

測試本機/test目錄裏一有(增,刪,改,屬性改變),就會同步到/test1目錄

--使用下面的腳原本作

#vim /tmp/1.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events
do
                rsync -a --delete /test/ /test1/
                echo "`date +'%F %T'`出現事件$events" >> /var/log/rsync.log 2>&1
done
# nohup sh /tmp/1.sh  &

--使用nohup掛起到後臺執行,終端關閉,這個進程也不會被關閉

--若是你但願實現開機自動啓動,能夠把此命令加到/etc/rc.local裏,或者寫成shell服務腳本,讓其支持chkconfig開機自動啓動

再而後對/test進行各類操做,驗證能夠實時同步到/test1

14.2 實現雙向本地目錄的實時同步

也有相關的軟件(好比unison)能夠專門來作雙向的實時同步

但咱們就能夠用inotify反向再作一次再寫一個腳本也同樣能夠簡單去實現,這裏再也不介紹

14.3 遠程實時同步

方法一:inotify+rsync+nfs

這個方法的思路是:

把遠程的目錄經過nfs服務掛載到本地,而後當作本地目錄同樣來使用,這樣就避免了rsync同步遠程時要輸密碼的問題

在rhel6.5測試爲:使用innotify監控遠程nfs掛載的目錄再同步到本地目錄,沒法成功;(在遠程機器操做,不會同步到本地。但在掛到本地的目錄操做,也會同步到本地。緣由:就是inotify只能監控本機上的目錄,不能監控另一臺機器上的目錄)

可是反過來,使用innotify監控本地目錄,再同步到遠程nfs掛載的目錄,能夠成功

 

實現把10.1.1.9上的/test目錄實時同步到192.168.19.248上的/test1目錄

    10.1.1.9 /test目錄        192.168.19.248  /test1目錄

在192.168.19.248上   

# vim /etc/exports
/test1  *(rw,no_root_squash)
# /etc/init.d/rpcbind restart
# /etc/init.d/nfs  restart
在10.1.1.9上
# mkdir /test1/
# mount -t nfs -o vers=3 192.168.19.248:/test1  /test1    --用nfs3版本掛載過來,那麼/test1目錄就是192.168.19.248上的遠程/test1目錄了
執行上面講的兩個本地目錄同步同樣的腳本,測試就能夠了
#vim /tmp/1.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events
do
                rsync -a --delete /test/ /test1/
                echo "`date +'%F %T'`出現事件$events" >> /var/log/rsync.log 2>&1
done
#nohup sh /tmp/1.sh  &

測試(過程省略)但注意在測試以前把前面例子運行的腳本進程經過ps找出來,並kill掉

--擴展,若是把nfs換成samba服務,經過mount -t cifs指令把遠程samba共享目錄掛載到本地,是否可行?

方法二:使用ssh等效性(ssh密鑰登陸)讓遠程機器鏈接不須要密碼,就很容易使用遠程監控或同步了

在10.1.1.9上產生一對密鑰

# ssh-keygen
# scp /root/.ssh/id_rsa.pub 192.168.19.248:/root/.ssh/authorized_keys
# ssh-add /root/.ssh/id_rsa
而後實現遠程實時同步,只須要在原來的腳本基礎上把遠程目錄前加上遠程IP就能夠了(由於作了ssh等效性,不須要密碼)
#!/bin/bash
/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events
do
                rsync -a --delete /test/ 192.168.19.248:/test1/
                echo "`date +'%F %T'`出現事件events" >> /var/log/rsync.log 2>&1
done

方法三:不作上面方法二的ssh密鑰,使用expect腳原本解決密碼問題

#!/bin/bash
/usr/local/bin/inotifywait -mrq  -e modify,delete,create,move /test |while read events
do
sed -i '/^192.168.19.248/d' /root/.ssh/known_hosts
expect <<EOF &> /dev/null
spawn rsync -a --delete /test/ 192.168.19.248:/test1/
expect "no)?"
send "yes\r"
expect "password:"
send "123456\r"
expect eof
EOF
        echo "`date +'%F %T'`出現事件events" &>> /var/log/rsync.log
done

測試:要先把上面執行的腳本進程都kill掉,再從新執行這個腳原本驗證

方法四,使用rsync的secrets file的方法而後寫腳本

例:     

        本地同步端 ----->遠程被同步端

        10.1.1.9    192.168.19.248

我要實現把本地同步端10.1.1.9上的/test/目錄裏的內容實時同步到遠程被同步端192.168.19.248的/test1/目錄

準備:

關閉iptables和selinux

實現過程

在遠程被同步端192.168.19.248上操做

# mkdir /test1/    --建立測試的被同步目錄
# vim /etc/rsyncd.conf
uid=root       
gid=root        --這裏指定使用root身份同步到192.168.19.248,不然默認使用nobody用戶(這樣你須要把/test1/目錄改爲757的權限,纔有權限寫)
[testsource]
path=/test1/
ignore errors
read only=no        --服務級別給寫權限
auth users=test        --驗證的用戶取名爲test(此用戶與系統用戶無關)
secrets file=/etc/rsyncd.secrets    --驗證用戶test的用戶名和密碼的存放文件,此文件須要同步端和被同步端都要有(這樣咱們就能夠用這種方式來進行驗證,而不須要遠程的ssh密碼驗證了)
hosts allow=10.1.1.9        --進一步增強安全,只容許10.1.1.9同步
# vim /etc/rsyncd.secrets    --建立這個密碼文件,用戶名要與上面的auth users指定的一致,密碼隨意(我這裏以321來測試)
test:321
# chmod 600 /etc/rsyncd.secrets    --爲了安全性,把權限改爲600,只讓root讀寫(不少其它軟件的密碼文件也會要求你改爲600權限)
#  yum install xinetd -y
# vim /etc/xinetd.d/rsync
      disable = no        -- disable 後面值由yes改成no
# /etc/init.d/xinetd restart    --重啓服務
# netstat -ntlup |grep :873    --驗證873端口是否啓動
tcp        0      0 :::873                      :::*                        LISTEN      50438/xinetd  
# chkconfig xinetd on    --設置開機自動啓動

在本地同步端10.1.1.9操做

先安裝inotify軟件,步驟參照上面過程,這裏省略

# mkdir /test/    --建立測試的同步目錄
# vim /etc/rsyncd.secrets    --也要建立這個密碼文件,裏面只寫密碼就能夠了。用戶咱們在後面的腳本里的命令裏指定
321
# chmod 600 /etc/rsyncd.secrets  --也改爲600的權限 
# vim /tmp/rsync.sh    --腳本及其內容(這裏強調一下,這裏是測試方便,因此才放到/tmp下,生產環境能夠放到/bin這種目錄下作成一個命令) 
#!/bin/bash
/usr/local/bin/inotifywait -mrq  -e modify,delete,create,attrib,move /test |while read events
do                
            rsync -a --delete  --password-file=/etc/rsyncd.secrets /test/ test@192.168.19.248::testsource
done 
# chmod 755 /tmp/rsync.sh   --給執行權限,方便執行 
# nohup sh /tmp/rsync.sh &   --後面掛起執行 
# vim /etc/rc.local        --加到rc.local裏讓其開頭自動啓動
#nohup sh /tmp/rsync.sh &

測試過程省略

相關文章
相關標籤/搜索