阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

unison+inotify实现数据实时双向同步

167次阅读
没有评论

共计 4973 个字符,预计需要花费 13 分钟才能阅读完成。

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 信任

详细请参考 http://www.linuxidc.com/Linux/2018-01/150447.htm

(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'

unison+inotify 实现数据实时双向同步

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 &

unison+inotify 实现数据实时双向同步

重启电脑,测试二台服务器中 /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

CentOS 6.5 rsync+inotify 实现数据实时同步备份 http://www.linuxidc.com/Linux/2016-11/137655.htm

rsync+inotify 实现数据的实时同步 http://www.linuxidc.com/Linux/2017-01/139778.htm

rsync+inotify 实现服务器之间文件实时同步详解  http://www.linuxidc.com/Linux/2016-11/137659.htm

Rsync 结合 Inotify 实时同步配置  http://www.linuxidc.com/Linux/2017-02/140877.htm

RSync 实现数据备份  http://www.linuxidc.com/Linux/2017-06/144913.htm

inotify+rsync 实现数据实时同步  http://www.linuxidc.com/Linux/2017-10/147901.htm

rsync+inotify 实现数据的实时备份  http://www.linuxidc.com/Linux/2016-11/137630.htm

rsync+inotify 实现数据自动同步  http://www.linuxidc.com/Linux/2017-03/141717.htm

使用 rsync 实现数据实时同步备份  http://www.linuxidc.com/Linux/2017-05/143462.htm

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2018-01/150468.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计4973字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中