unison是一款跨windows/linux/MAC OS平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSH、RSH和Socket等网络协议进行同步。更棒的是,unison支持双向同步操作,你既可以从A同步到B,也可以从B同步到A,这些都不需要额外的设定。
inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。您还可以跟踪活动的源头和目标等细节。
使用
inotify很简单:创建一个文件描述符,附加一个或多个监视器(一个监视器 是一个路径和一组事件),然后使用 read 方法从描述符获取事件。read 并不会用光整个周期,它在事件发生之前是被阻塞的。
环境介绍
服务器分别为:
服务器
node1:192.168.5.10,同步目录:
/opt/http/
服务器
node2:192.168.5.20,同步目录:
/opt/http/
配置epel源
wget -O
/etc/yum.repos.d
/epel.repo http://mirrors.aliyun.com/repo/epel
-7.repo
1、在node1和 node2上安装一下软件
(1)安装ocaml
[root@node1 ~]
# yum install ocaml -y
(2)安装unison
[root@node1 ~]#
yum install unison240.x86_64 -y
(3)安装inotify
[root@node1 ~]#
yum install inotify-tools.x86_64 -y
2、配置双机ssh信任
详细请参考
(1)在node1机root用户下执行ssh-keygen命令,在需要输入的地方,直接回车,生成建立安全信任关系的证书。
[root@node1 ~]
# ssh-keygen -t rsa
node1对node2建立信任关系
[root@node1 ~]
# chmod 600 /root/.ssh/authorized_keys
[root@node1 ~]
# scp -r /root/.ssh/id_rsa.pub 192.168.5.20:/root/.ssh/authorized_keys
(2)node2对node1建立信任关系
在node2机上执行同样的操作,建立node2对node1的信任关系。
(3)远程执行命令测试是否成功,第一次有可能要输入密码
命令格式:ssh
远程用户名@远程主机IP地址 '远程命令或者脚本'
[root@node2 ~]#
ssh root@
192.168.5.10 'hostname'

3、添加脚本
(1)在192.168.5.10服务器node1上添加脚本:
[root@node1 ~]
# mkdir /script
[root@node2 ~]
# vim /script/inotify.sh
#/bin/bash
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [
${UNISON} -lt 1 ]
then
ip2=
"192.168.5.20" ##目标主机IP
src2=
"/opt/http/"
dst2=
"/opt/http/"
/usr/bin/inotifywait -mrq
-e create,delete,modify,move
$src2 |
while read line
do
/usr/bin/unison -batch
$src2 ssh://
$ip2/
$dst2
echo -n
"$line " >> /var/
log/inotify/inotify$(date +%u).log
echo ` date +%F %T
" " -f1-4` >> /var/
log/inotify/inotify$(date +%u).log
done
fi
(2)在192.168.5.20服务器node2上添加脚本:
[root@node2 ~]
# mkdir /script
[root@node2 ~]
# vim /script/inotify.sh
#/bin/bash
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [
${UNISON} -lt 1 ]
then
ip2=
"192.168.5.10"
src2=
"/opt/http/"
dst2=
"/opt/http/"
/usr/bin/inotifywait -mrq
-e create,delete,modify,move
$src2 |
while read line
do
/usr/bin/unison -batch
$src2 ssh://
$ip2/
$dst2
echo -n
"$line " >> /var/
log/inotify/inotify$(date +%u).log
echo ` date +%F %T
" " -f1-4` >> /var/
log/inotify/inotify$(date +%u).log
done
fi
4、在二台服务器上修改脚本权限:
[root@node1 ~]
# chmod a+x /script/inotify.sh
5、建立日志目录
如果/var/log/inotify目录没有则需要手工创建,用来存放inotify的日志;
[root@node2 ~]
# mkdir /var/log/inotify
6、添加定时任务
[root@node2 ~]
# crontab -e
* * * * *
/bin/bash
/script/inotify.sh >
/dev/null
2>
&1 &

重启电脑,测试二台服务器中/opt/http/的内容是否能同步
不重启电脑,手动执行脚本也可以测试
/bin/bash /script/inotify.sh或/script/inotify.sh
在其中一台/opt/http/目录中添加,或修改,或删除文件的时候,可以看到脚本状态,同时另一台服务器也应该会跟随操作。
7、如果需要可以指定某几种后缀的文件不同步
打开/root/.unison/default.prf,添加:
ignore = Name *.txt
ignore = Name *.mdb
意思就是不同步txt和mdb格式的文件,修改完之后重新执行一下/bin/sh /script/inotify.sh即可生效。
我的是直接指定名称:
ignore = Name .bash_profile
ignore = Name .viminfo
ignore = Name .bash_history
以上步骤操作完成基本上都不会有问题,如果有问题那你接着往下看。
8、如果有问题,请手动修改下脚本:
在某些公司中,是禁止禁用root远程登陆,只能使用普通用户进行同步方案
等待同步目录(二台电脑不能使用一样的待同步目录名,否则报错)
192.168.5.10:
/opt/http/
192.168.5.20:
/opt/http/
安装过程如下
useradd –g apache unison
passwd unison
(输入新密码)
chown –R unison. /opt/http/
mkdir /home/unison/.ssh
chmod 700 /home/unison/.ssh
su – unison
ssh-keygen -t rsa
(然后连续三次回车)
添加密钥到授权密钥文件中
在192.168.5.10服务器node1上操作(22是端口号)
cd /home/unison/.ssh
ssh
"-p 22" 192.168.
5.10 cat /home/unison/.ssh/id_rsa.pub
>> authorized_keys
#小写p
ssh
"-p 22" 192.168.
5.20 cat /home/unison /.ssh/id_rsa.pub
>> authorized_keys
scp -P
22 authorized_keys
192.168.
5.20:/home/unison/.ssh/
#大写P
chmod
600 /home/unison/.ssh/authorized_keys
在192.168.5.20服务器B上操作
chmod
600 /home/unison
/.ssh/authorized_keys
分别在两台机器上执行如下测试(第一次执行时,会要求输入密码,以后执行则不需要说明信任成功)
ssh -p
22 unison@
192.168.5.10 date
ssh -p
22 unison@
192.168.5.20 date
su - root
node1脚本
#/bin/bash
UNISON=
`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -
lt 1 ]
then
ip2=
"unison@192.168.5.20:22"
src2=
"/opt/http/"
dst2=
"/opt/http/"
/usr/
local/bin/inotifywait -mrq -e create,
delete,modify,move $src2 |
while read line
do
/usr/
local/bin/unison -batch -sshargs
"-i /home/unison/.ssh/id_rsa" $src2 ssh:
//$ip2
/$dst2
echo -n
"$line " >>
/var/umelook-
log/inotify/inotify$(date +%u).
log
echo
` date +%F %T` >>
/var/umelook-
log/inotify/inotify$(date +%u).
log
done
fi
node2脚本:
#/bin/bash
UNISON=
`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -
lt 1 ]
then
ip2=
"unison@192.168.5.10:22"
src2=
"/opt/http/"
dst2=
"/opt/http/"
/usr/
local/bin/inotifywait -mrq -e create,
delete,modify,move $src2 |
while read line
do
/usr/
local/bin/unison -batch -sshargs
"-i /home/unison/.ssh/id_rsa" $src2 ssh:
//$ip2
/$dst2
echo -n
"$line " >>
/var/umelook-
log/inotify/inotify$(date +%u).
log
echo
` date +%F %T` >>
/var/umelook-
log/inotify/inotify$(date +%u).
log
done
fi