Linux文件双向同步
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 root@172.16.149.146:/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
${inotify_home}/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while ead line;
do
/root/bin/unison -batch $src2 ssh://$ip2//$dst2 -servercmd /root/bin/unison
echo -n "$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掉,另一台图片服务器可以负责承载前端读写和终端访问,恢复后自启动脚本,再有增删等操作发生时也可以自动同步,通常不需手动维护。