当前位置: 首页 > 工具软件 > Unison > 使用案例 >

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

甄成弘
2023-12-01

在日常的运维工作中,需要保证文件的高可用性,以防单点带来的文件丢失。 根据场景不同,一般会有单向和双向同步两种方式。
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 &

 类似资料: