2-3-2 rsync+inotify備份同步數據

RSYNC = Remote Sync 遠程同步 高效,必定要結合shell html

官網:https://rsync.samba.org ios

Author: Andrew Tridgell, Wayne Davison, and others web

        Andrew Tridgell是Samba項目的領導者和主要開發人員,同時還在參與開發rsync\Linux Kernel. shell

與SCP的比較:scp=沒法備份大量數據,相似windows的複製 vim

     rsync=邊複製 ,邊統計,邊比較 windows

Rsync特性和優勢 後端

能夠鏡像保存整個目錄樹和文件系統。 安全

能夠很容易作到保持原來文件的權限、時間、軟硬連接等等。 bash

無須特殊權限便可安裝。 服務器

快速:第一次同步時 rsync 會複製所有內容,但在下一次只傳輸修改過的文件。

壓縮傳輸:rsync 在傳輸數據的過程當中能夠實行壓縮及解壓縮操做,所以可使用更少的帶寬。

安全:可使用scp、ssh等方式來傳輸文件,固然也能夠經過直接的socket鏈接。

支持匿名傳輸,以方便進行網站鏡象。

選擇性保持:符號鏈接,硬連接,文件屬性,權限,時間等

常見備份分類

完整備份,差別備份,增量備份

完整備份:每次備份都是從備份源將全部的文件或目錄備份到目的地

差量備份:備份上次徹底備份之後有變化的數據(他針對的上次的徹底備份,他備份過程當中不清除存檔屬性)

增量備份:備份上次備份之後有變化的數據.(他纔不論是那種類型的備份,有變化的數據就備份,他會清除存檔屬性)

運行模式和端口

採用C/S模式(客戶端/服務器模式)[ 就是一個點到點的傳輸,直接使用rsync命令 ]

端口873

發起端和備份源

四個名詞的解釋:

發起端:負責發起rsync同步操做的客戶機叫作發起端,通知服務器我要備份你的數據

備份源:負責相應來自客戶機rsync同步操做的服務器腳在備份源,須要備份的服務器

服務端:運行rsyncd服務,通常來講,須要備份的服務器

客戶端:存放備份數據

數據同步方式

推push:一臺主機負責把數據傳送給其餘主機,服務器開銷很大,比較適合後端服務器少的狀況

拉pull:全部主機定時去找一主機拉數據,可能就會致使數據緩慢

推:目的主機配置爲rsync服務器,源主機週期性的使用rsync命令把要同步的目錄推過去(須要備份的機器是客戶端,存儲備份的機器是服務端)

拉:源主機配置爲rsync服務器,目的主機週期性的使用rsync命令把要同步的目錄拉過來(須要備份的機器是服務端,存儲備份的機器是客戶端)

兩種方案,rsync都有對應的命令來實現

wps59F2.tmp

Xinetd管理Rsync工做原理

wps59F3.tmp

使用rsync來同步是先經過xinetd監聽873號端口,若是rsync進來的是873號端口,那麼xinetd就會通知它所管轄的rsync服務來作迴應,接下來就是rsync倆服務於之間的通信.

Rsync服務安裝啓動:

--- Rsync服務依賴Xinetd,是使用超級服務來管理的

rpm -ivh /mnt/Packages/xinetd-2.3.14-40.el6.x86_64.rpm

rpm -ivh /mnt/Packages/rsync-3.0.6-12.el6.x86_64.rpm

cat /etc/xinetd.d/rsync

# ---------- Start of Configure File (/etc/xinetd.d/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,即啓用

        flags           = IPv6

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/bin/rsync

        server_args     = --daemon

        log_on_failure  += USERID

} # ----------  Configure File End  ----------

/etc/init.d/xinetd restart

netstat -anltpu | grep 873

Rsync命令

       rsync命令和scp命令很類似

-a, --archive archive mode 權限保存模式,至關於 -rlptgoD 參數,存檔,遞歸,保持屬性等

-r, --recursive 複製全部下面的資料,遞歸處理

-p, --perms 保留檔案權限 ,文件原有屬性

-t, --times 保留時間點,文件原有時間

-g, --group 保留原有屬組

-o, --owner 保留檔案全部者(root only)

-D, --devices 保留device資訊(root only)

-l, --links 複製全部的鏈接 ,拷貝鏈接文件

-z, --compress 壓縮模式, 當資料在傳送到目的端進行檔案壓縮.

-H, --hard-links 保留硬連接文件

-A, --acls 保留ACL屬性文件,須要配合--perms

-P,-P參數和 --partial --progress 相同.只是爲了把參數簡單化,表示傳進度

--version, 輸出rsync版本

-v , --verbose 複雜的輸出信息

-u, --update 僅僅進行更新,也就是跳過已經存在的目標位置,而且文件時間要晚於要備份的文件,不覆蓋新的文件

--port=PORT, 定義rsyncd(daemon)要運行的port(預設爲tcp 873)

--delete, 刪除那些目標位置有的文件而備份源沒有的文件

--password-file=FILE ,從 FILE 中獲得密碼

--bwlimit=KBPS, 限制 I/O 帶寬

--filter 「-filename」,須要過濾的文件

--exclude=filname,須要過濾的文件

--progress,顯示備份過程

經常使用的 –avz

實戰:使用rsync備份數據

對XiaoGan64網站根目錄的/var/www/html目錄備份到xiaogan63的/www-back

一. 創建測試用戶

useradd get1 #測試用戶,get1用於下載

useradd put1 #測試用戶,put1用戶上傳

echo get1:123456 | chpasswd #修改用戶get1密碼

echo put1:123456 | chpasswd #修改用戶put1密碼

二. 對目錄賦予ACL權限

# put1用戶能夠對目錄擁有讀寫權限,命令以下:

setfacl -R -m user:put1:rwx /var/www/html/

# 設置默認狀況下,put1對,命令以下:

setfacl -R -m default:user:put1:rwx /var/www/html/

目錄/var/www/html下的全部文件擁有讀寫權限

設置get1的權限

setfacl -R -m user:get1:rwx /var/www/html/

setfacl -R -m default:get1:rwx /var/www/html/

getfacl  /var/www/html

三. 建立測試數據

# boot目錄下的全部數據做爲測試數據

cp -r /boot/* /var/www/html/

# 備份目錄到本地目錄

rsync -avz --delete get1@192.168.171.63:/var/www/html/ /www-back/

              ……

rsync: send_files failed to open "/var/www/html/initramfs-2.6.32-431.el6.x86_64.img": Permission denied (13)

……

rsync: send_files failed to open "/var/www/html/initrd-2.6.32-431.el6.x86_64kdump.img": Permission denied (13)

……

rsync: send_files failed to open "/var/www/html/grub/grub.conf": Permission denied (13)

#幾行報錯,排錯

同步數據出錯排查

getfacl /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

getfacl: Removing leading '/' from absolute path names

# file: var/www/html/initramfs-2.6.32-431.el6.x86_64.img

# owner: root

# group: root

user::rw-

user:get1:rwx          #effective:---

# 雖然在前面看到是rwx,可是後面備註上說出有效權限是---

user:put1:rwx          #effective:---

group::r-x                 #effective:---

mask::---

other::---

# ll 查看權限,發現除開屬主以外,其餘人沒有任何權限

ll /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

# 加上權限

chmod 744 /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

getfacl /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

getfacl: Removing leading '/' from absolute path names

# file: var/www/html/initramfs-2.6.32-431.el6.x86_64.img

# owner: root

# group: root

user::rwx

user:get1:rwx          #effective:r--                有效權限可讀了

user:put1:rwx          #effective:r--

group::r-x                 #effective:r--

mask::r--

other::r--

同理方法修改

/var/www/html/initrd-2.6.32-431.el6.x86_64kdump.img

/var/www/html/grub/grub.conf

再次客戶端測試

rm -rf /www-back/*

rsync -azP --delete get1@192.168.1.63:/var/www/html/ /www-back/

rsyncd.conf配置文件

//文件不存在,須要本身建立

配置文件分爲兩部分:全局參數,模塊參數

全局參數:全局參數全局生效,局部參數局部生效(衝突時,根據位置判斷)

模塊參數:定義須要經過rsync輸出的目錄 定義的參數

常見的全局參數:

port   

# 指定後臺程序使用的端口號,默認爲873。

uid    

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

gid    

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

max connections

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

lock file

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

motd file

# " motd file"參數用來指定一個消息文件,當客戶鏈接服務器時該文件的內容顯示給客戶,默認是沒有motd文件的。

log file

# " log file"指定rsync的日誌文件,而不將日誌發送給syslog。

pid file

# 指定rsync的pid文件,一般指定爲「/var/run/rsyncd.pid」,存放進程ID的文件位置。

hosts allow = < 單個IP地址 網絡地址 >

# 容許訪問的客戶機地址

常見的模塊參數:

主要是定義服務器哪一個要被同步輸出,其格式必須爲「[ 共享模塊名 ]」 形式,這個名字就是在 rsync 客戶端看到的名字,其實很像 Samba 服務器提供的共享名。而服務器真正同步的數據是經過 path 來指定的。

comment

# 給模塊指定一個描述,該描述連同模塊名在客戶鏈接獲得模塊列表時顯示給客戶。默認沒有描述定義。

path

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

read only

# yes爲只容許下載,no爲能夠下載和上傳文件到服務器

exclude

# 用來指定多個由空格隔開的多個文件或目錄(相對路徑),將其添加到exclude列表中。這等同於在客戶端命令中使用--exclude或--filter來指定某些文件或目錄不下載或上傳(既不可訪問)

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名,注意:該文件的權限必定要是600,不然客戶端將不能鏈接服務器。

hosts allow

# 指定哪些IP的客戶容許鏈接該模塊。定義能夠是如下形式:

單個IP地址,例如:192.167.0.1,多個IP或網段須要用空格隔開

整個網段,例如:192.168.0.0/24,也能夠是192.168.0.0/255.255.255.0

    「*」則表示全部,默認是容許全部主機鏈接。

hosts deny

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

list

# 該選項設定當客戶請求可使用的模塊列表時,該模塊是否應該被列出。若是設置該選項爲false,能夠建立隱藏的模塊。默認值是true。

timeout

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

實戰:非系統用戶備份數據

使用系統配置文件/etc/rsyncd.conf來備份數據,建立備份帳戶,最後把rsync以deamon方式運行

一. 用配置文件定義目錄輸出

#文件不存在,須要本身建立

vim /etc/rsyncd.conf

# ---------- Start of Configure File (/etc/rsyncd.conf) ----------

uid = nobody     #運行進程的身份

gid = nobody      #運行進程的組

address =192.168.171.63  #監聽IP

port =873              #監聽端口

hosts allow =192.168.171.64     #容許同步客戶端的IP地址

# 能夠是網段,或者用*表示全部 192.168.1.0/24或192.168.1.0/255.255.255.0

use chroot = yes   #是否囚牢

# 鎖定家目錄,rsync被黑以後,黑客沒法再rsync運行的家目錄以外建立文件,選項設置爲yes

max connections =5 #最大鏈接數

pid file =/var/run/rsyncd.pid   #進程PID,自動生成

lock file =/var/run/rsync.lock    #指max connectios參數的鎖文件

log file =/var/log/rsyncd.log     #日誌文件位置

motd file =/etc/rsyncd.motd       #客戶端登錄以後彈出的消息,須要建立

[wwwroot]   #共享模塊名稱

path =/var/www/html             #路徑

comment = used for web-data root    #描述

read only = yes                     #只讀方式(只能夠下載)

list = yes                          #是否容許查看模塊信息

auth users = rsyncuser             #備份的用戶,和系統用戶無關

secrets file =/etc/rsync.passwd  

#存放用戶的密碼文件,格式是 用戶名:密碼

# ---------- End of File ----------

二. 建立提示文件和用戶密碼

echo "Welcome to Backup Server" > /etc/rsyncd.motd

vim /etc/rsync.passwd

rsyncuser:password123

目錄權限必須是700或者600,不然的話身份驗證會失效

chmod 600 /etc/rsync.passwd

三. 啓動服務測試

vim /etc/xinetd.d/rsync

  disable = no   #將原來的yes改成no(部分版本多是no,則不用改)

/etc/init.d/xinetd restart # 啓動服務

或者啓動方式用

rsync --daemon --config=/etc/rsyncd.conf

netstat -antup | grep :873

chkconfig xinetd on # 設置xinetd開機自啓動

四. 測試

rsync語法:

rsync 選項 用戶名@備份源服務器IP::共享模塊名 目標目錄

注意:IP地址與共享模塊間是兩個冒號哦!!!

以下:

rsync -avz rsyncuser@192.168.171.63::wwwroot /www-back/

Welcome to Backup Server

Password:       #輸入密碼password123

或者:使用下面的命令,輸出詳細信息

rsync -avz --progress --delete rsyncuser@192.168.171.63::wwwroot /www-back/

五. 密碼處理

新建一個文件保存好密碼,而後在rsync命令中使用--password-file指定此文件便可

vim passfile

Password123

chmod 600 passfile

rsync -avz rsyncuser@192.168.1.63::wwwroot --password-file=passfile /backup/

六. 腳本實現定時自動備份

vim autobackup.sh

# ---------- Start ----------

#!/bin/bash

rsync -avz rsyncuser@192.168.0.63::wwwroot --password-file=passfile /backup/

# ---------- End ----------

chmod +x autobackup.sh

# 測試腳本

rm -rf /web-back/*

sh autobackup.sh

echo "01 3 * * * sh /root/autoback.sh &" >> /var/spool/cron/root

Rsync+Inotify 實時同步

背景:Linux 內核從 2.6.13 版本開始提供了 inotify 通知接口,用來監控文件系統的各類變化狀況,如文件存取、刪除、移動等。利用這一機制,能夠很是方便地實現文件異動告警、增量備份,並針對目錄或文件的變化及時做出響應。

能夠監控某個用戶,什麼時間,作了什麼動做!

使用 rsync 工具與 inotify 機制相結合,能夠實現觸發式備份(實時同步),只要原始位置的文檔發生變化,則當即啓動增量備份操做,不然處於靜態等侍狀態,這樣一來,就避免了按固定週期備份進存在的延遲性、週期過密等問題。

下載地址:

http://sourceforge.net/projects/inotify-tools/ notify-tools-3.13

咱們把XiaoGan64上/var/www/html目錄實時同步到XiaoGan63的/web-back目錄中

一. 查看內核支持inotify和調整

uname -r # inotify從kernel2.6.13開始正式併入內核,開始支持

ls /proc/sys/fs/inotify/ # 查看調控參數

max_queued_events  #表示監控時間隊列 默認16384 可使用cat命令查看

max_user_instances          #表示最多監控實例數 默認128

max_user_watches            #表示每一個實例最多監控文件數 默認8192

#在Linux內核中,默認的Inotify機制提供了三種調控參數,當要監控的目錄,文件數比較多的時候或者變化比較頻繁的時候,要加大三個數值

能夠直接修改/etc/sysctl.conf配置文件,將管理隊列設置爲32786,實例數:1024,文件數:9000000(大於監控目標總數便可)

vim /etc/sysctl.conf

……          #末尾添加下面三行

fs.inotify.max_queued_events =32768

fs.inotify.max_user_instances =1024

fs.inotify.max_user_watches =90000000

二. 安裝inotify-tools

安裝 inotify-tools 後,將擁有 inotifywait、inotifywatch 輔助工具程序,從而來監控、彙總文件系統改動狀況。

tar xvf inotify-tools-3.13.tar.gz -C /usr/local/src/ # 解壓

cd /usr/local/src/inotify-tools-3.13/

配置,編譯並安裝

./configure --prefix=/usr/local/inotify-tools ; make ; make install

也能夠經過yum方式來安裝:

yum install inotify*

三. 測試inotifywait

使用 inotifywait 命令監控網站目錄/var/www/html發生的變化。而後在另外一個終端向/var/www/html目錄下添加文件、移動文件,查看屏幕輸出結果。

爲了便於直接調用命令,優化以下:

cd ; ln -s /usr/local/inotify-tools/bin/* /usr/bin/

inotifywait經常使用參數:

-e  用來指定要監控哪些事件。這些事件包括: create 建立,move 移動,delete 刪除,modify 修改文件內容,attrib 屬性更改。

-m 表示持續監控

-r  表示遞歸整個目錄

-q 表示簡化輸出信息。

實例:

inotifywait -mrq -e create,move,delete,modify /var/www/html/

另外開一終端,作一些改動

echo aaa > /var/www/html/a.html

mkdir /var/www/html/test

cp /etc/passwd /var/www/html/test/

rm -rf /var/www/html/test/passwd

查看監控終端

/var/www/html/ CREATE a.html

/var/www/html/ MODIFY a.html

/var/www/html/ CREATE,ISDIR test

/var/www/html/test/ CREATE passwd

/var/www/html/test/ MODIFY passwd

/var/www/html/test/ DELETE passwd

#使用 inotifywait 輸出的監控結果中,每行記錄中依次包括目錄、事件、文件。據此能夠識別變更狀況。

四. 使用觸發式同步腳本

首先要作好免密碼連接

ssh-keygen

ssh-copy-id root@192.168.1.64

編寫腳本

vim inotify.sh

# ---------- File Start ----------

#!/bin/bash

SRC=/var/www/html

DST=root@192.168.1.64:/web-back

inotifywait -mrq -e modify,delete,create,attrib ${SRC}|while read D E F

do

                /usr/bin/rsync -avz --delete $SRC $DST

  done

# ---------- File End ----------

#思路:只要檢測到變更時間,執行rsync上行同步操做,拉數據

#while read D E F是哪一個變量,前面輸出的內容是三段,每一段對應的就是後面的D E F

chmod +x inotify.sh ; echo "sh /root/inotify.sh &" >> /etc/rc.local

補充:

一、推薦瞭解下:rsync+sersync

當有海量的小數據文件的時候,inotify 會有延遲!!

二、有利有弊,慎用

相關文章
相關標籤/搜索