rsync+inotify

Linux系统的文件系统有一些特殊功能,比如rsync就是非常好的文件同步工具,而inotify则是Linux内核中监控文件变化并能引发通知的绝佳工具。在一些简单场景下我们可以用这两种工具合理组合,实现多台服务器同步文件,功能十分强大。

假设源服务器为A,同步的目录是 /home/bmc/files

目标服务器是B,存放文件的目录是 /home/bmc/files

这里需要将B作为服务器,A作为客户端。

两台服务器互信

两台服务器能自动传输文件是需要通过权限认证的,这里给出的配置是需要再两台服务器用明文密码配置文件的,对应就是B的/etc/rsyncd.secrets和A上面的/etc/rsyncd-client.passwd。

但是如果大家觉得这种不好,那就建立两台服务器的 ssh 信任(ssh-keygen)。

建议大家用这种方式,操作如下:

1
2
3
4
ssh-keygen -t rsa 
# 一路回车,会在 ~/.ssh/下生成 id_rsa 和 id_rsa.pub ,分别是私钥和公钥。
# 将id_rsa.pub传输到需要推送数据的目的地服务器 /root/.ssh/。
# 最后执行cat id_rsa.pub >> authorized_keys即可

实例讲解

下面我们要做的是:将客户端A上面的文件变化,推送(上传)到服务器B。

A 上安装 rsync和 inotify-tools(下载:http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz)

A 上的rsync不需要配置,只需要写 inotify 的shell,到时候启动上传即可。

B 上安装 rsync 即可。B上需要配置rsync 并且开机自动启动,打开服务器。

Rsync配置

 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
27
28
29
30
31
32
33
34
35
36
37
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# add by cd.net on 2020-04-26

port                = 19515
address             = 10.10.11.10

uid                 = root
gid                 = root
use chroot          = false
max connections     = 5
timeout             = 300

log file            = /home/bmc/app/11_10_config/_logs_/rsync_server_10.log
pid file            = /var/run/rsyncd.pid
lock file           = /var/run/rsync.lock
dont compress       = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.rar

read only           = false
write only          = true
list                = false

transfer logging    = true
log format          = %h %o %f %l %b

slp refresh         = 300
use slp             = false

auth users          = root
secrets file        = /etc/rsyncd.pass

[up_installer]
path                = /home/bmc/installer
hosts allow         = 10.10.11.11 10.10.11.10
hosts deny          = *
read only           = false
write only          = true

监控文件变化,将发生变化的文件同步到备份服务器。

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh
# cronte -e
# 49 03 * * * sh /home/bmc/app/11_config/rsync/inotify_installer_11.sh cron >> \
/home/bmc/app/11_config/_logs_/inotify_cron_11.log 2>&1 &

src11_installer=/home/bmcsoft/installer/
des11_installer_bk=/home/bmcsoft/installer_bk/
des10_installer=root@10.10.10.10::up_installer

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 定时任务,每天比对一次全量文件
if [[ $1 =~ 'cron' ]]; then
rsync --port 19515 -avP -e 'ssh -p 22' --password-file=/etc/rsyncd_client.pass \
	$src11_installer $des10_installer
else
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 进入工作目录,确保文件同步的相对路径
cd $src11_installer
/usr/bin/inotifywait -mrq -e close_write,delete,moved_to,moved_from --timefmt '%y-%m-%d %H:%M:%S' \
--format '%T %w%f %e' ./ | while read dt tm file event; do
    echo $dt $tm --------------------------------------
    echo $file $event

    # 写入完成、移动进
    if [[ $event =~ 'CLOSE_WRITE' ]] || [[ $event =~ 'MOVED_TO' ]]
    then
        rsync --port 19515 -aPR $file $des11_installer_bk
        rsync --port 19515 -avPR -e 'ssh -p 22' --password-file=/etc/rsyncd_client.pass \
        	$file $des10_installer
    fi
    # 删除、移动出
    if [[ $event =~ 'DELETE' ]] || [[ $event =~ 'MOVED_FROM' ]]
    then
        rsync --port 19515 -avPR -e 'ssh -p 22' --password-file=/etc/rsyncd_client.pass \
        	--delete $(dirname $file) $des10_installer
    fi
done
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
fi

rsync参数详解:

其它参考地址:

(完)