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都有對應的命令來實現
Xinetd管理Rsync工做原理
使用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 會有延遲!!
二、有利有弊,慎用