天天看點

rsync結合inotify實作實時同步

背景介紹

中小企業的web應用場景中,web伺服器可能是由2台伺服器組成,通過DNS的輪詢作為負載均衡,此時就需要對2台伺服器之間同步的實時性有較高的要求,上一篇文章所介紹的rsync+crontab就不能滿足此需求,本章就來介紹使用rsync+inotify完成伺服器之間的實時同步

<a href="http://s4.51cto.com/wyfs02/M02/89/05/wKiom1gE4E2TjIvKAABwalFgaPY949.png" target="_blank"></a>

實驗說明

作業系統:CentOS6.8,inotify要求核心版本必須為2.6.13以上

源伺服器:172.16.10.20/24

目标伺服器:172.16.10.10/24

實驗目的:将源伺服器上的/rsync目錄内的内容實時同步到目标伺服器/rsync目錄下

其他事項:為避免安全機制帶來的幹擾,源和目标伺服器都關閉Selinux和iptables

實驗步驟

一、安裝rsyncd服務

1、伺服器端操作

(1)安裝xinetd超級守護程序

yum -y install xinetd

(2)将rsync設定為開機啟動

chkconfig rsync on

(3)建立rsync配置檔案填

vim /etc/rsyncd.conf 并填寫下列内容:

# global setting

 log file = /var/log/rsyncd.log #設定log檔案位置

 pid file = /var/run/rsyncd.pid #設定pid檔案位置

 lock file = /var/run/rsyncd.lock #設定lock檔案位置

 uid = rsync #設定啟動時以哪個使用者來代替root運作rsync

 gid = rsync

 list = no #不允許列出名單

 chroot = no #不切換根目錄

 timeout = 300 #設定逾時時間

 ignore errors = yes #是否忽略錯誤

 max connections = 10 #最大連接配接數

# module setting

 [data] #設定子產品名稱

 path = /rsync #指定子產品路徑

 read only = no #是否可寫

 write only = no #是否可讀

 auth users = rsync_bak #建立允許連結該子產品的虛拟使用者

 secrets file = /etc/rsyncd.passwd  #賬戶密碼(rsync_bak)的存放檔案

 strict modes = yes #檢查secrets file檔案的權限是否滿足要求

 hosts allow = 172.16.10.20/32   #白名單

 hosts deny = *   #黑名單

(4)建立secrets file檔案,并修改其權限

vim /etc/rsyncd.passwd

<a href="http://s4.51cto.com/wyfs02/M02/89/02/wKioL1gE4E3yx_iRAAAFv9eVeM8621.png" target="_blank"></a>

chmod 600 /etc/rsyncdpasswd

(5)建立rsync系統使用者

useradd -s /sbin/nologin rsync

(6)建立需要同步的目錄并修改其屬主和屬組

mkdir /rsync

chown -R rsync:rsync /rsync

(7)啟動rsyncd服務,并檢視873端口是否正常偵聽

service xinetd start

netstat -ntl

2、用戶端操作

(1)檢視/etc/rsyncd.passwd是否收到,權限是否為600,再将檔案内rsync_bak使用者名删除掉,隻保留rsync_bak賬戶的密碼

<a href="http://s5.51cto.com/wyfs02/M00/89/05/wKiom1gE4E7QITHrAAADL24X0n0369.png" target="_blank"></a>

(2)再檢測rsyncd服務是否可以正常傳輸,至此rsyncd服務就搭建完成

<a href="http://s5.51cto.com/wyfs02/M00/89/02/wKioL1gE4E6DMabFAAAxLnTlk7w634.png" target="_blank"></a>

二、安裝inotify-tools

1、inotify-tools工作機制

inotify更像一個監控程序,它會監視指定的目錄或檔案,并篩選出資訊發生變化的内容,根據這個特性我們可以在rsync用戶端安裝inotify-tools并将其篩選出來的目錄或檔案作為輸入再通過rsync用戶端推送到rsync伺服器上以實作兩個伺服器之間的實時同步

2、安裝inotify-tools的2個先決條件

(1)安裝inotify-tools的機器核心版本必須是2.6.13及以上

(2)檢視機器核心是否支援inotify

<a href="http://s5.51cto.com/wyfs02/M00/89/05/wKiom1gE4E_RUfWqAAAmaSzTj4M050.png" target="_blank"></a>

3、安裝inotify-tools操作步驟

(1)從 http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 下載下傳源碼并放到/usr/local/src目錄下

(2)解壓源碼包後進入目錄

tar -xf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

(3) ./configure --prefix=/usr/local/inotify #配置configure參數

(4)make &amp;&amp; makeinstall #編譯安裝

(5)echo "PATH=/usr/local/inotify/bin:$PATH" &gt;&gt;/etc/profile.d/inotify.sh #添加PATH路徑

(6)source /etc/profile.d/inotify.sh #重讀下該檔案

(7)ln -sv /usr/local/inotify/include/ /usr/include/inotify #頭檔案輸出

(8)echo "/usr/local/inotify/lib" &gt;&gt; /etc/ld.so.conf.d/inotify.conf #庫檔案輸出

(9)使用ldconfig -v 檢視inotify庫是否已被加載

<a href="http://s5.51cto.com/wyfs02/M01/89/05/wKiom1gE4E_Q1Kf8AAAUk3R2FdA118.png" target="_blank"></a>

(10)使用vim /etc/man.config,将inotify的man文檔輸出

<a href="http://s5.51cto.com/wyfs02/M01/89/02/wKioL1gE4E_Qt6uRAAAnt65YQJM089.png" target="_blank"></a>

三、測試inotify的監視功能

1、通過tree可以看到inotify的核心就隻有2條指令,可以通過--help檢視

<a href="http://s5.51cto.com/wyfs02/M02/89/05/wKiom1gE4E_zdvevAAAfP0mYpF4927.png" target="_blank"></a>

2、mkdir /rsync #手動建立一個/rsync目錄用于inotify的監視

3、inotifywait -mqr --format '%w%f' -e create /rsync 讓inotify監視/rsync目錄的變化

-q quite隻輸出變化資訊

-m monitor監視

-r recursive遞歸

--format 指定格式類型

-e event真實的事件,後面接create,delete等,多個事件間用 , 分隔

4、新開一個終端,在/rsync下建立檔案或目錄看是否能夠被監視到

<a href="http://s4.51cto.com/wyfs02/M02/89/02/wKioL1gE4FDgZ0rSAAAVpNgXcmo238.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M01/89/05/wKiom1gE4cPhnelhAAAVpNgXcmo533.png" target="_blank"></a>

四、inotify結合rsync實作實時同步

1、建立存放腳本的目錄及腳本檔案

mkdir /etc/usr/local/inotify/script

vim /etc/usr/local/inotify/script/rsync.sh

2、填寫腳本内容

#!/bin/bash

rsyncSrc=/rsync

rsyncCommand=/usr/local/inotify/bin/inotifywait

$rsyncCommand -mrq --format '%w%f' -e close_write,delete,create $rsyncSrc \

| while read file;do

   cd $rsyncSrc &amp;&amp; rsync -az --delete --password-file=/etc/rsyncd.passwd ./ \

[email protected]::data &gt; /dev/null 2&gt;&amp;1

 done

或者下圖腳本也可以

<a href="http://s4.51cto.com/wyfs02/M00/89/06/wKioL1gFtLqRI67vAAA4IZBRnQ4880.png" target="_blank"></a>

注意:腳本中的./代表同步/rsync目錄中的内容而不包括/rsync目錄本身,和圖檔腳本紅框部分意義一樣,以目錄方式執行效率更高

3、給腳本執行權限

chmod +x /usr/local/inotify/script/rsync.sh

4、設定腳本開機自動啟動

vim /etc/rc.d/rc.local

sh /usr/local/inotify/script/rsync.sh &amp;

:wq

本文轉自 qiao645 51CTO部落格,原文連結:http://blog.51cto.com/arkling/1862807