梯子[说明:已部署到生产环境,百分百可用]

  • 主要步骤
  • 安装inotify-tools
  • 安装rsync(以192.168.1.1为例)
  • 编写监控脚本(以192.168.1.2为例)


主要步骤

  • 为了便于说明,避免累赘,本文以192.168.1.1为服务端,192.168.1.2为客户端,可实现将192.168.1.2的文件同步到192.168.1.1,反过来配置一遍,即可实现互相同步(互为主从)
  • 准备两台服务器(以192.168.1.1和192.168.1.2为例,需要同步的目录为/usr/local/src/test/)
  • 两台服务器分别安装inotify-tools
  • 两台服务器分别安装rsync,修改rsync的配置文件并启动
  • 编写脚本,实现自动同步,其中inotify用于监控,rsync用于执行同步命令

安装inotify-tools

yum -y install inotify-tools
#以下为安装失败时的处理,安装成功的可忽略
#如果没有对应的源,使用如下命令安装对应的源(以centos为例),安装后再执行上述命令即可
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
(如果安装源出错,可能是linux版本差异造成的,将url最后更改为epel-5.repo或者epel-7.repo再试即可)

安装rsync(以192.168.1.1为例)

yum -y install rsync
  • 作用说明:作为服务端接受客户端同步过来的文件
  • 编辑配置文件
vi /etc/rsyncd.conf
  • 修改配置文件
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
#此处为模块名,客户端通过该模块名匹配对应的路径以及账号信息等
[server1]
#此处为客户端同步过来的文件保存的路径
path = /usr/local/src/test/
comment = web file
ignore errors
read only = no
write only = no
#此处为允许连接过来的客户端地址,服务器1填写服务器2,服务器2填写服务器1
hosts allow = 192.168.1.2
hosts deny = *
list = false
uid = root
gid = root
#允许客户端连过来的账号名称(此处为自定义账号,和liunx的账号无关)
auth users = server2
#认证使用的密码文件,需要手动创建
secrets file = /etc/rsyncd.passwd
  • 创建对应的账号文件并设置对应的权限,即配置文件中的 /etc/rsyncd.passwd
echo 'server2:123456' > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd#权限一定不要忘记配置,否则后续连接时会认证失败

注意账号文件必须是username:password的格式,此处可理解为一个内存数据库,每一行为一个用户,其中:的前面为用户名,后面为密码。

  • 启动rsync,使用后台运行的模式
rsync --daemon --config=/etc/rsyncd.conf

编写监控脚本(以192.168.1.2为例)

  • 新建监控脚本(以在/usr/local/src目录下为例)
cd /usr/local/src/
touch rsync-server-2.sh
vi rsync-server-2.sh

rsync-server-2.sh脚本内容如下

#!/bin/bash
#目标服务器地址
host=192.168.1.1
#本地需要同步的路径
src=/usr/local/src/test/
#目标服务器中配置的模块名,/etc/rsyncd.conf中[]的内容
des=server1
#目标服务器认证时使用的账户名
user=server2
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files
do
#此处使用非交互方式输入密码,密码存储在/etc/rsyncd-client.passwd中
/usr/bin/rsync -vzrtopg --progress --password-file=/etc/rsyncd-client.passwd $src $user@$host::$des 
echo "${files} was rsynced" >>/tmp/rsync-server2.log 2>&1
done
  • 新建监控脚本中客户端连接需要使用的密码文件
# 还记得服务器端使用的账号密码是server2:123456,此处只需要密码即可
echo "123456" > /etc/rsyncd-client.passwd
chmod 600 /etc/rsyncd-client.passwd#权限一定不要忘记配置,否则后续连接时会认证失败
  • 给脚本增加运行权限并运行
chmod +x rsync-server-2.sh
# 后台运行,输出日志到文件
sh rsync-server-2.sh >/var/log/rsync2Server1.log 2>&1 &

通过以上步骤即可实现客户端192.168.1.2将/usr/local/src/test/同步到服务器192.168.1.1

如果需要相互同步,重复上面步骤即可,即在192.168.1.2建立rsync服务器,在192.168.1.1编写监控脚本,即可将192.168.1.1的文件同步到192.168.1.2中

本文是参考如下文章整理的简洁版本,感谢原作者(虽然还是有不少坑,字符串多了空格等等)。如果有问题,请评论或者私信,我会及时回复。

关于解决多台服务器间的文件实时同步问题Linux安装inotify-tools