linux web服務器靜態資源的處理 unison+inotify雙向同步

linux web服務器靜態資源的處理 unison+inotify雙向同步php

http://monkeyzhu.blog.51cto.com/5764358/1324391html

 

簡介java

unison可使兩個本地磁盤目錄保持內容一致,也能夠支持網絡數據同步。在內部實現上,unison使用OCaml語言開發,經過基於rsync算法對兩邊文件進行比較
unison是雙向的,自動更新兩邊沒有衝突的部分,衝突的部分須要人工解決(當兩邊同時對一個文件進行修改的時候),有衝突的部分會顯示出來由用戶選擇更新策略
支持增量同步,每次同步完會記錄文件狀態,下次同步以上次記錄狀態爲起點開始同步
unison有字符界面和GTK+圖形界面
unison提供兩種遠程通訊方式
一、遠程shell,由ssh工具完成,相似於rsync壓縮傳輸協議
二、socket,要求發送tcp包進行通訊,數據傳輸不安全,不建議使用node

 

 

 

1、兩臺機器
192.168.11.11 vm1
192.168.11.12 vm2linux

 

注意:兩邊都要安裝Unison!! c++

 

2、在vm1上編譯安裝Unisongit

Linux下經過源碼包編譯安裝Unison時,須要用到Objective Caml compiler。
經過如下方式安裝github

[root@vm1 ~]# wget http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.1.tar.gz
[root@vm1 ~]# tar -xzvf ocaml-3.12.1.tar.gz
[root@vm1 ~]# cd ocaml-3.12.1
[root@vm1 ~]# more INSTALL
[root@vm1 ocaml-3.12.1]# ./configure
[root@vm1 ocaml-3.12.1]# make world.opt
[root@vm1 ocaml-3.12.1]# make install

 

編譯安裝Unisonweb

[root@vm1 ~]# yum install -y ctags-etags
[root@vm1 ~]# wget http://pkgs.fedoraproject.org/repo/pkgs/unison240/unison-2.40.128.tar.gz/md5/aa4d9d425b2ee2f9676ac5331a154bac/unison-2.40.128.tar.gz
[root@vm1 ~]# tar -xzvf unison-2.40.128.tar.gz 
[root@vm1 ~]# cd unison-2.40.128
[root@vm1 unison-2.40.63]# make UISTYLE=text THREADS=true
[root@vm1 unison-2.40.63]# make install
[root@vm1 unison-2.40.63]# cp unison /usr/local/bin/
[root@vm1 unison-2.40.63]# scp unison  root@192.168.11.12:/usr/local/bin/  #將可執行文件unison上傳到遠程主機192.168.11.12

make install出現錯誤的緣由在與Unison默認是將文件Copy到/當前用戶/bin目錄下,但Linux默認是沒有該目錄的,所以咱們須要將生成的可執行文件unison複製到系統的PATH目錄。算法

make install的時候會出錯,默認會在當前目錄下生成可執行文件unison,將其複製到系統的PATH目錄

 

 

3、配置ssh key信任

自查

 

 

4、生成unison目錄和文件

將本機的目錄/data/和遠端主機的/data/進行同步。通常的,須要兩臺機能ssh鏈接。
注意:在主機和目錄間又多加了一個 "/"

兩邊都建立/data目錄
mkdir /data

修改兩臺服務器的unison配置文件,輸入如下內容
[unison@vm1 ~]$ vi /root/.unison/default.prf

root = /tmp/123
root = ssh://root@192.168.14.91//tmp/123
#path = www
#ignore = Path wp-content/tmp
ignore = Path wp-config.php  #忽略wp-config.php文件 至關於rsync的exclude
#nodeletion = /data
batch = true
maxthreads = 300
#repeat = 1
owner = true
group = true
perms = -1
fastcheck = false
sshargs = -C
xferbycopying = true
log = true
logfile = /tmp/unison.log


[root@steven 123]# ll
total 8
-rw-r--r-- 1 root root 3 Feb 11 11:44 232.txt
-rw-r--r-- 1 root root 3 Feb 11 11:44 wp-config.php

 

運行unison
[root@steven ~]# unison

 

而後就是測試工做了:

[root@vm2 ~]# cd /data/ ;echo 23323 >33.txt ; unison
[root@vm1 ~]# cd /data/; echo defd >22.txt ; unison


注意
一、若是要保持文件的源權限,須要使用能夠chown的用戶來同步,通常使用root用戶來同步。
二、可能出現的問題是在unison同步的時候 ,若是提示輸入密碼,須要作ssh互信關係
三、若是是權限不對,注意用戶的權限,還有是 lock文件 能夠刪除.unison/ara1da075598bd182a68b3563be920002b相似文件,再從新執行unison

# ls -lh
總用量 464K
-rw------- 1 root root 458K 2月   4 06:51 ar08f197646847353b45eb96cb656aedee
-rw------- 1 root root  263 2月   4 06:10 default.prf

 

 

5、安裝Inotify-tools工具,實時觸發unison進行同步
ll /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches
備註:Linux下支持inotify的內核最小爲2.6.13,能夠輸入命令:uname -a查看內核

安裝inotify-tools

yum install make gcc gcc-c++
wget -c http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
cd /download
tar zxvf inotify-tools-3.14.tar.gz 
cd inotify-tools-3.14 
./configure --prefix=/usr/local/inotify 
make 
make install

 


設置系統環境變量,添加軟鏈接

echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh 
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include /usr/include/inotify

 

vi /etc/sysctl.conf #添加如下代碼
fs.inotify.max_user_instances=65535


建立腳本,實時觸發rsync進行同步
vi /root/unison.sh

# use tools(linux inotify,unison)
# author:steven 2016-1-3
#!/bin/sh

srcdir=/data
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib,move $srcdir | while read file
do
unison 
echo " ${file} was rsynced" >> /tmp/unison.log 2>&1
done

 

 

設置腳本開機自動執行
vi /etc/rc.d/rc.local

/bin/sh /root/unison.sh &

 

 

 

注意:上面實驗只是在vm1上安裝inotify和配置unison配置文件,若是須要兩邊都inotify觸發,那麼須要vm2上也要配置default.prf和安裝inotify

 

unison的弊端:沒有rsync那樣只同步新建立或者修改的文件,不一樣步被刪除的文件(-nodeletion選項),unison會同步被刪除的文件,A機器刪除了1.txt文件,也會刪除B機器上1.txt文件

保持徹底同步

 

-nodeletion
nodeletion= /data/
unison
Fatal error: /data (given as argument to 'nodeletion' preference)
is not one of the current roots:
  /data/
  ssh://root@192.168.1.22//data/

-nodeletion無用,必定要是子目錄才行,好比nodeletion= /data/tmp

 

 


文件同步工具Unison使用介紹 南非螞蟻

http://ixdba.blog.51cto.com/2895551/526431

 

三種方式調用

第一種方式

unison profilename [options]

默認讀取~/.unison 目錄下的配置文件 profilename.prf

須要在配置文件profile裏指定同步路徑和同步參數

 

第二種方式

unison profile  root1 root2 [options]

root1 root2分別表示要同步的兩個路徑,若是是遠程路徑:ssh://username@remotehost//tmp/ixdab/files

這種方式不須要在profile.prf文件裏指定root指令同步路徑

 

第三種方式

unison root1 root2 [options]

這種方式至關於unison default root1 root2 [options],即讀取default.prf

 

 

 

unison的使用

Unison能夠在一臺主機上使用,同步兩個文件夾,也能夠在網絡上是用。
1:本地使用
使用方法:

#unison 111 222      #同步本地的111和222文件夾


Contacting server...
Looking for changes
Warning: No archive files were found for these roots. This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.
Update detection may take a while on this run if the replicas are
large.
Unison will assume that the 'last synchronized state' of both replicas
was completely empty. This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.
Press return to continue.[<spc>] Reconciling changes
111 222
<---- file aaaaaaaaaaaaa [f] ?
Commands:
<ret> or f or <spc> follow unison's recommendation (if any)
I ignore this path permanently
E permanently ignore files with this extension
N permanently ignore paths ending with this name
m merge the versions
d show differences
x show details
l list all suggested changes
p or b go back to previous item
g proceed immediately to propagating changes
q exit unison without propagating any changes
/ skip
> or . propagate from left to right
< or , propagate from right to left

<---- file aaaaaaaaaaaaa [f] f

Proceed with propagating updates? [] y
Propagating updates

UNISON started propagating changes at 15:06:08 on 27 Aug 2007
[BGN] Copying aaaaaaaaaaaaa
from /222
to /111
[END] Copying aaaaaaaaaaaaa
UNISON finished propagating changes at 15:06:08 on 27 Aug 2007
Saving synchronizer state
Synchronization complete (1 item transferred, 0 skipped, 0 failures)
若是檢測到兩個文件夾有所不一樣,unison會提示,讓你選擇相應的操做。如上例所示.
表示右邊222的文件夾有新的文件,是否同步到左邊的111文件夾,f表示force,而後將確認,進行更新,若是輸入?會有更詳細的介紹。


2: unison遠程使用
使用方法:

# unison <本地目錄> ssh://remotehostname(IP)/<遠程目錄的絕對路徑>


# unison /home/AAA ssh://username@remotehostname(ip)//DB/path/BBB
表示將本機的目錄/home/AAA和遠端主機的/DB/path/BBB進行同步。通常的,須要兩臺機能ssh鏈接。
注意 在主機和目錄間又多加了一個 "/"


unison參數說明
Unison有不少參數,這裏只介紹常用的幾個,詳細的請參看unison手冊:


1." -testserver
測試連通性,鏈接到服務器即退出。示例:
$ unison / ssh://opensou1@bluehost/ -servercmd=~/bin/unison -testserver
若是服務器端 unison 可執行文件不在默認目錄下,甚至沒有 unison 命令(須要你編譯一個上傳到服務器),則須要使用 -servercmd 參數告訴要執行的服務器 unison 命令位置。
使用 -testserver 參數,則成功連接即退出,也不會去執行目錄的比較等後續操做。


2." -servercmd xxx
告訴 unison, 服務器端的 unison 命令是什麼。參見上面的示例。


3." -auto
接受缺省的動做,而後等待用戶確認是否執行。


4." -batch
batch mode, 全自動模式,接受缺省動做,並執行,無需人爲干預。

 

5." -ignore xxx
同步時能夠忽略的目錄和路徑,增長 xxx 到忽略列表中


6." -ignorecase [true|false|default]
是否忽略文件名大小寫


7." -follow xxx
是否支持對符號鏈接指向內容的同步,會把軟連接指向內容進行同步

8." -immutable xxx
指定不變化的目錄,掃描時能夠忽略該目錄,不一樣步該目錄


9." -path xxx 參數
只同步 -path 參數指定的子目錄以及文件,而非整個目錄。-path 在配置中能夠屢次出現,例如
unison /home/username ssh://remotehost//home/username \
-path shared \
-path pub \
-path .netscape/bookmarks.html

 

10.其餘參數

owner = true (保持同步過來的文件屬主)
group = true (保持同步過來的文件組信息)
perms = -1 (保持同步過來的文件讀寫權限)
repeat = 1 (間隔1秒後,開始新的一次同步檢查)
retry = 3 (失敗重試)
sshargs = -C (使用ssh的壓縮傳輸方式)
xferbycopying = true  (這個是優化參數,默認true)
silent  (安靜模式 除了錯誤,不打印任何信息)
times  (同步修改時間 同步mtime)
maxthreads n  (指定文件同步的最大線程數)
rsync  (默認是true,激活rsync傳輸模式)
log    (記錄unison運行日誌,默認true)
logfile   (日誌輸出到文件)

 


經過配置文件來使用unison
儘管能夠徹底經過命令行的方式來指定unison運行所須要的參數,但咱們仍是推薦使用配置文件來進行配置使用unison

緣由很簡單,看配置文件比看命令行容易理解,並且可管理性更強。


默認的配置文件夾位於~currentuser/.unison,即當前用戶的home目錄下,windows則位於C:\Documents and Settings\currentuser\.unison

默認的配置文件名是default.prf

Archive文件也能夠有多個,這個文件記錄每次完成同步後每一個文件的狀態,能夠在下次更新動做中更快判斷文件是否應該更新,減小掃描時間。

 


運行這樣的命令:
#unison exitgogo
Unison將默認讀取~currentuser/.unison/exitgogo.prf文件裏的配置信息.個人配置信息在/root/.unison/exitgogo.prf

所以咱們能夠根據上面參數的介紹,把全部的參數配置信息寫入到一個.prf的文件中.
下面是個人一個web應用中兩個文件夾同步的配置信息:
root = /sina/webdata
root = ssh://root@192.168.60.121//sina/webdata
#force =/sina/webdata
ignore = Path as/*
#prefer = ssh://root@192.168.60.121//sina/webdata
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck=false
rsync =false
#debug=verbose
sshargs = -C
xferbycopying = true
log = true
logfile = /root/.unison/sina_122.1547.log
說明以下:
兩個root表示須要同步的文件夾
force表示以本地的/var/www/bbsnew文件夾爲標準,將該目錄同步到遠端。注意,若是指定了force參數,那麼unison就變成了單項同步了,也就是說會以force指定的文件夾爲準進行同步.
Unison自己是能夠雙向同步的,可是要作到雙向同步,就不要設置force參數,若是設置了force參數,就成了單項同步了,此時unison相似與sync.
Unison雙向同步基本原理是:假若有A B兩個文件夾,A文件夾把本身的改動同步到B,B文件夾也把本身的改動同步到A,最後A B兩文件夾的內容相同,是 A B文件夾的合集.
Unison雙向同步的一個缺點是,對於一個文件在兩個同步文件夾中都被修改時,unison是不會去同步的,由於unison沒法判斷以那個爲準.
ignore = Path表示忽略/sina/webdata下面的WEB-INF/tmp目錄,即同步時不一樣步它。
batch = true,表示全自動模式,接受缺省動做,並執行
-fastcheck true表示同步時使用文件的建立時間來比較兩地文件,若是這個選項爲false,unison則將比較兩地文件的內容.建議設置爲true
log = true表示在終端輸出運行信息。
logfile則指定了同時將輸出寫入log文件。

 

unison FAQ

如何在和遠程服務器同步大量數據,上傳一部分數據後,超時:
9% 559:15 ETARead from remote host bluehost: Connection reset by peer
Fatal error: Lost connection with the server
實際操做中,最好的方法是,第一次先把要上傳的文件打成包,用 ftp 上傳,而後展開到服務器,以後執行一次 unison 同步便可。

 


  

yum install -y ctags-etags

Linux就這個範兒 P268

查找函數定義須要tags文件幫忙,它是由ctags程序產生的一個索引文件。鄭重聲明:ctags和cscope是成就vim IDE的兩個法寶

ctags -R

 

網上多篇文章都會出現沒有安裝ctags-etags的錯誤,估計ctags-etags是用來生成一個文件索引文件,發現差別查找這個索引文件
出現錯誤:
which: no etags in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/latest/bin:/usr/local/tomcat/bin:/root/bin)

/bin/sh: line 1: etags:command not found

make[1]: [tags] Error 127(ignored)

make[1]: Leavingdirectory `/unison/unison-2.48.3′

解決辦法:

# yum install ctags-etags


(make UISTYLE=text 報錯時,須要建立/root/bin/文件夾後再運行make install。mkdir /root/bin/;make install;cp unison /root/bin/;cp unison /usr/local/bin/

報etags錯誤能夠忽略或者安裝etags:yum -y install ctags-etags)

 

在執行 make UISTYLE=text是可能會出現如下報錯。是由於沒有etags命令
可使用 yum install ctags-etags解決。

 

 

F

相關文章
相關標籤/搜索