一征冷、rsync相關(guān)知識(shí)
1.1.什么是rsync
官方網(wǎng)址:http://sersync.sourceforge.net/
rsync是一款開(kāi)源骄噪,快速洛史,多功能的可實(shí)現(xiàn)增量的本地或遠(yuǎn)程的數(shù)據(jù)鏡像同步備份的優(yōu)秀工具。適用于多個(gè)平臺(tái)锌半。從軟件名稱(chēng)可以看出來(lái)是遠(yuǎn)程同步的意思(remote sync)俗慈『Я剑可使本地主機(jī)不同分區(qū)或目錄之間及本地和遠(yuǎn)程兩臺(tái)主機(jī)之間的數(shù)據(jù)快速同步鏡像,遠(yuǎn)程備份等功能姜盈。
? ?在同步備份時(shí)际看,默認(rèn)情況下秕豫,rsync通過(guò)其獨(dú)特的“quick check”算法誉帅,僅同步大小或者最后修改時(shí)間發(fā)生變化的文件或目錄(也可根據(jù)權(quán)限陋葡,屬主等變化同步,需要制定參數(shù))救拉。甚至是只同步一個(gè)文件里變化的內(nèi)容部分难审,所以可以實(shí)現(xiàn)快速的同步數(shù)據(jù)的功能。
提示:傳統(tǒng)的cp亿絮,scp工具拷貝每次均為完整拷貝告喊,而rsync除了完整拷貝,還具備增量拷貝的功能派昧,因此從此性能及效率上更勝一籌黔姜。
1.2.rsync的特性
Rsync的特性如下:
支持拷貝特殊文件如鏈接,設(shè)備等
可以有排除指定文件或目錄同步的功能蒂萎,相當(dāng)于打包命令tar
可以保持原來(lái)文件或目錄的權(quán)限秆吵,時(shí)間,軟硬鏈接等所有屬性均不改變五慈。
可實(shí)現(xiàn)增量同步纳寂,即只同步發(fā)生變化的數(shù)據(jù),因此數(shù)據(jù)傳輸效率更高
可以使用rcp泻拦,rsh毙芜,ssh等方式來(lái)配合傳輸文件,也可以通過(guò)直接的socker鏈接
支持匿名的或認(rèn)證的進(jìn)程模式傳輸争拐,方便進(jìn)行數(shù)據(jù)備份及鏡像腋粥。
1.3.rsync核心算法介紹
假定在名為α和β的兩臺(tái)計(jì)算機(jī)之間同步相似的文件?A?與?B?,其中α對(duì)文件?A?擁有訪(fǎng)問(wèn)權(quán)陆错,β對(duì)文件?B?擁有訪(fǎng)問(wèn)權(quán)灯抛。并且假定主機(jī)α與β之間的網(wǎng)絡(luò)帶寬很小。那么?rsync?算法將通過(guò)下面的五個(gè)步驟來(lái)完成:
1.β將文件?B?分割成一組不重疊的固定大小為?S?字節(jié)的數(shù)據(jù)塊音瓷。最后一塊可能會(huì)比?S?小对嚼。
2. [endif]β對(duì)每一個(gè)分割好的數(shù)據(jù)塊執(zhí)行兩種校驗(yàn):一種是?32?位的滾動(dòng)弱校驗(yàn),另一種是?128?位的?MD4?強(qiáng)校驗(yàn)绳慎。
3. [endif]β將這些校驗(yàn)結(jié)果發(fā)給α纵竖。
4. [endif]α通過(guò)搜索文件?A?的所有大小為?S?的數(shù)據(jù)塊?(?偏移量可以任選,不一定非要是?S?的倍數(shù)?)?杏愤,來(lái)尋找與文件?B的某一塊有著相同的弱校驗(yàn)碼和強(qiáng)校驗(yàn)碼的數(shù)據(jù)塊靡砌。這項(xiàng)工作可以借助滾動(dòng)校驗(yàn)的特性很快完成。
5. [endif]α發(fā)給β一串指令來(lái)生成文件?A?在β上的備份珊楼。這里的每一條指令要么是對(duì)文件?B?經(jīng)擁有某一個(gè)數(shù)據(jù)塊而不須重傳的證明通殃,要么是一個(gè)數(shù)據(jù)塊,這個(gè)數(shù)據(jù)塊肯定是沒(méi)有與文件?B?的任何一個(gè)數(shù)據(jù)塊匹配上的厕宗。
-------------------------------------小結(jié)------------------------------------------------
rsync就是會(huì)同步我們指定的兩端目錄之間的數(shù)據(jù)画舌,這個(gè)數(shù)據(jù)可以是特殊的數(shù)據(jù)堕担。同步之前就先進(jìn)行兩端的數(shù)據(jù)的比對(duì),只會(huì)同步兩者之間不同的部分曲聂,并保留文件原本的屬性霹购。并且支持匿名的方式進(jìn)行同步傳輸。所以rsync在備份朋腋,同步上就會(huì)較為快速齐疙。
-----------------------------------------------------------------------------------------
1.4.rsync拉和取只能在客戶(hù)端操作(重要)
在有rsync配置文件的情況下,拉和取都只能在客戶(hù)端操作旭咽,如
web(rsync client) àbackup(rsync master)
web(rsync client) ?backup(rsync master)
以上命令行的推送和拉取操作都是在web上進(jìn)行的贞奋。
為什么呢?
很簡(jiǎn)單轻专,如果推送和接取都在rsync客戶(hù)端操作的話(huà),試想一下请垛,如果有一組web要備份到備份服務(wù)器中催训,那么所有的web服務(wù)器都要配置rsync服務(wù)端,為成了“1客戶(hù)端多服務(wù)端”
會(huì)不會(huì)感覺(jué)很怪宗收?漫拭!
再說(shuō)每臺(tái)web配置rsync服務(wù)端,還是在1臺(tái)備份服務(wù)器配置一次rsync服務(wù)端混稽,那種效率高采驻?!當(dāng)然是在備份服務(wù)器只配置一次啦匈勋!
再?gòu)馁Y源占用上rsync客戶(hù)端相對(duì)服務(wù)器端占用少礼旅,從安全角度還不會(huì)像服務(wù)端開(kāi)放端口
如果是使用rsync命令直接同步,沒(méi)有接配置文件的洽洁,在哪端執(zhí)行都行痘系。
如:rsync-ar root@192.168.3.76:/disk1/tools/* /disk1/tools/
1.5.rsync認(rèn)證方式
rsync有兩種常用的認(rèn)證方式,一種是rsync-daemon方式饿自,另外一種是ssh方式汰翠。在平時(shí)使用過(guò)程,我們使用最多的是rsync-daemon方式昭雌。
注意:在使用rsync時(shí)复唤,服務(wù)器和客戶(hù)端都必須安裝rsync程序。
#1.rsync-daemon認(rèn)證
rsync在rsync-daemon認(rèn)證方式下烛卧,默認(rèn)監(jiān)聽(tīng)TCP的873端口佛纫。
rsync-daemon認(rèn)證方式是rsync的主要認(rèn)證方式,這個(gè)也是我們經(jīng)常使用的認(rèn)證方式。并且也只有在此種模式下呈宇,rsync才可以把密碼寫(xiě)入到一個(gè)文件中跟磨。
注意:rsync-daemon認(rèn)證方式,需要服務(wù)器和客戶(hù)端都安裝rsync服務(wù)攒盈,并且只需要rsync服務(wù)器端啟動(dòng)rsync,同時(shí)配置rsync配置文件哎榴⌒突恚客戶(hù)端啟動(dòng)不啟動(dòng)rsync服務(wù),都不影響同步的正常進(jìn)行尚蝌。
#2.ssh認(rèn)證
rsync在ssh認(rèn)證方式下迎变,可通過(guò)系統(tǒng)用戶(hù)進(jìn)行認(rèn)證,即在rsync上通過(guò)ssh隧道進(jìn)行傳輸飘言,類(lèi)似于scp工具衣形。此時(shí)同步操作不在局限于rsync中定義的同步文件夾。
注意:ssh認(rèn)證方式姿鸿,不需要服務(wù)器和客戶(hù)端配置rsync配置文件谆吴,只需要雙方都安裝rsync服務(wù),并且也不需要雙方啟動(dòng)rsync苛预。
若rsync服務(wù)端SSH為標(biāo)準(zhǔn)端口句狼,此時(shí)rsync使用方式如下:
rsync -avz /root/test root@192.168.3.75:/root/
1.6. rsync命令同步參數(shù)選項(xiàng)
常用參數(shù)選項(xiàng)說(shuō)明:
參數(shù)完整參數(shù)說(shuō)明
-v--verbose詳細(xì)模式輸出,傳輸時(shí)的進(jìn)度信息
-z--compress傳輸時(shí)進(jìn)行壓縮以提高傳輸效率热某, --compress-level=NUM可按級(jí)別壓縮
-a--archive歸檔模式腻菇,表示以遞歸方式傳輸文件,并保持所有文件屬性昔馋,等于-rtopgDl
-r--recursive對(duì)子目錄以遞歸模式筹吐,即目錄下的所有目錄都同樣傳輸,注意是小寫(xiě)r
-t--times保持文件時(shí)間信息
-o--owner保持文件屬主信息
-p--perms保持文件權(quán)限
-g--group保持文件屬組信息
-P--progress顯示同步的過(guò)程及傳輸時(shí)的進(jìn)度等信息
-D--devices保持設(shè)備文件信息
-l--links保持軟鏈接
-e--rsh=COMMAND使用的信道協(xié)議秘遏,指定替代rsh的shell程序丘薛,例如ssh
--exclude=PATTERN指定排除不需要傳輸?shù)奈募J?/p>
--exclude-from=FILE從文件中讀取指定排除不需要傳輸?shù)奈募J?/p>
保持同步目錄及文件屬性:
???????? 這里的-avz --progress相當(dāng)于-vzrtopgDl --progress(還多了個(gè)Dl功能),生產(chǎn)環(huán)境常用的參數(shù)選項(xiàng)為-avz --progress或-vzrtopg --progress 如果放入腳本中垄提,也可以把-v和--progress(-P)去掉榔袋。
二、實(shí)驗(yàn)環(huán)境
2.1.實(shí)驗(yàn)環(huán)境
拓?fù)鋱D:
2.2.centos6.5環(huán)境設(shè)置
#1.關(guān)閉iptables及selinux
setenforce off
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
grep '^SELINUX=' /etc/selinux/config
/etc/init.d/iptables stop
chkconfig iptables off
#2.設(shè)置時(shí)間同步
yum install ntp -y
/usr/sbin/ntpdate pool.ntp.org
echo '#time sync by hua'>>/var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1'>>/var/spool/cron/root
crontab -l
#3.其它
#1)修改主機(jī)名
vi /etc/sysconfig/network
#設(shè)置HOSTNAME=有機(jī)名
#rsync服務(wù)端所在主機(jī)铡俐,主機(jī)名修改為backup
sed -i "/HOSTNAME/s/`hostname`/backup/" /etc/sysconfig/network
grep 'HOSTNAME' /etc/sysconfig/network
#rsync客戶(hù)端所在主機(jī)是跑web服務(wù)器凰兑,故主機(jī)名改為web
sed -i "/HOSTNAME/s/`hostname`/web/" /etc/sysconfig/network
grep 'HOSTNAME' /etc/sysconfig/network
#重啟
shutdown -r now
#2)安裝epel源(安裝inotify)
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
三、rsync服務(wù)端安裝及配置(備份服務(wù)器上操作)
3.1.rsync安裝(yum)
#1.安裝rsync
##rsync是靠xinetd管理的审丘,也可以直接用“rsync
--daemon”后臺(tái)運(yùn)行
#xintetd為rsync 守護(hù)進(jìn)程管理工具
yum install -y rsync xinetd
#2.查看安裝目錄
#從下面的目錄中看吏够,除了前兩個(gè)其它的都不重要,一個(gè)是rsync配置,一個(gè)是rsync命令
#rsync是靠xinetd管理的
[root@backup ~]# rpm -ql rsync
/etc/xinetd.d/rsync
/usr/bin/rsync
/usr/share/doc/rsync-3.0.6
…
/usr/share/doc/rsync-3.0.6/tech_report.tex
/usr/share/man/man1/rsync.1.gz
/usr/share/man/man5/rsyncd.conf.5.gz
#3.創(chuàng)建rsync用戶(hù)及密碼
useradd -s /sbin/nologin -M rsync id rsync
3.2.創(chuàng)建rsync配置文件
rsync服務(wù)器端需要兩個(gè)配置文件:rsyncd.conf锅知、rsyncd.password播急。其中rsyncd.conf默認(rèn)存放在/etc/目錄下,同時(shí)它也是rsync服務(wù)器的主配置文件售睹。該文件配置了rsync服務(wù)器的控制認(rèn)證桩警、訪(fǎng)問(wèn)、日志記錄等等昌妹。而rsyncd.password主要用于存儲(chǔ)rsync用戶(hù)名和密碼捶枢。但是在rsync安裝完畢后后是不會(huì)生成以上這兩個(gè)配置文件的,需要我們手工進(jìn)行創(chuàng)建飞崖。
#1.創(chuàng)建主配置文件rsyncd.conf
配置幫助:man rsyncd.conf烂叔,也可以看文章的“附一”
#在創(chuàng)建配置文件的時(shí)間,值得注意的是不要在參數(shù)同行后面加“#”號(hào)注解固歪,這時(shí)會(huì)被
#認(rèn)為是“#”是符號(hào)而非注解蒜鸡!
例如:authusers = test? #虛擬用戶(hù),將會(huì)認(rèn)為密碼是“test? #虛擬用戶(hù)”而非test,會(huì)報(bào)
#“@ERROR: auth failed on module tools”,排得你頭都大@紊选逢防!
cat>>/etc/rsyncd.conf<<EOF
#rsync_config______________________start
#created by oldboy
##rsyncd.conf start##
# 用戶(hù)遠(yuǎn)端的命令使用rsync訪(fǎng)問(wèn)共享目錄
uid = rsync
# 用戶(hù)組
gid = rsync
# 安全相關(guān)
use chroot = no
# 最大連接數(shù)
max connections = 200
# 超時(shí)時(shí)間
timeout = 300
# 進(jìn)程對(duì)應(yīng)的進(jìn)程號(hào)文件
pid file = /var/run/rsyncd.pid
# 鎖文件
lock file =
/var/run/rsyncd.lock
# 日志文件
log file = /var/log/rsyncd.log
# 忽略錯(cuò)誤
ignore errors
# 可寫(xiě)
read only = false
# 不能列表
list = false
# 允許連接的服務(wù)器
hosts allow = 192.168.3.0/24
# 后勤組連接的服務(wù)器
hosts deny = 0.0.0.0/32
# 虛擬用戶(hù),可以不存在
auth users = test
# 虛擬用戶(hù)對(duì)應(yīng)的用戶(hù)和密碼文件
secrets file =
/etc/rsync.password
# 模塊名稱(chēng)
[web76_tools]
# 服務(wù)端提供訪(fǎng)問(wèn)的目錄
path = /disk1/backup/76/disk1_tools
#rsync_config______________________end
EOF
cat /etc/rsyncd.conf
#修改目錄權(quán)限贰健,使它能讀寫(xiě)操作
mkdir -p /disk1/backup/76/disk1_tools
chown rsync.rsync -R /disk1/backup/76/disk1_tools
#2.創(chuàng)建密碼文件rsync.password
???????? 配置密碼文件的格式為“用戶(hù)名:密碼”胞四,密碼文件權(quán)限必須為600
echo 'test:123456'
>/etc/rsync.password
cat /etc/rsync.password
chmod 600 /etc/rsync.password
3.啟動(dòng)rsync服務(wù)
#1.啟動(dòng)rsync服務(wù)
rsync --daemon
#拓展:rsync的進(jìn)程參數(shù)選項(xiàng)
--daemon? ???? 表示以守護(hù)進(jìn)程的方式啟動(dòng)rsync服務(wù)
--address ? ???? 綁定指定的IP地址提供服務(wù)
--config=FILE??? 更改配置文件路徑,而不是默認(rèn)的/etc/rsyncd.conf
--port=PORT???? 更改其它端口提供服務(wù)伶椿,而不是缺少的873端口
提示:以上幾個(gè)選項(xiàng)為了解內(nèi)容辜伟,生產(chǎn)場(chǎng)景使用不多
ps -ef |grep rsync
netstat -antlp|grep rsync
#2.設(shè)置rsync服務(wù)開(kāi)機(jī)啟動(dòng)
方法一:
echo '/usr/bin/rsync --daemon'
>>/etc/rc.local
tail -1 /etc/rc.local
#重啟rsync組合命令
pkill rsync
pkill rsync
sleep 2
ps -ef |grep rsync
rsync --daemon
ps -ef |grep rsync
netstat -antlp|grep rsync
方法二:
#也可以使用xinetd啟動(dòng),進(jìn)行會(huì)顯示為xinetd而非rsync
cd /etc/xinetd.d/
cp rsync rsync.orig
vim rsync
#修改如下:只需“disable = no”其它不變脊另,user不要改為rsync否則手工測(cè)試會(huì)報(bào)
# “@ERROR: failed toopen lock file”錯(cuò)誤
/etc/init.d/xinetd start
netstat -ntlp|grep 873
#注意导狡,此處的進(jìn)程是xinetd,并非是rsync
ps -ef |grep xinetd
#xinetd默認(rèn)是開(kāi)機(jī)啟動(dòng)的偎痛,所以不用chkconfig
xinetd on設(shè)置
chkconfig --list xinetd
四旱捧、rsync客戶(hù)端安裝及配置(web服務(wù)器上操作)
4.1.rsync安裝(yum)
#1.安裝rsync
##rsync是靠xinetd管理的,也可以直接用“rsync
--daemon”后臺(tái)運(yùn)行
yum install -y rsync xinetd
#2.創(chuàng)建rsync用戶(hù)及密碼
useradd -s /sbin/nologin -M rsync id rsync
4.22.創(chuàng)建密碼文件rsync.password
客戶(hù)端不需要用到/etc/rsyncd.conf配置文件踩麦,故不用生成枚赡。
#注意客戶(hù)端的rsync.password只有密碼,是不是“用戶(hù)名:密碼”N角贫橙!
echo '123456' >/etc/rsync.password
cat /etc/rsync.password
#權(quán)限一定要為600
chmod 600 /etc/rsync.password
ll /etc/rsync.password
4.3.手工測(cè)試
登陸客戶(hù)端,測(cè)試一下拉取命令
#建立測(cè)試目錄反粥,建立一個(gè)t1.txt文件卢肃,建立hua目錄疲迂,建立一個(gè)軟鏈接
mkdir -p /disk1/tools
cd /disk1/tools
echo "76? /disk1/tools/t1.txt"> t1.txt
echo 'web /disk1/tools/hua/1.txt' >hua/1.txt
echo 'web /disk1/tools/hua/2.txt' >hua/2.txt
ln -s /etc/nginx nginx
#手工測(cè)試rsync,記住要在客戶(hù)端上操作
#rsync接模塊用“用戶(hù)@IP::模塊”方式
rsync -avP /disk1/tools/* test@192.168.3.75::web76_tools--password-file=/etc/rsync.password
#從上面的圖來(lái)看是推送成功了莫湘,去備份服務(wù)器查看一下尤蒿,如圖說(shuō)明rsync支持軟鏈接
ll /disk1/backup/76/disk1_tools/
cd /disk1/backup/76/disk1_tools
cat t1.txt
cat hua/1.txt
cat hua/2.txt
五、inotify+rsync實(shí)時(shí)同步
5.1.rsync的優(yōu)點(diǎn)與不足
rsync在Linux/Unix下是一個(gè)比較重要和實(shí)用的服務(wù)幅垮,大家應(yīng)該已經(jīng)知道rsync具有安全性高腰池、備份迅速、支持增量備份等優(yōu)點(diǎn)忙芒。
通過(guò)rsync可以解決對(duì)實(shí)時(shí)性要求不高的數(shù)據(jù)備份需求巩螃,例如:定期備份文件服務(wù)器數(shù)據(jù)到遠(yuǎn)端服務(wù)器,對(duì)本地磁盤(pán)定期做數(shù)據(jù)鏡像等匕争。
隨著應(yīng)用系統(tǒng)規(guī)模的不斷擴(kuò)大,對(duì)數(shù)據(jù)安全性和可靠性也提出了更高的要求爷耀,rsync在高端業(yè)務(wù)系統(tǒng)中也逐漸暴露出它的不足甘桑。
[if !supportLists]l? [endif]首先,rsync在進(jìn)行同步數(shù)據(jù)時(shí)歹叮,需要先掃描所有文件后進(jìn)行比對(duì)跑杭,然后再進(jìn)行差量傳輸。如果文件數(shù)量達(dá)到百萬(wàn)甚至千萬(wàn)級(jí)咆耿,掃描所以文件將是非常耗時(shí)的德谅。而且發(fā)生變化的往往是其中很少的一部分文件,這是非常低效的方式萨螺。
[if !supportLists]l? [endif]其次窄做,rsync不能實(shí)時(shí)地去監(jiān)測(cè)、同步數(shù)據(jù)慰技。雖然它可以通過(guò)Linux守護(hù)進(jìn)程的方式觸發(fā)同步椭盏,但是兩次觸發(fā)動(dòng)作之間一定會(huì)有時(shí)間差。這樣就可能會(huì)導(dǎo)致服務(wù)端和客戶(hù)端數(shù)據(jù)出現(xiàn)不一致的情況吻商,無(wú)法在應(yīng)用出現(xiàn)故障時(shí)完全恢復(fù)數(shù)據(jù)掏颊。
基于以上原因,所以就考慮采用rsync與inotify集成的方式來(lái)解決這些問(wèn)題艾帐。
5.2.innotify介紹
#1.inotify是什么
inotify是一種強(qiáng)大的乌叶、細(xì)粒度的、異步的文件系統(tǒng)事件監(jiān)控機(jī)制柒爸。
Linux內(nèi)核從2.6.13(2005年8月)起准浴,加入了對(duì)inotify的支持,通過(guò)inotify可以監(jiān)控文件系統(tǒng)中的添加揍鸟、刪除兄裂、修改句旱、移動(dòng)等各種細(xì)微事件。利用這個(gè)內(nèi)核接口晰奖,第三方軟件就可以監(jiān)控文件系統(tǒng)下文件的各種變化情況谈撒,而inotify-tools就是這樣一個(gè)第三方軟件。
在上面章節(jié)中匾南,我們講到啃匿,rsync可以實(shí)現(xiàn)觸發(fā)式的文件同步。它是通過(guò)crontab守護(hù)進(jìn)程方式觸發(fā)蛆楞,同步的數(shù)據(jù)和實(shí)際數(shù)據(jù)會(huì)有差異溯乒,而inotify可以監(jiān)控文件系統(tǒng)的各種變化,當(dāng)文件有任何變化時(shí)豹爹,就觸發(fā)rsync同步裆悄,這就剛好解決了數(shù)據(jù)同步實(shí)時(shí)性的問(wèn)題。
#2.inotify相關(guān)參數(shù)詳解
inotify定義了三個(gè)接口參數(shù)臂聋,可以用來(lái)限制inotify消耗kernel
memory的大小光稼。由于這些參數(shù)都是內(nèi)存參數(shù),因此孩等,可以根據(jù)應(yīng)用需求實(shí)時(shí)的調(diào)節(jié)其大小艾君。下面分別做簡(jiǎn)單介紹:
/proc/sys/fs/inotify/max_queued_evnets
表示請(qǐng)求events數(shù)的最大值,超出這個(gè)值的事件將被丟棄肄方。該值默認(rèn)為16384冰垄。
注意:max_queued_events是inotify管理的隊(duì)列的最大長(zhǎng)度,文件系統(tǒng)變化越頻繁权她,這個(gè)值就應(yīng)該越大虹茶。
如果你在日志中看到Event Queue
Overflow,說(shuō)明max_queued_events太小需要調(diào)整參數(shù)后再次使用隅要。
/proc/sys/fs/inotify/max_user_instances
表示每個(gè)user可創(chuàng)建的instances數(shù)量上限写烤。該值默認(rèn)為128。
/proc/sys/fs/inotify/max_user_watches
表示可監(jiān)控目錄的最大數(shù)拾徙。該值默認(rèn)為8192洲炊。
要修改以上默認(rèn)值,我們可以使用以下類(lèi)似手段修改尼啡。如下:
echo30000000>/proc/sys/fs/inotify/max_user_watches
#安裝inotify暂衡,“yum install inotify-tools”后就可以查看
#3.inotify監(jiān)控的文件事件類(lèi)型
inotify可監(jiān)控的文件系統(tǒng)事件類(lèi)型,如下:
IN_ACCESS:文件被訪(fǎng)問(wèn)崖瞭。
IN_MODIFY:文件被write狂巢。
IN_ATTRIB:文件屬性被修改,如chmod书聚、chown等唧领。
IN_CLOSE_WRITE:可寫(xiě)文件被close藻雌。
IN_CLOSE_NOWRITE:不可寫(xiě)文件被close。
IN_OPEN:文件被open斩个。
IN_MOVED_FROM:文件被移出被監(jiān)控目錄,如mv胯杭。
IN_MOVED_TO:文件被移入被監(jiān)控目錄,如mv受啥、cp做个。
IN_CREATE:文件/文件夾被創(chuàng)建。
IN_DELETE:文件/文件夾被刪除滚局,如rm居暖。
IN_DELETE_SELF:自刪除,即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)刪除自己藤肢。
IN_MOVE_SELF:自移動(dòng)太闺,即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)移動(dòng)自己。
IN_UNMOUNT:宿主文件系統(tǒng)被umount嘁圈。
IN_CLOSE:文件被關(guān)閉跟束,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。
IN_MOVE:文件被移動(dòng)丑孩,等同于(IN_MOVED_FROM|IN_MOVED_TO)。
注意:上面所說(shuō)的文件也包括目錄灭贷。
inotify僅僅是一個(gè)API温学,需要通過(guò)開(kāi)發(fā)應(yīng)用程序進(jìn)行調(diào)用。inotify-tools就是這樣的一個(gè)inotify軟件甚疟,它是一套組件,包括一個(gè)C庫(kù)和幾個(gè)命令行工具仗岖。這些命令行工具可用于通過(guò)命令行或腳本對(duì)某些文件系統(tǒng)的事件進(jìn)行監(jiān)控。
inotify是為替代dnotify而設(shè)計(jì)的览妖,它克服了dnotify的缺陷轧拄,提供了更好用的,更簡(jiǎn)潔而強(qiáng)大的文件變化通知機(jī)制讽膏。
notify不需要對(duì)被監(jiān)視的目標(biāo)打開(kāi)文件描述符檩电,而且如果被監(jiān)視目標(biāo)在可移動(dòng)介質(zhì)上,那么在umount該介質(zhì)上的文件系統(tǒng)后府树,被監(jiān)視目標(biāo)對(duì)應(yīng)的watch將被自動(dòng)刪除俐末,并且會(huì)產(chǎn)生一個(gè)umount事件。
inotify既可以監(jiān)視文件奄侠,又可以監(jiān)視目錄卓箫。
4) [endif]inotify使用系統(tǒng)調(diào)用而非SIGIO信號(hào)來(lái)通知文件系統(tǒng)事件。
inotify使用文件描述符作為接口垄潮,因而可以使用通常的文件I/O操作select和poll來(lái)監(jiān)視文件系統(tǒng)的變化烹卒。
#5.inotify-tools與rsync集成
inotify-tools與rsync的集成主要是通過(guò)inotifywait命令與rsync命令集成來(lái)實(shí)現(xiàn)的闷盔,并且該集成主要是體現(xiàn)的rsync客戶(hù)端,而rsync服務(wù)器端正需要按照正常的配置進(jìn)行即可旅急。
注意:該集成的主要目的是把rsync客戶(hù)端需要備份的文件實(shí)時(shí)推送到rsync服務(wù)器上逢勾。
5.3.實(shí)驗(yàn)拓?fù)?/h2>
???????? 在文章第一至第三章中,如果要實(shí)現(xiàn)rsync同步坠非,需要添加定時(shí)任務(wù)才可以完成敏沉,每次還要rsync對(duì)比一下,這樣的效率低下且實(shí)時(shí)性差炎码,有沒(méi)有更好的方法呢盟迟,當(dāng)然有!可以使用與inotify結(jié)合使用潦闲。實(shí)驗(yàn)的拓?fù)淙缦拢?/p>
#3.inotify監(jiān)控的文件事件類(lèi)型
inotify可監(jiān)控的文件系統(tǒng)事件類(lèi)型攒菠,如下:
IN_ACCESS:文件被訪(fǎng)問(wèn)。
IN_MODIFY:文件被write歉闰。
IN_ATTRIB:文件屬性被修改辖众,如chmod、chown等和敬。
IN_CLOSE_WRITE:可寫(xiě)文件被close凹炸。
IN_CLOSE_NOWRITE:不可寫(xiě)文件被close。
IN_OPEN:文件被open昼弟。
IN_MOVED_FROM:文件被移出被監(jiān)控目錄,如mv啤它。
IN_MOVED_TO:文件被移入被監(jiān)控目錄,如mv舱痘、cp变骡。
IN_CREATE:文件/文件夾被創(chuàng)建。
IN_DELETE:文件/文件夾被刪除芭逝,如rm塌碌。
IN_DELETE_SELF:自刪除,即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)刪除自己旬盯。
IN_MOVE_SELF:自移動(dòng)台妆,即一個(gè)可執(zhí)行文件在執(zhí)行時(shí)移動(dòng)自己。
IN_UNMOUNT:宿主文件系統(tǒng)被umount胖翰。
IN_CLOSE:文件被關(guān)閉频丘,等同于(IN_CLOSE_WRITE|IN_CLOSE_NOWRITE)。
IN_MOVE:文件被移動(dòng)泡态,等同于(IN_MOVED_FROM|IN_MOVED_TO)搂漠。
注意:上面所說(shuō)的文件也包括目錄。
inotify僅僅是一個(gè)API某弦,需要通過(guò)開(kāi)發(fā)應(yīng)用程序進(jìn)行調(diào)用桐汤。inotify-tools就是這樣的一個(gè)inotify軟件而克,它是一套組件,包括一個(gè)C庫(kù)和幾個(gè)命令行工具。這些命令行工具可用于通過(guò)命令行或腳本對(duì)某些文件系統(tǒng)的事件進(jìn)行監(jiān)控怔毛。
[if !supportLists]1) [endif]inotify是為替代dnotify而設(shè)計(jì)的员萍,它克服了dnotify的缺陷,提供了更好用的拣度,更簡(jiǎn)潔而強(qiáng)大的文件變化通知機(jī)制碎绎。
[if !supportLists]2) [endif]inotify不需要對(duì)被監(jiān)視的目標(biāo)打開(kāi)文件描述符,而且如果被監(jiān)視目標(biāo)在可移動(dòng)介質(zhì)上抗果,那么在umount該介質(zhì)上的文件系統(tǒng)后筋帖,被監(jiān)視目標(biāo)對(duì)應(yīng)的watch將被自動(dòng)刪除,并且會(huì)產(chǎn)生一個(gè)umount事件冤馏。
[if !supportLists]3) [endif]inotify既可以監(jiān)視文件日麸,又可以監(jiān)視目錄。
[if !supportLists]4) [endif]inotify使用系統(tǒng)調(diào)用而非SIGIO信號(hào)來(lái)通知文件系統(tǒng)事件逮光。
[if !supportLists]5) [endif]inotify使用文件描述符作為接口代箭,因而可以使用通常的文件I/O操作select和poll來(lái)監(jiān)視文件系統(tǒng)的變化。
#5.inotify-tools與rsync集成
inotify-tools與rsync的集成主要是通過(guò)inotifywait命令與rsync命令集成來(lái)實(shí)現(xiàn)的涕刚,并且該集成主要是體現(xiàn)的rsync客戶(hù)端嗡综,而rsync服務(wù)器端正需要按照正常的配置進(jìn)行即可。
注意:該集成的主要目的是把rsync客戶(hù)端需要備份的文件實(shí)時(shí)推送到rsync服務(wù)器上杜漠。
5.3.實(shí)驗(yàn)拓?fù)?/p>
???????? 在文章第一至第三章中极景,如果要實(shí)現(xiàn)rsync同步,需要添加定時(shí)任務(wù)才可以完成碑幅,每次還要rsync對(duì)比一下,這樣的效率低下且實(shí)時(shí)性差塞绿,有沒(méi)有更好的方法呢沟涨,當(dāng)然有!可以使用與inotify結(jié)合使用异吻。實(shí)驗(yàn)的拓?fù)淙缦拢?/p>
從上面拓?fù)渲拦埃?dāng)要監(jiān)控的目錄發(fā)生變化的時(shí)候,就會(huì)觸發(fā)innotify調(diào)用rsync同步诀浪。
5.4.inotify安裝及配置(rsync客戶(hù)端上操作)
yum install -y inotify-tools
#查看安裝目錄棋返,從目錄看出這個(gè)工具很小,就2個(gè)命令其它的都沒(méi)用雷猪!
[root@web inotify]# rpm -ql
inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
注意:inotify-tools主要是通過(guò)inotifywait和inotifywatch睛竣,這兩個(gè)命令進(jìn)行工作。特別是inotifywait命令求摇,是我們生產(chǎn)環(huán)境中使用最多的命令射沟。
inotifywait和inotifywatch命令及測(cè)試具體用法請(qǐng)看文檔最后的“附錄二”
#2.設(shè)置同步腳本
???????? inotify是用來(lái)監(jiān)視文件系統(tǒng)事件的機(jī)制殊者,在Linux 2.6.13內(nèi)核中引入。該機(jī)制可以用來(lái)監(jiān)視文件和目錄验夯,當(dāng)文件或目錄發(fā)生變化時(shí)猖吴,內(nèi)核會(huì)將文件或目錄的變化發(fā)送給inotify文件描述符,在應(yīng)用層只需調(diào)用read()就可以讀取這些事件挥转,非常的方便海蔽。也可以用使用select(),poll(),epoll()以及由信號(hào)驅(qū)動(dòng)的I/O來(lái)監(jiān)控inotify文件描述符钱烟,這里不做詳解五辽,需要了解的可以搜索相關(guān)文章耘纱。
我們現(xiàn)在需要編寫(xiě)一個(gè)腳本卡骂,主要是用inotifywai監(jiān)控指定文件或目錄吴汪,當(dāng)文件的變化時(shí)產(chǎn)生相應(yīng)的事件糊探,我們?cè)儆胷ead()去讀到需要的事件缔刹,然后調(diào)用rsync命令實(shí)時(shí)同步愉粤,這樣就做到了實(shí)時(shí)同步的目的暇务,命令如下:
mkdir /disk1/sh
cd /disk1/sh
cat>>inotify.sh<<EOF
#!/bin/bash
# 需要同步的源路徑
src=/disk1/tools/
#rsync服務(wù)端模塊名
des=web76_tools
#
rsync驗(yàn)證的密碼文件
rsync_passwd_file=/etc/rsync.password
# 目標(biāo)服務(wù)器泼掠,我這里只有一臺(tái)所以只用IP1
ip1=192.168.3.75
#ip2=192.168.3.74
#
rsync服務(wù)端定義的驗(yàn)證用戶(hù)名
user=test
# 此方法中,由于rsync同步的特性垦细,這里必須要先cd到源目錄择镇,inotify再監(jiān)聽(tīng)./
#才能rsync同步后目錄結(jié)構(gòu)一致,有興趣的同學(xué)可以進(jìn)行各種嘗試觀看其效果
cd \${src}
# 把監(jiān)控到有發(fā)生更改的"文件路徑列表"循環(huán)
# inotifywait命令產(chǎn)生3個(gè)返回值括改,這3個(gè)返回值會(huì)做為參數(shù)傳給read
/usr/bin/inotifywait-mrq --format? '%Xe %w%f' -emodify,create,delete,attrib,close_write,move ./ | while read file
do
#把inotify輸出切割 把事件類(lèi)型部分賦值給INO_EVENT
INO_EVENT=\$(echo \$file | awk '{print \$1}')
#把inotify輸出切割 把文件路徑部分賦值給INO_FILE
INO_FILE=\$(echo \$file | awk '{print \$2}')
echo "-------------------------------\$(date)------------------------------------"
echo \$file
#增加腻豌、修改、寫(xiě)入完成嘱能、移動(dòng)進(jìn)事件
#增吝梅、改放在同一個(gè)判斷,因?yàn)樗麄兌伎隙ㄊ轻槍?duì)文件的操作惹骂,
#即使是新建目錄苏携,要同步的也只是一個(gè)空目錄,不會(huì)影響速度对粪。
# 判斷事件類(lèi)型
if [[ \$INO_EVENT =~ 'CREATE' ]] || [[ \$INO_EVENT =~ 'MODIFY' ]] || [[ \$INO_EVENT=~ 'CLOSE_WRITE' ]] || [[ \$INO_EVENT =~ 'MOVED_TO' ]]
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
# INO_FILE變量代表路徑哦? -c校驗(yàn)文件內(nèi)容
rsync -avzcR --password-file=\${rsync_passwd_file} \$(dirname\${INO_FILE}) \${user}@\${ip1}::\${des}
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des} &&
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip2}::\${des}
#仔細(xì)看 上面的rsync同步命令 源是用了\$(dirname
\${INO_FILE})變量 即每次只針對(duì)性的同步
#發(fā)生改變的文件的目錄(只同步目標(biāo)文件的方法在生產(chǎn)環(huán)境的某些極端環(huán)境下會(huì)漏文件 現(xiàn)在
#可以在不漏文件下也有不錯(cuò)的速度 做到平衡) 然后用-R參數(shù)把源的目錄結(jié)構(gòu)遞歸到目標(biāo)后面
#保證目錄結(jié)構(gòu)一致性
fi
#刪除右冻、移動(dòng)出事件
?????? ?if[[ \$INO_EVENT =~ 'DELETE' ]] || [[ \$INO_EVENT =~ 'MOVED_FROM' ]]
??????? then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete--password-file=\${rsync_passwd_file} \$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des}
#rsync-avzR --delete --password-file=\${rsync_passwd_file} \$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des}&&
#rsync-avzR --delete --password-file=\${rsync_passwd_file} \$(dirname \${INO_FILE}) \${user}@\${ip2}::\${des}
#看rsync命令 如果直接同步已刪除的路徑\${INO_FILE}會(huì)報(bào)no
such or directory錯(cuò)誤 所以這里同步的源
#是被刪文件或目錄的上一級(jí)路徑,并加上--delete來(lái)刪除目標(biāo)上有而源中沒(méi)有的文件著拭,這里不能做到指定
#文件刪除纱扭,如果刪除的路徑越靠近根,則同步的目錄月多儡遮,同步刪除的操作就越花時(shí)間乳蛾。
#這里有更好方法的同學(xué),歡迎交流。
?????? ?fi
??????? #修改屬性事件 指 touch chgrp chmod chown等操作
?????? ?if[[ \$INO_EVENT =~ 'ATTRIB' ]]
??????? then
??????????????? echo 'ATTRIB'
#如果修改屬性的是目錄 則不同步屡久,因?yàn)橥侥夸洉?huì)發(fā)生遞歸掃描忆首,等此目錄下的文件發(fā)生同步時(shí),rsync會(huì)順帶更新此目錄被环。
??????????????? if [ ! -d "\$INO_FILE"]
??????????????? then
rsync -avzcR --password-file=\${rsync_passwd_file} \$(dirname\${INO_FILE}) \${user}@\${ip1}::\${des}
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip1}::\${des} &&
#rsync -avzcR --password-file=\${rsync_passwd_file}\$(dirname \${INO_FILE}) \${user}@\${ip2}::\${des}
??????????????? fi
??????? fi
done
EOF
網(wǎng)上很多的寫(xiě)法是全量同步的糙及,所以造成同步很慢。代碼如下:
#!/bin/bash
/usr/bin/inotifywait -mrq--format '%w%f'-e create,close_write,delete /backup |while read file
#把發(fā)生更改的文件列表都接收到file然后循環(huán)筛欢,但有什么鬼用呢浸锨?
#下面的命令都沒(méi)有引用這個(gè)$file下面做的是全量rsync
do
??? cd /disk1/tools && rsync -az--delete /disk1/tools rsync_backup@192.168.3.75::web76_tools --password-file=/etc/rsync.password
done
注意看上面的代碼中rsync 每次都是全量的同步(這就坑爹了),而且 file列表是循環(huán)形式觸發(fā)rsync 版姑,等于有10個(gè)文件發(fā)生更改柱搜,就觸發(fā)10次rsync全量同步(簡(jiǎn)直就是噩夢(mèng)),那還不如直接寫(xiě)個(gè)死循環(huán)的rsync全量同步得了剥险。
有很多人會(huì)說(shuō) 日志輸出那里明明只有差異文件的同步記錄聪蘸。其實(shí)這是rsync的功能,他本來(lái)就只會(huì)輸出有差異需要同步的文件信息表制。不信你直接拿這句rsync來(lái)跑試試健爬。
這種在需要同步的源目錄文件量很大的情況下,簡(jiǎn)直是不堪重負(fù)么介。不僅耗CPU還耗時(shí)娜遵,根本不可以做到實(shí)時(shí)同步。
5.5.測(cè)試
???????? 在rsync客戶(hù)端服務(wù)器打開(kāi)兩個(gè)ssh連接壤短,第1個(gè)ssh連接上運(yùn)行上面的腳本
#為了看到效果沒(méi)有用加“&”變成后臺(tái)運(yùn)行
/disk1/sh/inotify.sh
???????? 在第2個(gè)ssh連接中嘗試建立或自己文件
cd /disk1/tools/
echo '76 inotify
test'>inotify.txt
mkdir inotify
???????? 切換到第1個(gè)ssh連接查看結(jié)果如下:
[root@web ~]#/disk1/sh/inotify.sh
-------------------------------2017年 06月 29日星期四 14:02:59 CST---------------------------------
CREATE ./inotify.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list
./
inotify.txt
inotify/
sent 321 bytes? received 35 bytes? 33.90 bytes/sec
total size is 126? speedup is 0.35
-------------------------------2017年 06月 29日星期四 14:03:09 CST---------------------------------
MODIFY ./inotify.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list
sent 259 bytes? received 10 bytes? 538.00 bytes/sec
total size is 126? speedup is 0.47
-------------------------------2017年 06月 29日星期四 14:03:09 CST---------------------------------
CLOSE_WRITEXCLOSE ./inotify.txt
CREATE or MODIFY or CLOSE_WRITE or MOVED_TO
sending incremental file list
sent 259 bytes? received 10 bytes? 538.00 bytes/sec
total size is 126? speedup is 0.47
-------------------------------2017年 06月 29日星期四 14:03:09 CST---------------------------------
CREATEXISDIR ./inotify
CREATE or MODIFY or CLOSE_WRITE
or MOVED_TO
sending incremental file list
sent 259 bytes? received 10 bytes? 538.00 bytes/sec
total size is 126? speedup is 0.47
???????? 再去rsync master端(即備份服務(wù)器)上查看目錄是否多inotify.txt文件和inotify目錄,同理再執(zhí)行刪除操作设拟,看一下變化。
rm -f inotify.txt
rm -rf inotify
#inotify后臺(tái)執(zhí)行命令久脯,一定要加nohup纳胧,只加“&”是不行的
cd /disk1/sh/
nohup ./inotify.sh >>
inotify.log &
ps -ef |grep inotify
#關(guān)閉當(dāng)前的ssh連接再輸入下面命令查看inotify進(jìn)程是否存在
ps -ef |grep inotify
#停止inotify
pkill inotify
pkill inotify
ps -ef |grep inotify
六、rsync+sersync文件實(shí)時(shí)同步
6.1.Sersync介紹
Sersync項(xiàng)目利用inotify與rsync技術(shù)實(shí)現(xiàn)對(duì)服務(wù)器數(shù)據(jù)實(shí)時(shí)同步的解決方案帘撰,其中inotify用于監(jiān)控sersync所在服務(wù)器上文件系統(tǒng)的事件變化跑慕,rsync是目前廣泛使用的本地及異地?cái)?shù)據(jù)同步工具,其優(yōu)點(diǎn)是只對(duì)變化的目錄數(shù)據(jù)操作骡和,甚至是一個(gè)文件不同的部分進(jìn)行同步相赁,所有其優(yōu)勢(shì)大大超過(guò)使用掛載文件系統(tǒng)或scp等方式進(jìn)行鏡像同步相寇。
???????? 相比上面兩個(gè)項(xiàng)目慰于,Sersync項(xiàng)目的優(yōu)點(diǎn)是:
1.使用c++編寫(xiě),而且對(duì)linux系統(tǒng)文件系統(tǒng)產(chǎn)生的臨時(shí)文件和重復(fù)的文件操作進(jìn)行過(guò)濾(我稍后會(huì)提到)唤衫,所以在結(jié)合rsync同步的時(shí)候婆赠,節(jié)省了運(yùn)行時(shí)耗和網(wǎng)絡(luò)資源。因此更快。
2.相比較上面兩個(gè)項(xiàng)目休里,sersync配置起來(lái)很簡(jiǎn)單:在http://code.google.com/p/sersync/downloads/list 處下載源碼(分為32版本蛆挫,與64位版本),其中bin目錄下已經(jīng)有我編譯好的2進(jìn)制文件妙黍,配合bin目錄下的xml文件直接使用即可悴侵。
3. 使用多線(xiàn)程進(jìn)行同步,尤其在同步較大文件時(shí)拭嫁,能夠保證多個(gè)服務(wù)器實(shí)時(shí)保持同步狀態(tài)可免。
4.? sersync自帶出錯(cuò)處理機(jī)制,通過(guò)失敗隊(duì)列對(duì)出錯(cuò)的文件重新出錯(cuò)做粤,如果仍舊失敗浇借,則每10個(gè)小時(shí)對(duì)同步失敗的文件重新同步。
5.? sersync自帶crontab功能怕品,只需在xml配置文件中開(kāi)啟妇垢,即可按您的要求,隔一段時(shí)間整體同步一次肉康。
]6.? sersync自帶socket與http協(xié)議擴(kuò)展闯估,可以滿(mǎn)足有特殊需求的公司二次開(kāi)發(fā)。
基本構(gòu)架
6.2.rsync+sersync實(shí)驗(yàn)
???????? 實(shí)驗(yàn)圖和rsync+inotify實(shí)驗(yàn)拓?fù)湟粯佑蓿徊贿^(guò)是把inotify改為sersync而已睬愤。
所以得把inotify進(jìn)行停止掉。
#停止inotify(rsync客戶(hù)端上操作纹安,只有客戶(hù)端上才安裝inotify)
pkill inotify
pkill inotify
ps -ef |grep inotify
6.3.sersync安裝及配置(rsync客戶(hù)端上操作)
打開(kāi)官方鏈接:http://sersync.sourceforge.net尤辱,點(diǎn)“Downloads”
https://code.google.com/archive/p/sersync/downloads,
另一個(gè)下載地址:http://download.csdn.net/detail/colin20111/8822175
#1.下載及安裝
cd ~
#上傳sersync2.5.4_64bit_binary_stable_final.tar.gz工具
mkdir /usr/local/sersync
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/sersync
cd /usr/local/sersync/GNU-Linux-x86/
#查看目錄
#sersync也非常簡(jiǎn)單厢岂,不需要編譯安裝光督。
#目錄中只有一個(gè)配置文件confxml.xml和一個(gè)可執(zhí)行文件sersync2
[root@web GNU-Linux-x86]# ll
總用量 1772
-rwxr-xr-x 1 root root??? 2214 10月 26 2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 10月 26 2011 sersync2
#移動(dòng)一下文件
mv * ../
rm -rf GNU-Linux-x86
#建立命令軟鏈接
ln -s
/usr/local/sersync/sersync2 /usr/sbin/sersync2
ll /usr/sbin/sersync2
cd ..
rm -rf GNU-Linux-x86
#2.配置sersync
cp confxml.xml confxml.xml.orig
vim confxml.xml
#修改黑色粗體部分就行了
#也可能用命令方式直接修改,如下
#變成true"/>
sed -i '/modify/s/false/true/'
confxml.xml
grep modify confxml.xml
#變成/disk1/tools">
#搜索“l(fā)ocalpath”,結(jié)果有多個(gè)塔粒,只修改第一個(gè)
sed -i '0,/localpath/s#/opt/tongbu#/disk1/tools#' confxml.xml
grep localpath confxml.xml
#變成192.168.3.75" name="web76_tools"/>
sed -i '/127.0.0.1/s/tongbu1/web76_tools/' confxml.xml
sed -i '/127.0.0.1/s/127.0.0.1/192.168.3.75/' confxml.xml
egrep '[ ]+<remote'
confxml.xml
# 變成true" users="test" passwordfile="/etc/rsync.password"/>
sed -i '/auth/s/false/true/'
confxml.xml
sed -i '/auth/s/root/test/' confxml.xml
sed -i '/auth/s/rsync.pas/rsync.password/' confxml.xml
grep auth? confxml.xml
6.4.啟動(dòng)sersync
#查看sersync幫助命令
[root@web sersync]# sersync2 -h
set the system param
execute:echo
50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679
> /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
參數(shù)-d:啟用守護(hù)進(jìn)程模式
參數(shù)-r:在監(jiān)控前结借,將監(jiān)控目錄與遠(yuǎn)程主機(jī)用rsync命令推送一遍
c參數(shù)-n: 指定開(kāi)啟守護(hù)線(xiàn)程的數(shù)量,默認(rèn)為10個(gè)
參數(shù)-o:指定配置文件卒茬,默認(rèn)使用confxml.xml文件
參數(shù)-m:單獨(dú)啟用其他模塊船老,使用 -m refreshCDN 開(kāi)啟刷新CDN模塊
參數(shù)-m:單獨(dú)啟用其他模塊,使用 -m socket 開(kāi)啟socket模塊
參數(shù)-m:單獨(dú)啟用其他模塊圃酵,使用 -m http 開(kāi)啟http模塊
不加-m參數(shù)柳畔,則默認(rèn)執(zhí)行同步程序
________________________________________________________________
#啟動(dòng)sersync
[root@web sersync]# cd ~
[root@web ~]# sersync2 -o
/usr/local/sersync/confxml.xml -n 12 -d
set the system param
execute:echo50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679> /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -o????? config xml name:?/usr/local/sersync/confxml.xml
option: -n????? thread num is:? 12
option: -d????? run as adaemon
parse xml config file
host ip : localhost????????? host port: 8008
daemon start,sersync run
behind the console
use rsync password-file :
user is???? test
passwordfile is????? /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max
connections=0 Manually
sersync working thread 14? = 1(primary thread) + 1(fail retry thread) +12(daemon sub threads)
Max threads numbers is: 26 =
14(Thread pool nums) + 12(Sub threads)
please according your cpu 郭赐,use -n param
to adjust the cpu rate
run the sersync:
watch path is:/disk1/tools
#從上面啟動(dòng)中看到薪韩,sersync比inotify配置簡(jiǎn)單,按照XML模塊的提示進(jìn)行修改就行了
#只有有些英文基礎(chǔ)的都能看懂每個(gè)XML標(biāo)簽的大概意思。
[root@web ~]# ps -ef |grep sersync|grep -v 'grep'
root? 32552?1? 0 16:50 ??00:00:00 sersync2 -o/usr/local/sersync/confxml.xml -n 12 -d
6.5.測(cè)試
???????? 這個(gè)測(cè)試和inotify測(cè)試一樣俘陷,打開(kāi)rsync客戶(hù)端
cd /disk1/tools/
echo 'this is 76 sersync.txt'>sersync.txt
#查看rsync服務(wù)端(即backup服務(wù)器)是否有sersync.txt文件生成
[root@backup ~]# ll /disk1/backup/76/disk1_tools|grep 'sersync'
-rw-r--r-- 1 rsync rsync?? 23 6月? 29 17:01 sersync.txt
同理:對(duì)文件進(jìn)行刪除操作罗捎,再查看一下rsync服務(wù)端是否也刪除了,對(duì)目錄也進(jìn)行建立拉盾,刪除操作
附錄一桨菜、rsync配置文件rsyncd.conf常用參數(shù)說(shuō)明
?rsync服務(wù)器的配置文件為/etc/rsyncd.conf,其控制認(rèn)證捉偏、訪(fǎng)問(wèn)雷激、日志記錄等等。該文件是由一個(gè)或多個(gè)模塊結(jié)構(gòu)組成告私。一個(gè)模塊定義以方括弧中的模塊名開(kāi)始屎暇,直到下一個(gè)模塊定義開(kāi)始或者文件結(jié)束,模塊中包含格式為name
= value的參數(shù)定義驻粟。
???????? 每個(gè)模塊其實(shí)就對(duì)應(yīng)需要備份的一個(gè)目錄樹(shù)根悼,比方說(shuō)在我們的實(shí)例環(huán)境中,有三個(gè)目錄樹(shù)需要備份:/www/蜀撑、 /home/web_user1/和/home/web_user2/挤巡,那么就需要在配置文件中定義三個(gè)模塊,分別對(duì)應(yīng)三個(gè)目錄樹(shù)酷麦。配置文件是行為單位的矿卑,也就是每個(gè)新行都表示一個(gè)新的注釋、模塊定義或者參數(shù)賦值沃饶。以#開(kāi)始的行表示注釋?zhuān)?\"結(jié)束的行表示下面一行是該行的繼續(xù)母廷。參數(shù)賦值中等號(hào)后可能是一個(gè)大小寫(xiě)不敏感的字符串、一個(gè)以trure/false或者yes/no表示的布爾值糊肤。
參數(shù)說(shuō)明:
附錄二琴昆、inotify相關(guān)命令使用詳解
1.inotifywait使用詳解
inotify-tools命令中,我們使用最多的就是inotifywait命令馆揉。
inotifywait是一個(gè)監(jiān)控等待事件业舍,它主要用于監(jiān)控文件或目錄的變化,并且可以遞歸地監(jiān)控整個(gè)目錄樹(shù)升酣。
#1.inotifywait命令詳解
有關(guān)inotifywait的使用方法舷暮,我們可以通過(guò)它的幫助信息查看。如下:
inotifywait
-h
通過(guò)上圖噩茄,我們可以看到inotifywait參數(shù)很多下面。下面我們就介紹下一些經(jīng)常使用的參數(shù):
-m表示始終保持事件監(jiān)聽(tīng)狀態(tài)。
-r表示遞歸查詢(xún)目錄巢墅。
-q表示打印出監(jiān)控事件诸狭。
--excludei 排除文件或目錄時(shí),不區(qū)分大小寫(xiě)
-t,–timeout超時(shí)時(shí)間
-e通過(guò)此參數(shù)可以指定要監(jiān)控的事件君纫⊙庇觯可監(jiān)聽(tīng)的事件,如下:
access:訪(fǎng)問(wèn)蓄髓,讀取文件叉庐。
modify:修改,文件內(nèi)容被修改会喝。
attrib:屬性陡叠,文件元數(shù)據(jù)被修改。
move:移動(dòng)肢执,對(duì)文件進(jìn)行移動(dòng)操作枉阵。以及重命名,對(duì)文件進(jìn)行重命名预茄。
create:創(chuàng)建兴溜,生成新文件
open:打開(kāi),對(duì)文件進(jìn)行打開(kāi)操作耻陕。
close:關(guān)閉拙徽,對(duì)文件進(jìn)行關(guān)閉操作。
delete:刪除诗宣,文件被刪除膘怕。
--timefmt是指定時(shí)間的輸出格式,用于--format選項(xiàng)中的%T格式召庞。
--format指定文件變化的詳細(xì)信息輸出格式岛心。格式參數(shù)如下:
%w表示發(fā)生事件的目錄
%f表示發(fā)生事件的文件
%e表示發(fā)生的事件
%T使用由--timefmt定義的時(shí)間格式
%Xe事件以“X”分隔
#2.inotifywait命令實(shí)例
上面我們講解了inotifywait命令的參數(shù),下面我們來(lái)實(shí)際使用下inotifywait命令篮灼。
我們要監(jiān)測(cè)/disk1/tools目錄下所有文件及目錄的變化情況鹉梨,命令如下:
inotifywait -mrq --timefmt '%y/%m/%d/%H:%M'--format '%T %w %f %e' -e modify,delete,create,attrib,move,open,close,access /disk1/tools
這條命令表示對(duì)/home目錄下所有文件及目錄的操作進(jìn)行監(jiān)控。
現(xiàn)在我們打開(kāi)另一個(gè)ssh窗口對(duì)/disk1/toolsw目錄進(jìn)行操作穿稳,如下:
cd /disk1/tools/
echo "this is test inotify">t_inotify.txt
mkdir inotify
現(xiàn)在我們來(lái)切換到剛剛執(zhí)行inotifywait命令的窗口存皂,如下:
通過(guò)上圖,我們可以很容易的看到inotifywait已經(jīng)監(jiān)控到我們前面創(chuàng)建的文件以及目錄逢艘。
2.inotifywatch使用詳解
除了inotifywatit命令之外旦袋,inotify-tools還有一個(gè)命令inotifywatch。
inotifywatch主要用于收集被監(jiān)控的文件系統(tǒng)統(tǒng)計(jì)數(shù)據(jù)它改,包括每個(gè)inotify事件發(fā)生多少次等信息疤孕。
#1.inotifywatch命令詳解
inotifywatch使用可以查看其幫助信息,如下:
inotifywatch -h
inotifywatch參數(shù)說(shuō)明如下:
-h:輸出幫助信息央拖。
-v:輸出詳細(xì)信息祭阀。
@:排除不需要監(jiān)視的文件鹉戚,可以是相對(duì)路徑,也可以是絕對(duì)路徑专控。
–-fromfile:從文件讀取需要監(jiān)視的文件或排除的文件抹凳,一個(gè)文件一行,排除的文件以@開(kāi)頭伦腐。
-z:輸出表格的行和列赢底,即使元素為空。
–-exclude:正則匹配需要排除的文件柏蘑,大小寫(xiě)敏感幸冻。
–-excludei:正則匹配需要排除的文件,忽略大小寫(xiě)咳焚。
-r:監(jiān)視一個(gè)目錄下的所有子目錄洽损。
-t:設(shè)置超時(shí)時(shí)間。
-e:只監(jiān)聽(tīng)指定的事件革半。該事件與inotifywait監(jiān)聽(tīng)的事件類(lèi)型一樣趁啸。
-a:以指定事件升序排列。
-d:以指定事件降序排列督惰。
#2.inotifywatch命令實(shí)例
上面我們講解了inotifywatch命令的參數(shù)不傅,下面我們來(lái)實(shí)際使用下inotifywatch命令。
要求統(tǒng)計(jì)60秒內(nèi)/disk1/tool目錄下文件系統(tǒng)的事件赏胚,使用如下命令:
inotifywatch -v -e
modify,delete,create,attrib,move,open,close,access -e modify -t 35 -r
/disk1/tools
現(xiàn)在我們?cè)诹硪粋€(gè)ssh窗口對(duì)/disk1/toolsw目錄進(jìn)行操作访娶,如下:
cd /disk1/tools/
rm -f t_inotify.txt
rm -rf mkdir inotify
現(xiàn)在我們來(lái)切換到剛剛執(zhí)行inotifywatch命令的窗口,靜等35秒會(huì)自動(dòng)結(jié)束觉阅,結(jié)果如下:
通過(guò)上圖崖疤,我們可以很容易的看到inotifywatch已經(jīng)監(jiān)控到我們前面刪除的文件和重命名的目錄文件事件數(shù)量。