rsync+inotify实现数据实时同步
Posted xl999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsync+inotify实现数据实时同步相关的知识,希望对你有一定的参考价值。
rsync
rsync是linux系统下的数据镜像备份工具。支持远程同步,本地复制,或者与其他SSH、rsync主机同步。
优点:
1)、可以镜像保存整个目录树和文件系统。保存源目录整个目录树和文件系统
2)、备份迅速,使用同步算法,只比较变化,支持增量备份
3)、与scp相比,rsync传输速度远在scp之上。
缺点:
1)、同步数据,需要扫描所有文件进行对比,才进行差量传输。如果文件数量达到百万甚至千万级,扫描文件对比文件将非常耗时,降低了rsync效率。
2)、rsync不能实时地区监测、同步数据。虽然可以通过守护进程方式触发同步,但两次动作间有时间差,导致数据不一致,无法应对出现故障时完全恢复数据。
inotify
inotify 是Linux 的一个内核特性,是一种强大的、细粒度的、异步的文件系统事件监控机制。它可以监控文件系统中的添加、删除、修改、移 动等各种细微事件,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。
rsync+inotify
rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了rsync同步数据的实时性问题。
在使用 rsync 进行远程同步时,可以使用两种方式:远程 Shell 方式(建议使用 ssh,用户验证由 ssh 负责)和 C/S 方式(即客户连接远程 rsync 服务器,用户验证由 rsync 服务器负责)。
一. 环境
由于web服务器所提供的网站数据需要保持一致,但当服务器越来越多时,这些主机之间同步网站数据会很麻烦。
解决方案是把其中一个WEB服务器作为一个数据发布服务器,通过inotify机制实时监控网站数据,当数据发生变化后调用rsync命令同步数据到多个web服务器
web1:ip为192.168.0.113,rsync服务端,需要配置/etc/rsyncd.conf配置文件
web2:ip为192.168.0.114,rsync服务端,需要配置/etc/rsyncd.conf配置文件
src :ip为192.168.0.120,作为数据源,不需要配置/etc/rsyncd.conf,但是需要安装inotify,实时监控数据变化
二. 在web服务器上部署rsync服务
在多台web服务器上部署rsync服务,这些rsync服务提供客户端(数据源服务器)上传功能,这样我们只需要在192.168.0.120主机上修改数据,就可以实时推送数据到两台web服务器
2.1 前期工作:
1. 在web1,web2,src服务器创建同步目录[自定义]:/data/www/image
2. 关闭selinux
3. 关闭防火墙(或开启防火墙策略,873端口)
2.2 WEB1,WEB2服务器上安装rsybc,创建同步目录如下
# yum -y install rsync #centos7中默认已安装
# mkdir -p /data/www/image #建立数据同步存放目录
--# chmod 770 /data/www #修改权限,非root用户的话需要
2.2.1 WEB1的配置文件
[[email protected] ~]# cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
ignore errors
read only = no
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
[web1]
comment = web content
path = /data/www/image
auth users = tom # 授权用户,与密码文件里面的一致
secrets file = /etc/rsyncd.secrets # 授权用户和密码文件路径
host allow = 192.168.0.120/32
list = false
2.2.2 WEB2的配置文件
WEB1的配置和WEB2基本一样[模块名不一样],为了容易区分,名称为[web2]
[[email protected] ~]# cat /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
ignore errors
read only = no
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
[web2]
comment = web content
path = /data/www/image
auth users = tom
secrets file = /etc/rsyncd.secrets
host allow = 192.168.0.120/32
list = false
2.2.3 然后(WEB1,WEB2)设置密码文件,防火墙
# echo "tom:123" > /etc/rsyncd.secrets
# chmod 600 /etc/rsyncd.secrets # 权限必须是600
# rsync --daemon # 一定记得要开启rsync
# echo "rsync --daemon" >> /etc/rc.local
# firewall-cmd --permanent --add-port=873/tcp #rsync默认端口是873,设置防火墙永久允许
# firewall-cmd --reload
三. 配置数据源发布服务器(192.168.0.120)
3.1. 安装相应软件
# mkdir -p /data/www/image # 创建同步目录,我这里为了方便,路径与web服务器一样了
# yum -y install rsync
# rsync --daemon # 开启rsync,无需配置配置文件,如果启动提示没有配置文件,直接创建一个空文件即可
# yum -y install automake libtool # 安装编译安装软件所需工具
# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
解压后进入inotify-tools-3.14目录,执行如下安装
# ./configure --prefix=/usr/local/inotify # 默认安装路径是/usr/local,如果想改变路径可在后面加参数 --prefix 路径名
# make && make install
3.2. 设置密码文件
# echo "123" > /etc/rsyncd.secrets # 名字自定义,与inotify脚本一致,123为rsync服务端配置的用户名为tom的密码,不需要用户名
# chmod 600 /etc/rsyncd.secrets
3.3. 编写监控脚本
# cat /usr/local/inotify/notify_rsync.sh
#!/bin/bash
export PATH=/bin:/usr/bin:/usr/local/bin:/usr/local/inotify/bin
SRC=/data/www/image # 设置修改数据的目录
DEST1=web1 # web1的模块名,在web1服务rsyncd.conf文件配置
DEST2=web2 # web2的模块名
Client1=192.168.0.113
Client2=192.168.0.114
User=tom
Passfile=/etc/rsyncd.secrets
[ ! -e $Passfile ] && exit 2
#wait for change
inotifywait -mrq --timefmt ‘%y-%m-%d %H:%M‘ --format ‘%T %w%f %e‘
--event modify,create,move,delete,attrib $SRC | while read line
do
echo "$line" > /var/log/inotify_web 2>&1
#同步数据到web1,rsync -avz /data/www/ [email protected]::web1,web1为web1 rsync配置文件里面定义显示的名称
rsync -avz --delete --progress --password-file=$Passfile $SRC ${User}@$Client1::$DEST1 >> /var/log/sync_web1 2>&1
#同步数据到web2
rsync -avz --delete --progress --password-file=$Passfile $SRC ${User}@$Client2::$DEST2 >> /var/log/sync_web2 2>&1
done &
--然后执行此脚本 sh notify_rsync.sh,之后在/web_data/目录下的操作就可同步到web1和web2的相应同步目录中了
# nohup sh /usr/local/inotify/notify_rsync.sh & # 后台挂起执行
--加到rc.local里让其开头自动启动
# echo "nohup sh /usr/local/inotify/notify_rsync.sh &" >> /etc/rc.local
-------------------------------------------------------------------------------------------
报错:
@ERROR: Unknown module ‘web1‘
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]
原因:
rsyncd.conf中的对应项目的hosts allow属性写错了
-------------------------------------------------------------------------------------------
以上是关于rsync+inotify实现数据实时同步的主要内容,如果未能解决你的问题,请参考以下文章