unison+inotify实现文件双向同步

要实现2个节点间文件双向同步,推荐使用Unison。平时用的最多的应该是NFS,但是致命缺点是文件存储在单台服务器上,没有容灾的效果。

unison介绍

Unison是Windows、Linux以及其他Linux平台下都可以受用的文件同步工具,它能使两个文件夹(本地或网络上)保持内容一致。Unison拥有与其他一些同步工具或文件系统的相同特性,但也有自身的特定:

  1. 跨平台使用;

  2. 对内核和用户权限没有特殊要求;

  3. Unison是双向的, 它能自动处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;

  4. 只要是能连通的两台主机,就可以运行unison,可以直接使用socket连接或安全的ssh连接方式,对带宽的要求不高,使用类似rsync的压缩传输协议 ;

  5. Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集;

  6. Unison双向同步不适用于对在两个同步文件夹中同一个文件,在同一时刻被修改时,unison是不会去同步的,因为unison无法判断以那个为准。Unison将创建文件锁,并由用户来手动解锁;

注意:
1、Unison有清空保护机制: 如有出现 rm -rf ./* 动作,操作会自动停止同步,并在日志中报错。但此时再下一个有文件级别变化,执行清空的同步操作,然后同步有变化的文件。
2、日志文件 unison.log不能删除,一旦删除,unison程序报错。

测试环境

A节点 Centos7 192.168.1.250 /home/backup/250

B节点 Centos7 192.168.1.251 /data/anonymous

1 实现A节点到B节点的单向同步

2 实现A、B节点指定目录文件的双向同步

配置步骤

一、安装软件

1
2
yum install -y epel-release
yum install -y ocaml unison

二、配置ssh信任

1、生成公钥私钥

1
ssh-keygen

2、将自己公钥拷贝到另一个服务器的.ssh/authorized_keys 文件中,这样自己就可以免密码连接另一台服务器了

1
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.251

两台机器上都执行相同操作,实现相互免密登陆。

三、配置unison服务

A节点配置

1、在用户根目录创建.unison目录

2、在此目录下新建配置文件default.prf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root = /data/anonymous/
root = ssh://192.168.1.251//home/backup/250/
ignore = Path runtime/* # 不同步的文件
batch = true
owner = true
group = true
perms = -1
fastcheck = true
rsync = false
sshargs = -C
xferbycopying = true
log = true
logfile = /root/.unison/unison.log

# force 是基准目录,单双向文件同步选择,使用force后为单向同步
# 以本地目录为准,双向同步关闭force配置
force = /data/anonymous/

B节点配置

不配置,实现A节点文件单向同步到B节点

配置如下:实现A节点和B节点的双向同步

1、在用户根目录创建.unison目录

2、在此目录下新建配置文件default.prf

1
2
3
4
5
6
7
8
9
10
11
12
13
root = /home/backup/250/
root = ssh://192.168.1.251//data/anonymous/
ignore = Path runtime/* # 不同步的文件
batch = true
owner = true
group = true
perms = -1
fastcheck = true
rsync = false
sshargs = -C
xferbycopying = true
log = true
logfile = /root/.unison/unison.log

四、启动unison同步

双向同步

A、B节点上都启动unison命令。

单向同步

A节点上启动unison命令,B节点不操作。

五、配置文件详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root = /usr/srm23/webapp/webRoot    #这个是本地的
root = ssh://mascloud@192.168.116.22//home/mascloud/webapp/Web #这个是远程的
batch = true #表示全自动模式,接受缺省动作,并执行
fastcheck = true
#表示同步时使用文件的创建时间来比较两地文件,如果这个选项为false,
#unison则将比较两地文件的内容.建议设置为true
group = false #保持同步过来的文件组信息,注意,同步目录是否一个组
ignore = Path WEB-INF/aurora.plugin.quartz/* #忽略文件
log = true
logfile = /root/.unison/logs/webapp.log #记得创建日志路径
maxthreads = 300
owner = false #保持同步过来的文件属主,注意,同步目录是否一用户
perms = -1 #保持同步过来的文件读写权限
repeat = 60 #间隔60秒后,开始新的一次同步检查
retry = 3 #失败重试

# force 是基准目录,单双向文件同步选择,使用force后为单向同步
# 以本地目录为准,双向同步关闭force配置
force = /usr/srm23/webapp/webRoot

rsync = false # 关闭rsync传输模式,默认为true
silent = false #终端中不显示任何信息,除非出现错误
times = true #同步修改时间
xferbycopying = true #不变目录,扫描时可以忽略
ignorecase = true #[true|false|default] 是否忽略文件名大小写
sshargs = -C #使用ssh的压缩传输方式

Inotify介绍

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过Inotify可以监控文件系统添加、删除、移动、修改等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况。

这里我们使用inotify-tools软件来实施监控。

Inotify安装配置

一、安装inotify-tools

1
yum install inotify-tools -y

二、工具集介绍

  • 该软件包共安装了两个工具(命令),即inotifywaitinotifywatch
    inotifywait:在被监控的文件或目录上等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在脚本中使用
  • inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计

三、 inotifywait 常用参数

参数 说明 含义
-r –recursive 递归查询目录
-q –quiet 打印很少的信息,仅仅打印监控事件的信息
-m –monitor 始终保持事件监听状态
–format 打印使用指定的输出类似格式字符串
–timefmt 指定事件输出的格式
-e –event 通过此参数可以指定要监控的事件
access 文件或目录被读取
modify 文件或目录的内容被修改
attrib 文件或目录的属性被改变
close 文件或目录被封闭,无论读/写模式
open 文件或目录被打开
move_to 文件或目录被移动至另外一个目录
move 文件或目录被移动至另外一个目录或从另一个目录移动至当前目录
create 文件或目录被创建在当前目录
delete 文件或目录被删除
umount 文件系统被卸载

四、inotify监控脚本

inotifywait 监控指定目录文件的变化,调用unison进行文件同步

inotify.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash

src="/data/anonymous/"

/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line;do
unison
echo -n "$line" >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done