基于rsync+inotify實現數據實時同步傳輸

前言

與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,但隨著文件數量的增大和實時同步的要求,rsync已不能滿足需求,隨之rsync+inotify便應運而生。本文將講解rsync的基礎知識和如何基于rsync+inotify實現數據實時同步傳輸。

rsync相關介紹

rsync(remote sync)是一款快速增量備份工具(遠程同步),支持本地復制,或者與其他SSH(安全傳輸)、rsync主機同步。

特點

①可以鏡像保存整個目錄樹或文件系統

②較高的數據傳輸效率

③可以借助于ssh實現安全數據傳輸

④支持匿名傳輸

工作模式

①shell模式,也稱作本地模式

②遠程shell模式,可以利用ssh協議承載其遠程傳輸過程

③列表模式,僅列出源中的內容,-nv

④服務模式,此時rsync工作為守護進程,能接收客戶端的數據同步請求

命令選項

-n: 同步測試,不執行真正的同步過程;
-v: 詳細輸出模式
-q: 靜默模式
-c: checksum,開啟校驗功能
-r: 遞歸復制
-a: 歸檔,保留文件的原有屬性;
-p: 保留文件的權限;
-t: 保留文件的時間戳;
-l: 保留符號鏈接
-g: 保留屬組
-o: 保留屬主
-D:保留設備文件
-e ssh: 使用ssh作為傳輸承載;
-z: 壓縮后傳輸;
--progress: 顯示進度條
--stats: 顯示如何執行壓縮和傳輸
注意:rsync命令中,如果源路徑是目錄,且給復制路徑時末尾有/,則會復制目錄中的內容,而非目錄本身;如果末尾沒有/,則會同步目錄本身及目錄中的所有文件;目標路徑末尾是否有/無關緊要;
如:rsync -r /var/log/ /tmp #復制/var/log目錄下的所有文件,不包括log本身
    rsync -r /var/log  /tmp #復制/var/log整個目錄

rsync同步數據的時候,需要完整掃描文件,比對變化的文件,如果文件數量過于龐大,這樣掃描是非常耗時的,而且rsync雖然可以通過crontab實現定期同步,但是也達不到實時同步的要求,要想解決這一弊端,就需要inotify了

數據實時同步實現

inotify相關介紹

可用于定義監控指定的目錄下的所有文件,一旦有文件的元數據發生改變,就通知rsync進行數據同步,以此實現實時同步

部署過程

我們通過一個實例來看一下rsync+inotify是如何實現數據同步的

案例要求

web服務器1:172.16.10.100(主服務器)

web服務器2:172.16.10.212(輔服務器)

兩臺web服務器,要求在主服務器上更新數據,輔服務器要自動更新數據

rsync角色說明:因為inotify是監控在rsync的客戶端,而且是主動同步,所以在此應用場景中主服務器為rsync客戶端,輔服務器為rsync服務器端

rsync服務器端配置

[root@scholar ~]# yum install xinetd -y  #安裝守護進程,rsync系統自帶,如果沒有安裝即可
[root@scholar ~]# vim /etc/xinetd.d/rsync
         #修改此項
        disable = no #啟用rsync

[root@scholar ~]# vim /etc/rsyncd.conf #為rsync創建配置文件,默認沒有此文件

# Global Settings
uid = nobody                      #運行rsync用戶
gid = nobody                      #運行rsync組
use chroot = no                   #關閉chroot
max connections = 10              #最大并發連接數
strict modes = yes                #開啟嚴格模式
pid file = /var/run/rsyncd.pid    #pid文件位置
log file = /var/log/rsyncd.log    #日志文件位置

# Directory to be synced
[web]                             #文件共享名
path = /web                       #共享文件路徑
ignore errors = yes               #忽略錯誤
read only = no                    #不允許讀
write only = no                   #不允許寫
hosts allow = 172.16.0.0/16       #白名單
hosts deny = *                    #黑名單
list = false                      #不允許列出文件
uid = root                        #共享已root用戶運行,可覆蓋全局配置
gid = root                        #共享已root組運行,可覆蓋全局配置
auth users = scholar              #用戶認證
secrets file = /etc/rsync.passwd  #認證文件

[root@scholar ~]# vim /etc/rsync.passwd #創建認證文件
#格式:username:password,此文件不能允許其它用戶有訪問權限,且密碼不能超過8個字符
scholar:scholar

[root@scholar ~]# chmod 600 /etc/rsync.passwd #設置權限

啟動服務,設置開機自啟,查看監聽端口

1.jpg

rsync客戶端配置

創建認證文件,只需密碼即可

2.jpg

測試數據同步的方法

Access via rsync daemon:
   Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
   如:rsync --password-file=/etc/rsync.passwd scholar@172.16.10.212::web /web
       rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
   如:rsync --password-file=/etc/rsync.passwd rsync://scholar@172.16.10.212/web /web
   Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
   如:rsync --password-file=/etc/rsync.passwd /web scholar@172.16.10.212::web
         rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
   如:rsync --password-file=/etc/rsync.passwd /web rsync://scholar@172.16.10.212/web	

安裝inotify-tools

[root@scholar ~]# tar xf inotify-tools-3.14.tar.gz 
[root@scholar ~]# cd inotify-tools-3.14
[root@scholar inotify-tools-3.14]# ./configure
[root@scholar inotify-tools-3.14]# make && make install

創建rsync腳本

[root@scholar ~]# vim /usr/local/bin/rsyncd

#!/bin/bash
SRC=/web/
DEST=web
HOST=172.16.10.212
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e 
modify,delete,create,attrib $SRC | while read files;
do
        rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $SRC 
        scholar@$HOST::$DEST
done

#inotifywait參數詳解:
#-m,表示始終保持事件監聽狀態
#-r,表示遞歸查詢目錄
#-q,表示打印出監控事件
#-e,指定要監控的事件,包括modify、delete、create、attrib等
#--timefmt:指定時間的輸出格式
#--format:指定變化文件的詳細信息

設置開機自動運行

3.jpg

測試同步

我們在主服務器上增加一個站點,站點已做好我們直接復制進去

4.jpg

我們去輔服務器上看一下,數據有沒有同步過來

5.jpg

同步成功,至此基于rsync + inotify實現數據實時同步配置完成

The end 

好了,rsync + inotify就講到這里了,如果要實現多臺從服務器同步,多設幾個rsync服務器端就好了,相應的主服務器inotify的腳本也需要略加修改,過程并不麻煩,實驗過程中遇到問題可留言。以上僅為個人學習整理,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/3694

(0)
書生書生
上一篇 2015-04-27 21:29
下一篇 2015-04-27 21:32

相關推薦

  • 5.程序包管理與內核命令的使用

    1、  顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; ~]#  grep -E “^[[:space:]]+” //boot/grub/grub.conf root (hd0,0) kernel /vmlinuz-2.6.32-279.el…

    Linux干貨 2017-07-30
  • 也許你根本不會用百度搜索

    搜索引擎可以幫助使用者在Internet上找到特定的信息,但它們同時也會返回大量無關的信息。但是如果多使用一些技巧,你將發現搜索引擎會花盡可能少的時間找到你需要的確切信息。 1.簡單查詢 這個就是最簡單便捷的使用方式,其實也是我們大多數人平時使用百度或者其他搜索引擎的方式。比如你想查培訓學校,那么你的第一反應肯定就是在百度里輸入【挖掘機】【挖掘機學?!俊舅{翔…

    2015-03-02
  • 馬哥教育網絡班21期-第九周課程練習

    第九周作業 1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # declare -i nologin=0 declare -i other=0   &n…

    Linux干貨 2016-09-19
  • 文件查找命令find詳解

    文件的查找命令 find 用法 功能:實時查找工具,通過遍歷指定路徑完成文件查找 工作特點: ?  查找速度略慢?  精確查找?  實時查找?  可能只搜索用戶具備讀取和執行權限的目錄 語法:   find [OPTION]… [查找路徑] [查找條件] [處理動作] 查找路徑:指定具體目標路徑;默認為當前目錄查找條件…

    Linux干貨 2016-11-07
  • class-6 用戶組管理(二) 權限管理

                      一、用戶組管理  1、設置修改用戶密碼密碼      設置密碼     passwd [OPT…

    Linux干貨 2016-08-05
  • CentOS6刪除/etc/fstab和/boot后恢復

    CentOS6刪除/etc/fstab和/boot后恢復 背景: Linux CentOS系統和啟動相關的文件都在/boot目錄下,如果我們將/boot目錄下所有的文件都刪除,然后在恢復系統,那以后在遇到系統啟動問題時就都可以解決了。在這基礎上,在將/etc/fstab文件刪除,這樣更加大了修復的難度,不過這都是可以修復的,這里就將介紹如何修復。 實驗環境:…

    2017-09-01
欧美性久久久久