unison+inotify实现文件双向同步

1、方案选择
  在网上搜寻了很多方案,在liux下做文件同步,有如下几种方式:
  1、nfs实现web数据共享;
  2、rsync +inotify实现web数据同步;
  3、rsync+sersync更快更节约资源实现web数据同步;
  4、unison+inotify实现web数据双向同步;
  在这里详细介绍第四种方案,前几种都有些各自的不足。只有第四种方案支持双向实时同步,且当其中一台服务器宕机,也不会影响web的访问。(ps:其实nfs配置非常简单实用,但是其有个致命的缺点就是其中一台web服务挂掉之后,会直接导致web页面无法访问)。

2、环境需求分析
  现在有两台图片服务器用keepalive做主备,暂叫做img1(主)、img2(备),img1的图片存储目录平时会频繁读写而且通过nginx提供图片访问服务,但如果img1在特殊情况下无法连接或访问了,需要img2服务器提供前端读写和后端访问的能力,且在img1恢复后能将这期间存储在img2上的图片同步到img1。
  Unison+inotify可以完美满足这个需求。
  Unison是windows和unix平台下都可以使用的双向文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致。 unison 拥有其它一些同步工具或文件系统 的相同特性,但也有自己的特点:
  1、跨平台使用;
  2、对内核和用户 权限 没有特别要求;
  3、Unison 是双向的,它能自动   处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;
  只要是能连通的两台主机 ,就可以运行 unison ,可以直接使用 socket 连接或安全的 ssh 连接方式,对带宽 的要求不高,使用类似 rsync 的压缩传输协议。
  Unison双向同步的一个缺点是,对于同名文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。
  Inotify是一个Linux内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。
  因为当前两台图片服务器用作主备,不会出现同时修改的问题,而且图片一般很小,unison在小文件同步时特别快。所以Unison+Inotify可以完美满足当前需求。

3、详细部署
3.1部署环境
主机名 主机IP地址 系统版本 系统内核版本
Img1 172.16.149.145 CentOS release 6.3 (Final) 2.6.32-358.el6.x86_64
Img2 172.16.149.146 CentOS release 6.3 (Final) 2.6.32-358.el6.x86_64
3.2软件部署
  1、保证两台服务器之间可以通过ssh无密码访问,操作如下(以root用户为例):
  Img1上执行(任意目录):

ssh-keygen -t rsa -P ''
  按回车键
  -P '' 就表示空密码,一次回车后,在root目录下生成.ssh目录,.ssh下有id_rsa和id_rsa.pub。 把Img1上面的id_rsa.pub远程拷贝到Img2上面

scp ~/.ssh/id_rsa.pub [email protected]:/root/id_rsa.pub
  输入密码后,拷贝id_rsa.pub到img2上;

Img2上执行:

cd /root/
cat id_rsa.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
  把img1上复制的id_rsa.pub添加到.ssh/authorzied_keys文件里,赋予600权限。 这时img1就可以不输入密码ssh登录img2; 同样的步骤在img2上执行,使img2可以免密ssh登录img1。

2、安装ocaml:
  使用xftp上传软件ocaml-3.12.1.tar.gz至home下(img1和img2进行相同操作)

cd /home
tar -zxvf ocaml-3.12.1.tar.gz
cd ocaml-3.12.1
./configure
make world opt
make install
  执行ocaml -version测试是否安装成功:

ocaml -version
  出现The Objective Caml toplevel, version 3.12.1 表示安装成功。

3、安装unison:(img1和img2进行相同操作)
  安装之前要安装ctags、ctags-etags的rpm支持,将ctags-5.8-2.el6.x86_64.rpm、ctags-etags-5.8-2.el6.x86_64.rpm、unison-2.48.4.tar.gz用xftp上传到home目录下。

cd /home
rpm -ivh ctags-5.8-2.el6.x86_64.rpm
rpm -ivh ctags-etags-5.8-2.el6.x86_64.rpm
tar -zxvf unison-2.48.4.tar.gz
cd src
make UISTYLE=text
mkdir /root/bin
cp unison /root/bin/
make install
  执行unison -version查看unison是否安装成功。

unison -version
  出现unison version 2.48.4表示安装成功

4、安装inotify (img1和img2进行相同操作)
  将inotify-tools-3.14.tar.gz用xftp上传至home目录

cd /home
tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify-3.14
make && make install
  5、编写脚本(img1和img2进行相同操作)

cd /home
vim inotify.sh
  将下面的脚本内容复制到inotify.sh(按实际环境修改标红的配置项),img1上的ip2为img2的实际ip,img2上的ip2位img1的实际ip。src2为需要同步的源目录,dst2为需要同步的目标目录

/bin/bash

ip2="172.16.149.146"
src2="/home/image/"
dst2="/home/image/"
inotify_home=/usr/local/inotify-3.14
src2 | while ead line;
do
/root/bin/unison -batch ip2//line " >> /var/log/inotify.log
echo date | cut -d " " -f1-4 >> /var/log/inotify.log
done
  2、3、4、5步骤需要在img2上执行一次,只需要改动脚本inotify.sh第二行的ip为172.16.149.145。 6、执行脚本 因为服务器运行时需实时运行脚本,故将脚本加入后台运行。两台服务器都要执行。

chmod +x inotify.sh
nohup ./inotify.sh &
  回车
  后台服务可以通过ps -ef |grep inotify查询进程号杀死进程来取消执行脚本。 最后将上面的命令加入开机启动项。

vim /etc/rc.local
  添加 nohup /home/inotify.sh & 保存
  以上操作完毕就可以保证img1、img2服务器的/home/image目录实时同步了,在两台中任意一台创建、修改、删除、移动文件都会触发同步操作,如果一台服务器down掉,另一台图片服务器可以负责承载前端读写和终端访问,恢复后自启动脚本,再有增删等操作发生时也可以自动同步,通常不需手动维护。

你可能感兴趣的:(unison+inotify实现文件双向同步)