利用Unison实现双向同步镜像
一. Unison简介
Unison是Windows、Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致。Unison拥有与其它一些同步工具或文件系统的相同的特性,但也有自身的特点:
1.跨平台使用;
2.对内核和用户权限没有特别要求;
3.Unison是双向的,它能自动处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;
4.只要是能连通的两台主机,就可以运行unison,可以直接使用socket连接或安全的ssh连接方式,对带宽的要求不高,使用类似rsync的压缩传输协议。
二. 编译安装Unison
1.实验环境:
node0 192.168.32.30 同步目录 /var/www/html
node1 192.168.32.31 同步目录 /var/www/html
2.安装Objective Caml compiler
Linux下通过源码包编译安装Unison时,需要用到Objective Caml compiler。
[root@node0 ~]# wget http://caml.inria.fr/pub/distrib/ocaml-3.10/ocaml-3.10.2.tar.gz
[root@node0 ~]# tar -xzvf ocaml-3.10.2.tar.gz
[root@node0 ~]# cd ocaml-3.10.2
[root@node0 ocaml-3.10.2]# ./configure
[root@node0 ocaml-3.10.2]# make world opt
[root@node0 ocaml-3.10.2]# make install
3、编译安装Unison
[root@node0 ~]# wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/unison-2.32.52/unison-2.32.52.tar.gz
[root@node0 ~]# tar -xzvf unison-2.32.52.tar.gz
[root@node0 ~]# cd unison-2.32.52
[root@node0 unison-2.32.52]# make UISTYLE=text THREADS=true STATIC=true
#UISTYLE=text THREADS=true STATIC=true 表示:使用命令方式,加入线程支持,以静态模式编译
[root@node0 unison-2.32.52]# make install
#在执行make install的过程中,可能会出现以下错误提示:
mv: cannot stat '/root/bin//unison': No such file or directory
make: [doinstall] Error 1 (ignored)
cp unison /root/bin/
cp: cannot create regular file '/root/bin/': Is a directory
make: *** [doinstall] Error 1
#出现错误的原因在与Unison默认是将文件Copy到/root/bin目录,但Linux默认是没有该目录的,因此我们需要将生成的可执行文件unison复制到系统的PATH目录。
[root@node0 unison-2.40.63]# cp unison /usr/local/bin
#将生成的可执行文件unison复制到系统的PATH目录。
[root@node0 unison-2.40.63]# scp unison root@192.168.32.31:/usr/local/bin/unison
#将可执行文件unison上传到远程主机(假设远程主机IP为192.168.32.31)的/usr/local/bin目录下
三. 配置ssh key信任
1.在node0上创建key并配置node1的信任
[unison@node0 ~]$ ssh-keygen -t rsa
#在提示保存私钥(key)和公钥(public key)的位置时,使用默认值;
#在提示是否需要私钥密码(passphrase)时,直接敲回车,即不使用私钥密码。
#之后,将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在/root/.ssh/目录下。
[unison@node0 ~]$ssh node1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#将文件上传到node1,并将公钥添加到node1的 authorized_keys 文件中
2.同理,执行以下步骤在node1上创建key并配置node0的信任
[unison@node1 ~]$ ssh-keygen -t rsa
[unison@node1 ~]$ssh node0 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
四. Unison的三种调用方式
1. 方式一:unison profile_name [options]"
unison默认会读取~/.unison目录下的配置文件profile_name.prf.
这种方式下,配置文件中必须指定要进行文件同步的路径和相关参数如:
[root@node0 .unison]# vim ~/.unison/default.prf
# Unison preferences file
root = /var/www/html
root = ssh://root@node1//var/www/html
batch = true
2. 方式二:unison profile root1 root2 [options]
root1、root2分别表示要同步的两个路径,命令中已经指定路径,配置文件中无需再指定,如:
[root@node0 .unison]# touch www.prf
[root@node0 .unison]# unison www.prf /var/www/html ssh://node1//var/www/html
#配置文件内容为空,表示所有其他参数均为默认
#出现提示确认,则直接敲回车选择默认值
3. 方式三:unison root1 root2 [options]
这种方式和方式二一样,相当于执行"unison default root1 root2"命令,即unison默认读取~/.unison/default.prf的配置,如:
[root@node0 .unison]# unison /var/www/html ssh://node1//var/www/html
五. Unison的配置与使用
1. 修改两台服务器的unison配置文件(基本相同),输入以下内容
[root@node0 ~]# vim .unison/default.prf
# Unison preferences file
root = /var/www/html
root = ssh://root@node1//var/www/html
#force =/sina/webdata
ignore = Path as/*
#prefer = ssh://root@node1hb//var/www/html
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck=false
rsync =false
#debug=verbose
sshargs = -C
xferbycopying = true
confirmbigdel = false
log = true
logfile = /var/log/unison.log
2.相关参数说明
特别注意:在远程使用unison时,在远程主机和目录之间要多加一个"/"
force 表示会以本地所指定文件夹为标准,将该目录同步到远端。这里需要注意,如果指定了force参数,那么Unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步,类似与rsync。
Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集。
Unison双向同步的一个缺点是:对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。
testserver 该参数用来测试连通性,连接到服务器后退出,并不进行实际的同步
servercmd 指定服务器端的unison命令路径
ignore = Path 表示忽略指定目录,即同步时不同步它。
batch = true 表示全自动模式,接受缺省动作,并执行。
-fastcheck true 表示同步时仅通过文件的创建时间来比较,如果选项为false,Unison则将比较两地文件的内容。
log = true 表示在终端输出运行信息。
logfile 指定输出的log文件。
另外,Unison有很多参数,这里仅介绍常用的几个,详细的请参看Unison手册。
-auto 接受缺省的动作,然后等待用户确认是否执行。
-batch batch mode, 全自动模式,接受缺省动作,并执行。
-ignore xxx 增加 xxx 到忽略列表中
-ignorecase [true|false|default] 是否忽略文件名大小写
-follow xxx 是否支持对符号连接指向内容的同步
owner = true 保持同步过来的文件属主
group = true 保持同步过来的文件组信息
perms = -1 保持同步过来的文件读写权限
repeat = 1 间隔1秒后,开始新的一次同步检查
retry = 3 失败重试次数
sshargs = -C 使用ssh的压缩传输方式
xferbycopying 优化参数,默认true
-immutable xxx 不变目录,扫描时可以忽略
-silent 安静模式,除了错误,不打印任何信息
-times 同步修改时间
-path xxx 只同步 -path 参数指定的子目录以及文件,而非整个目录,-path 可以多次出现。
#Windows下的unison配置文件默认位于C:\Documents and Settings\currentuser\.unison目录,默认的配置文件名是default.prf。
六. 测试
首先分别在node0与node1的/var/www/html目录下创建文件或目录,然后在node0上执行unison,接着如果在node0与node1上都能看到各自创建的文件,就说明同步成功。
分别在node0与node1上创建文件
[unison@node0 ~]$ cd /var/www/html
[unison@node0 html]$ touch index1.html index3.html
[unison@node1 ~]$ cd /var/www/html
[unison@node1 html]$ touch index2.html index4.html
在node0上执行unison
[unison@node0 html]$ unison
在node0与node1上查看文件是否同步
[unison@node0 html]$ ls
index1.html index2.html index3.html index4.html
[unison@node1 html]$ls
index1.html index2.html index3.html index4.html
均看到了“index1.html index2.html index3.html index4.html”所有文件,说明文件同步已经成功!
七. 定期或实时执行同步
1. 如果想要定期执行,则通过crontab计划任务来实现,例如通过以下方式设置每5分钟执行一次
[unison@node0 ~]$ crontab -e
*/5 * * * * /usr/local/bin/unison
#备注:如果ssh端口不是默认的,只需要在default.prf配置文件里面,把sshargs改为sshargs= -p ssh端口,就可以啦!
2.如果想实时同步,可配合inotify使用。
本文转自netsword 51CTO博客,原文链接:http://blog.51cto.com/netsword/779162