Linux平臺上文件同步——rsync+inotify之定時同步

1 前言

1.1 概述

本文介紹使用rsync和 inotify-tools,實現linux 上的本地定時同步和遠程定時同步的方法。

1.2 實驗環境

服務器兩臺
操作系統: CentOS-7.4

軟件:
rsync.x86_64 3.0.9-18.el7
inotify-tools.x86_64 3.14-9.el7
xinetd.x86_64 2:2.3.15-13.el7

本地同步環境信息:
源目錄: /root/data/
目的目錄:/root/backup/

遠程同步環境信息:
源主機(即原始文件所在的服務器)的ip地址:10.40.239.234
目標主機(存放備份文件的服務器)的ip地址:10.40.239.236
源目錄: /root/data/
目的目錄:/root/backup/

1.3 軟件介紹

1.3.1 rsync

rsync是linux系統下的數據鏡像備份工具。使用快速增量備份工具Remote Sync可以遠程同步,支持本地複製,或者與其他SSH、rsync主機同步。
它有如下特性:

  1. 可以鏡像保存整個目錄樹和文件系統。
  2. 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等。
  3. 無須特殊權限即可安裝。
  4. 快速:第一次同步時 rsync 會複製全部內容,但在下一次只傳輸修改過的文件。rsync 在傳輸數據的過程中可以實行壓縮及解壓縮操作,因此可以使用更少的帶寬。
  5. 安全:可以使用scp、ssh等方式來傳輸文件,當然也可以通過直接的socket連接。
    支持匿名傳輸,以方便進行網站鏡像。

1.3.2 inotify-tools

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

2 定時同步

定時同步可由rsync和操作定時任務實現。

2.1 本地定時同步

本地定時同步的操作如下:

  1. 安裝 rsync。執行命令:

yum install rsync

  1. 配置 rsync 參數文件 /etc/rsyncd。執行命令:

vi /etc/rsyncd

輸入如下內容:

\# /etc/rsyncd: configuration file for rsync daemon mode
\# See rsyncd.conf man page for more options.
\# configuration example:

uid = nobody
gid = nobody
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
read only = false
list = false 
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
  1. 重啓 rsync:

systemctl restart rsync

  1. 創建同步的定時任務,這裏我們設置每5分鐘同步一次:

crontab –e “*/5 * * * * rsync -avz --delete /root/data/ /root/backup/”

這裏,
rsync -avz --delete /root/data/ /root/backup/
表示從將 /root/data/ 的內容同步到 /root/backup/ 中。其中,
-a 表示歸檔模式,表示以遞歸方式傳輸文件,並保持所有屬性;
-v 表示打印詳細信息;
-z 表示在傳輸過程中壓縮。

這樣就實現了本地計算機上的文件定時同步。

2.2遠程定時同步

基於rsync 的遠程同步有兩種模式,一種是使用遠程shell程序(如rsh、ssh)來實現文件同步的方式,一種是使用後臺進程(daemon)的模式。
兩臺服務器的交互方式有兩種。一種是源主機主動將文件的差異部分發送給目標主機;另一種是目標主機向源主機請求文件。

2.2.1 shell模式

遠程shell方式默認是調用ssh進行文件同步。

2.2.1.1 源主機主動發送文件

  1. 在目標主機和服務器端都安裝rsync:

yum install rsyncd

  1. 在源主機配置 rsync 參數文件
    # /etc/rsyncd: configuration file for rsync daemon mode
    # See rsyncd.conf man page for more options.
    # configuration example:

    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    uid = nobody
    gid = nobody
    use chroot = no
    max connections = 200
    timeout = 300
    port = 873
    read only = false
    list = false
    dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

  2. 在源主機上重啓 rsync:

systemctl restart rsync

  1. 如果要求源主機主動將文件的差異部分發送給目標主機, 那麼源主機需要通過免密認證,連接到目標主機。

    在源主機生成公鑰和私鑰,命令如下:

    ssh-keygen -t rsa

    輸入命令後只需要一直點擊enter鍵即可。成功後會出現如圖下所示的界面。
    在這裏插入圖片描述

    如圖,私鑰的位置在/root/.ssh/id_rsa,公鑰的位置在/root/.ssh/id_rsa.pub。

  2. 打開公鑰文件/root/.ssh/id_rsa.pub,複製它的內容。

  3. 在目標主機中,編輯文件 /root/.ssh/authorized_keys,將源主機公鑰的內容粘貼到文件末尾。

  4. 在目標主機重啓ssh:

systemctl restart sshd

  1. 在源主機驗證能否免密登錄

ssh [email protected]

如果出現如下的提示信息,表示免密登錄成功:

在這裏插入圖片描述
9. 完成免密認證的配置後,在源主機創建定時任務,它是5分鐘同步一次的:

crontab –e “*/5 * * * * rsync -avz --delete /root/data/ [email protected]:/root/backup/”

2.2.1.2 目標主機請求文件

  1. 在目標主機和服務器端都安裝rsync:

yum install rsyncd

  1. 在目標主機配置 rsync 參數文件
    # /etc/rsyncd: configuration file for rsync daemon mode
    # See rsyncd.conf man page for more options.
    # configuration example:

    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    uid = nobody
    gid = nobody
    use chroot = no
    max connections = 200
    timeout = 300
    port = 873
    read only = false
    list = false
    dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

  2. 在目標主機上重啓 rsync:

systemctl restart rsync

  1. 目標主機需要通過免密認證連接到源主機。在目標主機生成公鑰和私鑰,命令如下:

ssh-keygen -t rsa

  1. 打開公鑰文件/root/.ssh/id_rsa.pub,複製它的內容

  2. 在源主機中,編輯文件 /root/.ssh/authorized_keys,將目標主機的公鑰的內容粘貼到文件末尾。

  3. 在源主機重啓ssh:

systemctl restart sshd

  1. 完成免密認證的配置後,在目標主機創建定時任務,它是5分鐘同步一次的

crontab –e “*/5 * * * * rsync -avz --delete [email protected]:/root/data/ /root/backup/”

2.2.2 後臺進程模式

CentOS中是以xinetd來管理Rsync服務的,因此我們需要安裝 rsync 和 xinetd。

2.2.2.1 目標主機請求文件

  1. 在源主機和目標主機都安裝 rsync:
    yum install rsync
    並在源主機中安裝 xinetd:
    yum install xinetd

  2. 安裝rsync 和xinetd後,在源主機配置 rsync 參數文件。將相關參數放在一個模塊中。下面的例子中,模塊名是backup。

    # /etc/rsyncd: configuration file for rsync daemon mode
    # See rsyncd.conf man page for more options.
    # configuration example:

    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log

    [backup] #模塊名
    path = /root/data/
    comment = backup
    uid = nobody
    gid = nobody
    use chroot = no
    max connections = 200
    timeout = 300
    port = 873
    read only = false
    list = false
    dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
    hosts allow = 10.40.239.236/24
    secrets file = /etc/rsync.pass
    auth users = rsync_user

這裏的auth users不需要是操作系統用戶。
3. 在源主機創建密碼文件 /etc/rsync.pass,寫入源主機用戶的用戶名(即rsyncd.conf中的auth users的一個值)和密碼,格式是用戶:密碼。這裏我們創建的內容是:

rsync_user:!QAZ2wsx

  1. 設置此密碼文件的權限,即rsync.pass認證文件是600權限。

chmod 600 /etc/rsync.pass

  1. 在源主機上重啓rsync

systemctl restart rsyncd

  1. 在源主機上新建或編輯文件 /etc/xinetd.d/rsync,配置rsync相關參數:

    # default: off
    # description: The rsync server is a good addition to an ftp server, as it
    # allows crc checksumming etc.
    service rsync
    {
    disable = no #由默認的yes改爲no,設置開機啓動rsync
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
    }

  2. 重新啓動xinetd:
    systemctl restart xinetd

  3. 在目標主機上,創建一個密碼文件,內容只有密碼,和源主機的密碼文件中的密碼相同。這裏,我設置的密碼文件的位置是 /etc/rsync.pass,內容是 !QAZ2wsx。並修改其權限:
    chmod 600 /etc/rsync.pass

  4. 在目標主機上創建定時任務,它每5分鐘從源主機同步一次文件:

crontab –e “*/5 * * * * rsync –avz --delete [email protected]::backup /root/backup/ --password-file=/etc/rsync.pass”

2.2.2.2 源主機主動發送文件

  1. 在源主機和目標主機都安裝 rsync:
    yum install rsync
    並在目標主機中安裝 xinetd:
    yum install xinetd

  2. 安裝rsync 和xinetd後,在目標主機配置 rsync 參數文件。將相關參數放在一個模塊中。下面的例子中,模塊名是backup。

    # /etc/rsyncd: configuration file for rsync daemon mode
    # See rsyncd.conf man page for more options.
    # configuration example:

    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log

    [backup]
    path = /root/backup/
    comment = backup
    uid = root
    gid = root
    use chroot = no
    max connections = 200
    timeout = 300
    port = 873
    read only = false
    list = false
    dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
    hosts allow = 10.40.239.234/24
    secrets file = /etc/rsync.pass
    auth users = rsync_user

注意:這種方法需要在 /etc/rsyncd.conf 中 將 uid,gid配置爲目標主機中備份目錄的所屬用戶和用戶組,不能配置爲nobody和其他用戶。

  1. 在目標主機創建密碼文件/etc/rsync.pass
    寫入源主機用戶的用戶名和密碼,格式是用戶:密碼。這裏,它的內容是:

rsync_user:!QAZ2wsx

  1. 設置rsync.pass認證文件的權限爲600!

chmod 600 /etc/rsync.pass

  1. 在目標主機上重啓rsync

systemctl restart rsyncd

  1. 在目標主機新建或編輯 /etc/xinetd.d/rsync,配置rsync相關參數:
    # default: off
    # description: The rsync server is a good addition to an ftp server, as it
    # allows crc checksumming etc.
    service rsync
    {
    disable = no #由默認的yes改爲no,設置開機啓動rsync
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
    }

  2. 在目標主機上重新啓動xinetd:

systemctl restart xinetd

  1. 在源主機上,創建一個密碼文件,內容只有密碼,和源主機的密碼文件中的密碼相同。這裏,我設置的密碼文件的位置是 /etc/rsync.pass,內容是 !QAZ2wsx。並修改其權限,這是必要的:

chmod 600 /etc/rsync.pass

  1. 在目標主機和源主機關閉防火牆和selinux,這是必要的。

systemctl stop firewalld
setenforce 0

  1. 在目標主機上創建定時任務,它每5分鐘向目標主機發送一次文件:

crontab –e “*/5 * * * * rsync –avz --delete –r /root/data/ [email protected]::backup --password-file= /etc/rsync.pass”

參考

[1] rsync. rsyncd.conf.2018-01-28
[2]百度百科. rsync
[3] 十五十六. rsync搭建部署和配置文件詳解. 2018-05-29
[4] wc1695040842. rsync+inotify實時同步文件. 2019-06-03
[5] 王曉冬. Rsync故障排查整理. 2017-03-14

附:Rsyncd.conf 配置參數

模塊參數
主要是定義服務器哪個目錄要被同步。其格式必須爲“[module]”形式,這個名字就是在rsync 客戶端看到的名字,其實有點象Samba服務器提供的共享名。而服務器真正同步的數據是通過 path 來指定的。我們可以根據自己的需要,來指定多個模塊,模塊中可以定義以下參數:
comment
給模塊指定一個描述,該描述連同模塊名在客戶連接得到模塊列表時顯示給客戶。默認沒有描述定義。

path
指定該模塊的供備份的目錄樹路徑,該參數是必須指定的。

use chroot
如果" use chroot" 指定爲true,那麼rsync在傳輸文件以前首先chroot到path參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要以roots權限,並且不能備份指向外部的符號連接所指向的目錄文件。默認情況下chroot值爲true。

uid
該選項指定當該模塊傳輸文件時,守護進程應該具有的uid,配合gid選項使用可以確定哪些可以訪問怎麼樣的文件權限,默認值是" nobody" 。

gid
該選項指定當該模塊傳輸文件時,守護進程應該具有的gid。默認值爲" nobody" 。

max connections
指定該模塊的最大併發連接數量以保護服務器,超過限制的連接請求將被告知隨後再試。默認值是0,也就是沒有限制。

list
該選項設定當客戶請求可以使用的模塊列表時,該模塊是否應該被列出。如果設置該選項爲false,可以創建隱藏的模塊。默認值是true。

read only
該選項設定是否允許客戶上載文件。如果爲true那麼任何上載請求都會失敗,如果爲false並且服務器目錄讀寫權限允許那麼上載是允許的。默認值爲true。

exclude
用來指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到exclude列表中。這等同於在客戶端命令中使用–exclude來指定模式,一個模塊只能指定一個exclude選項。但是需要注意的一點是該選項有一定的安全性問題,客戶很有可能繞過exclude列表,如果希望確保特定的文件不能被訪問,那就最好結合uid/gid選項一起使用。

exclude from
指定一個包含exclude模式的定義的文件名,服務器從該文件中讀取exclude列表定義。

include
用來指定不排除符合要求的文件或目錄。這等同於在客戶端命令中使用–include來指定模式,結合include和exclude可以定義複雜的exclude/include規則。

include from
指定一個包含include模式的定義的文件名,服務器從該文件中讀取include列表定義。

auth users
該選項指定由空格或逗號分隔的用戶名列表,只有這些用戶才允許連接該模塊。這裏的用戶和系統用戶沒有任何關係。如果" auth users" 被設置,那麼客戶端發出對該模塊的連接請求以後會被rsync請求challenged進行驗證身份這裏使用的challenge/response認證協議。用戶的名和密碼以明文方式存放在" secrets file" 選項指定的文件中。默認情況下無需密碼就可以連接模塊(也就是匿名方式)。

secrets file
該選項指定一個包含定義用戶名:密碼對的文件。只有在" auth users" 被定義時,該文件纔有作用。文件每行包含一個username:passwd對。一般來說密碼最好不要超過8個字符。沒有默認的secures file名,需要限式指定一個(例如:/etc/rsyncd.passwd)。注意:該文件的權限一定要是600,否則客戶端將不能連接服務器。

strict modes
該選項指定是否監測密碼文件的權限,如果該選項值爲true那麼密碼文件只能被rsync服務器運行身份的用戶訪問,其他任何用戶不可以訪問該文件。默認值爲true。

hosts allow
該選項指定哪些IP的客戶允許連接該模塊。客戶模式定義可以是以下形式:
單個IP地址,例如:192.167.0.1

整個網段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多個IP或網段需要用空格隔開,“*”則表示所有,默認是允許所有主機連接。

hosts deny
指定不允許連接rsync服務器的機器,可以使用hosts allow的定義方式來進行定義。默認是沒有hosts deny定義。

ignore errors
指定rsyncd在判斷是否運行傳輸時的刪除操作時忽略server上的IO錯誤,一般來說rsync在出現IO錯誤時將將跳過–delete操作,以防止因爲暫時的資源不足或其它IO錯誤導致的嚴重問題。

ignore nonreadable
指定rysnc服務器完全忽略那些用戶沒有訪問權限的文件。這對於在需要備份的目錄中有些文件是不應該被備份者得到的情況是有意義的。

lock file
指定支持max connections參數的鎖文件,默認值是/var/run/rsyncd.lock。

transfer logging
使rsync服務器使用ftp格式的文件來記錄下載和上載操作在自己單獨的日誌中。

log format
通過該選項用戶在使用transfer logging可以自己定製日誌文件的字段。其格式是一個包含格式定義符的字符串,可以使用的格式定義符如下所示:
%h 遠程主機名
%a 遠程IP地址
%l 文件長度字符數
%p 該次rsync會話的進程id
%o 操作類型:" send" 或" recv"
%f 文件名
%P 模塊路徑
%m 模塊名
%t 當前時間
%u 認證的用戶名(匿名時是null)
%b 實際傳輸的字節數
%c 當發送文件時,該字段記錄該文件的校驗碼
默認log格式爲:" %o %h [%a] %m (%u) %f %l" ,一般來說,在每行的頭上會添加" %t [%p] " 。在源代碼中同時發佈有一個叫rsyncstats的perl腳本程序來統計這種格式的日誌文件。

timeout
通過該選項可以覆蓋客戶指定的IP超時時間。通過該選項可以確保rsync服務器不會永遠等待一個崩潰的客戶端。超時單位爲秒鐘,0表示沒有超時定義,這也是默認值。對於匿名rsync服務器來說,一個理想的數字是600。

refuse options
通過該選項可以定義一些不允許客戶對該模塊使用的命令參數列表。這裏必須使用命令全名,而不能是簡稱。但發生拒絕某個命令的情況時服務器將報告錯誤信息然後退出。如果要防止使用壓縮,應該是:" dont compress = *" 。

dont compress
用來指定那些不進行壓縮處理再傳輸的文件,默認值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章