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的配置文件
[root@web01 ~]# 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]
[root@web02 ~]# 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/ tom@192.168.0.113::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磁盘数据实时同步


下一篇:Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列