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参数详解:
其它参考地址:
(完)