linux服务器之间的文件同步(双向同步unison+inotify)

在日常的运维工作中,需要保证文件的高可用性,以防单点带来的文件丢失。 根据场景不同,一般会有单向和双向同步两种方式。
1、双向同步:unison+inotify 用于启动切换的场景
2、单向同步:rsync+inotify  用于手工恢复的场景
大多数情况下,都用单向同步即可,如果有问题的话,运维认为手工恢复即可; 如果对恢复的实时性要求不叫高的话,可以用双向同步,出问题的时候,让系统自动切换先用起来,然后再人工维护,不影响正常使用。
我们来演示一下双向同步环境的搭建和配置。

1 Unison简介

Unison是Windows、Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致。Unison拥有与其它一些同步工具或文件系统的相同的特性,但也有自身的特点:
a.跨平台使用;
b.对内核和用户权限没有特别要求;
c.Unison是双向的,它能自动处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;
d.只要是能连通的两台主机,就可以运行unison,可以直接使用socket连接或安全的ssh连接方式,对带宽的要求不高,使用类似rsync的压缩传输协议。

示例环境:两台centos7的环境
vm1 192.168.1.110
vm2 192.168.1.111


2、编译并安装Unison

Linux下通过源码包编译安装Unison时,需要用到Objective Caml compiler。

2.1 编译和安装ocaml

[root@vm1 ~]# wget http://caml.inria.fr/pub/distrib/ocaml-4.02/ocaml-4.02.0.tar.gz 
[root@vm1 ~]# tar -xzvf ocaml-4.02.0.tar.gz
[root@vm1 ~]# cd ocaml-4.02.0
[root@vm1 ocaml-4.02.0]# ./configure
[root@vm1 ocaml-4.02.0]# make world opt
[root@vm1 ocaml-4.02.0]# make install

2.2 编译安装Unison

[root@vm1 ~]# wget ftp://133.31.130.35/pub/pkgsrc/distfiles/unison-2.48.3.tar.gz
[root@vm1 ~]# tar -xzvf unison-2.48.3.tar.gz
[root@vm1 ~]# cd unison-2.48.3
[root@vm1 unison-2.48.3]# make UISTYLE=text
[root@vm1 unison-2.48.3]# make install

2.3 copy unsion到/usr/local/bin

[root@vm1 unison-2.48.3]# cp unison /usr/local/bin

3 配置ssh的无密码登录

3.3.1 同步ssh-keygen生成ssh登录安全密钥对(两台机器上分别执行)

ssh-keygen -t rsa

一路回车到结束
这里将生成一对密钥,id_rsa(私钥文件)和id_rsa.pub(公钥文件),保存在 ~/.ssh/目录下

3.2 copy公钥并授权

将id_rsa.pub(公钥)文件的内容,copy到另外一台服务器的authorized_keys 文件中,完成授权

# vm1 上执行
cat ~/id_rsa.pub # 获取内容,然后copy

# vm2 的执行黏贴
vi ~/.ssh/authorized_keys

# vm2 文件授权
chmod 700 .ssh
chmod 600 ~/.ssh/authorized_keys

# vm2 重启SSH服务
[root@vm1 ~]# service sshd restart

# vm2 测试:
ssh root@vm1

同样的反向操作,相互授权一下。


4 设置同步脚本

示例这里是同步两台机器的nfs文件夹

vm1 上的脚本(unsion.sh)

#/bin/sh
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -lt 1 ]
then
    other_server="192.168.1.110"
    src1="/home/nfs/"
    dst2="/home/nfs/"
    /usr/bin/inotifywait -mrq -e create,delete,delete_self,modify,move $src1 | while read line; do
        /usr/bin/unison $src1 ssh://$other_server/$dst2
        echo -n "$line " >> /var/log/inotify.log
        echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
    done
fi

vm2 上的脚本(unsion.sh)

#/bin/sh
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -lt 1 ]
then
    other_server="192.168.1.111"
    src1="/home/nfs/"
    dst2="/home/nfs/"
    /usr/bin/inotifywait -mrq -e create,delete,delete_self,modify,move $src1 | while read line; do
        /usr/bin/unison $src1 ssh://$other_server/$dst2
        echo -n "$line " >> /var/log/inotify.log
        echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
    done
fi

然后执行两个脚本,则实现双向同步。

5 定时检查同步任务(以防进程死掉)

[unison@localhost ~]# crontab -e
# vm1
* * * * * nohup unsion.sh > /dev/null 2>&1 &

# vm2
* * * * * nohup unsion.sh > /dev/null 2>&1 &

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值