博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unison+inotify数据实时双向同步
阅读量:5090 次
发布时间:2019-06-13

本文共 4760 字,大约阅读时间需要 15 分钟。

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

详细请参考 https://www.cnblogs.com/Sunzz/p/8320330.html

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

1157397-20180120232329240-923871662.png

3、添加脚本

(1)在192.168.5.10服务器node1上添加脚本:

[root@node1 ~]# mkdir /script
[root@node2 ~]# vim /script/inotify.sh
#/bin/bashUNISON=`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 linedo    /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).logdonefi

(2)在192.168.5.20服务器node2上添加脚本:

[root@node2 ~]# mkdir /script
[root@node2 ~]# vim /script/inotify.sh
#/bin/bashUNISON=`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 linedo    /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).logdonefi

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 &

1157397-20180120232343990-363605974.png

重启电脑,测试二台服务器中/opt/http/的内容是否能同步

不重启电脑,手动执行脚本也可以测试

/bin/bash /script/inotify.sh或/script/inotify.sh

在其中一台/opt/http/目录中添加,或修改,或删除文件的时候,可以看到脚本状态,同时另一台服务器也应该会跟随操作。

7、如果需要可以指定某几种后缀的文件不同步

打开/root/.unison/default.prf,添加:

ignore = Name *.txtignore = Name *.mdb

意思就是不同步txt和mdb格式的文件,修改完之后重新执行一下/bin/sh /script/inotify.sh即可生效。

我的是直接指定名称:

ignore = Name .bash_profileignore = Name .viminfoignore = Name .bash_history

以上步骤操作完成基本上都不会有问题,如果有问题那你接着往下看。

8、如果有问题,请手动修改下脚本:

在某些公司中,是禁止禁用root远程登陆,只能使用普通用户进行同步方案

等待同步目录(二台电脑不能使用一样的待同步目录名,否则报错)

192.168.5.10: /opt/http/192.168.5.20: /opt/http/

安装过程如下

useradd –g apache unisonpasswd unison(输入新密码)chown –R unison. /opt/http/mkdir /home/unison/.sshchmod 700  /home/unison/.sshsu – unisonssh-keygen -t rsa(然后连续三次回车)添加密钥到授权密钥文件中

在192.168.5.10服务器node1上操作(22是端口号)

cd /home/unison/.sshssh "-p 22" 192.168.5.10 cat /home/unison/.ssh/id_rsa.pub >> authorized_keys  #小写pssh "-p 22" 192.168.5.20 cat /home/unison /.ssh/id_rsa.pub >> authorized_keysscp  -P 22 authorized_keys 192.168.5.20:/home/unison/.ssh/  #大写Pchmod 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 datessh -p 22 unison@192.168.5.20 datesu - root

node1脚本

#/bin/bashUNISON=`ps -ef |grep -v grep|grep -c inotifywait`if [ ${UNISON} -lt 1 ]thenip2="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 linedo/usr/local/bin/unison -batch -sshargs "-i /home/unison/.ssh/id_rsa" $src2 ssh://$ip2/$dst2echo -n "$line " >> /var/umelook-log/inotify/inotify$(date +%u).logecho ` date +%F %T` >> /var/umelook-log/inotify/inotify$(date +%u).logdonefi

node2脚本:

#/bin/bashUNISON=`ps -ef |grep -v grep|grep -c inotifywait`if [ ${UNISON} -lt 1 ]thenip2="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 linedo/usr/local/bin/unison -batch -sshargs "-i /home/unison/.ssh/id_rsa" $src2 ssh://$ip2/$dst2echo -n "$line " >> /var/umelook-log/inotify/inotify$(date +%u).logecho ` date +%F %T` >> /var/umelook-log/inotify/inotify$(date +%u).logdonefi

转载于:https://www.cnblogs.com/Sunzz/p/8322335.html

你可能感兴趣的文章
Mac系统常用快捷键及技巧
查看>>
28.广搜:被围住的面积
查看>>
jQuery 图片轮播的代码分离
查看>>
疯狂,千人抢“幸福”,引微博万人围观
查看>>
vue中 父子组件的通讯
查看>>
GridView如何实现双击行进行编辑,更新
查看>>
LINUX 命令行编辑快捷键
查看>>
redis持久化RDB与AOF
查看>>
信息化基础建设 开发框架
查看>>
讲给普通人听的分布式数据存储【转载】
查看>>
ASIHTTPRequest是什么?
查看>>
将博客搬至CSDN
查看>>
数据结构:散列函数的构造方法
查看>>
(C++)String的用法
查看>>
MVC 3 HTML 编码
查看>>
Knockout学习之前言
查看>>
php中使用swoole实现头协议
查看>>
Redis全方位讲解--哨兵模式(Sentinel模式)
查看>>
src 和 href 区别(转载)
查看>>
鱼C《零基础入门学习Python》10-17节课时知识点总结
查看>>