您的位置:首页 > 其它

unison+inotify两台服务器间双向同步

2016-08-10 20:54 218 查看
     我先说一下业务逻辑需求,公司现在有一台app的服务器A,而我后台是放在另外一台服务器B上的,现在需要A服务器上的图片文件夹picture<--------->和B服务器上的picture图片文件夹数据同步。

     在网上找了很多的百度文档、博客、技术论坛,但没有一篇是比较完整的,所以小编就用了一天的时间去尝试,把遇到的坑的部分都贴出来,我在这里就不说unison 和 inotify怎么安装了,相信大家在看我这篇文章的时候都已经安装过了,如果不会装的话可以去看一下这篇文章,里面有安装的过程,挺简单的,还有双机信任配置,在这里就不一一说了。。。。

.有的人看了很多的教程都会有一个疑惑,究竟在unison的配置文件(default.prf)中写什么,在shell脚本中又写什么?有一些说只要配置default.prf就行,有一些又说写一个unison.sh脚本就行,而小编选择用default.prf来配置一些基本的信息,比如

• -follow xxx 

是否支持对符号连接指向内容的同步

• owner = true (保持同步过来的文件属主)

• group = true (保持同步过来的文件组信息)

• perms = -1   (保持同步过来的文件读写权限)

• repeat = 1   (间隔1秒后,开始新的一次同步检查)

• retry = 3    (失败重试)

• sshargs = -C (使用ssh的压缩传输方式)

• xferbycopying = true

• -immutable xxx 

不变目录,扫描时可以忽略

这些默认的配置信息,可能有人就好奇了,为什么这里没有写远程同步目录和本地同步目录和相关的服务器地址了,因为小编写在了unison.sh目中,
以下是A服务器的执行脚本 unison.sh
#!/bin/bash
talent_ip="192.168.1.1"
local_dir="/home/test1" /本地目录
talent_dir="/home/test2/" /远程同步目录
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $local_dir | while 
read line; do
/usr/local/bin/unison -batch $local_dir ssh://$talent_ip/$talent_dir
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d" " -f1-4` >> /var/log/inotify.log
done

以下是B服务器的执行脚本
unison.sh

#!/bin/bash
talent_ip="192.168.1.2"
local_dir="/home/test1" /本地目录
talent_dir="/home/test2/" /远程同步目录
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $local_dir | while 
read line; do
/usr/local/bin/unison -batch $local_dir ssh://$talent_ip/$talent_dir
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d" " -f1-4` >> /var/log/inotify.log
done

这样子就配置完成了,
然后在A服务器上创建文件夹 testing 启动服务 unison -batch /home/test1
ssh://192.168.1.2//home/test2
在B服务器下查看/home/test2文件夹 发现A服务器创建的文件夹已经同步过去了,但现在问题来了,
1.当我发现在A服务器上创建文件夹能同步到A 但B服务器创建文件夹的时候却不能,当然,你还没在B服务器上面运行脚本进行互相监听.
2.很多人也都也到过这样的问题,我不想每次修改过文件之后 都执行一次sh脚本,于是就在/etc/local上把脚本写进去,开机启动,reboot。。
结果脚本启动不起来,看到网上很多的文章都说 把脚本写到/etc/rc.d/rc.local上面 而不要写在/etc/rc.lcoal上面,但小编想说的是现在linux很多平台
譬如:阿里 新浪 腾讯 云服务器上 linux中的 rc.local都是通过rc.d/rc.local软连接的,所以不管在哪里配置都是一样的,不排除一些不常规的安装系统例子,小编是从代码出发开始看的,首先考虑的是脚本在开机的时候是不是真的不执行脚本 还是一部分脚本程序出错了,所以我把脚本开头的/bin/bash换成了/bin/sh -x 这段代码的意思是当执行这段程序的时候包什么错,改完了之后 reboot,然后去到、var/log/messages查看系统日志
小编发现了原来脚本在开机的时候有启动过,那就证明了脚本开机启动正常,所以有时候不要只看表面的意思
不要以为没气作用就认为没有启动,特别在我们写shell脚本的时候 我们可以在把脚本执行的情况写入到错误日志去查看,那样的话排查起来就很方便了。
 
 系统日志上面写着一句 fatal error linux HOME enivorenemnt viariable (致命错误 家目录的环境变量 不存在
我就用echo
$HOME  echo $PATH 查出了环境变量 发现是 /root 家目录  环境 /root/bin 而 /root下没有bin 所以最后就在脚本的开头加上了两句   export HOME ='/usr/bin'
export PATH ='/usr/bin';就oK了 其实 这里就是一个环境变量的问题 reboot 搞定.....
ps:最后小编想说的是很多网上的方法只是提供一个参考方式 方法 我们在用 在借鉴的时候一定要思考一下 这一定是对的嘛?因为每个人的开发环境和服务器环境都不同。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: