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实现数据实时同步的更多相关文章
- CentOS 6.5 rsync+inotify实现数据实时同步备份
CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...
- sersync基于rsync+inotify实现数据实时同步
一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...
- 实战:rsync+inotify实现数据实时同步
Linux 内核从 2.6.13 版本开始提供了 inotify 通知接口,用来监控文件系统的各种变化情况,如文件存取.删除.移动等.利用这一机制,可以非常方便地实现文件异动告警.增量备份,并针对目录 ...
- rsync+inotify磁盘数据实时同步
一.rsync+inotify主服务器部署 1.1安装rsync [root@nginx ~]# cd /usr/src/ [root@nginx src]# tar zxvf rsync-3.0.9 ...
- 利用rsync+inotify实现数据实时同步脚本文件
将代码放在Server端,实现其它web服务器同步.首先创建rsync.shell,rsync.shell代码如下: #!/bin/bash host1=133.96.7.100 host2=133. ...
- 通过rsync+inotify实现数据实时备份同步
一.环境描述 测试环境 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 环境描述: 主服务器172.26.7.50 ,从 ...
- Linux下Rsync+sersync实现数据实时同步
inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...
- Rsync+sersync实现数据实时同步
前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...
- Linux下Rsync+Inotify-tools实现数据实时同步
Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件 ...
随机推荐
- iOS如何把所有页面状态栏的字体颜色都设置为白色
第一步:在info.plist中添加一个字段:view controller -base status bar 设置为NO 第二步:在一个所有界面都继承的父类里添加: if (IOS7_OR_LATE ...
- 学习笔记: js插件 —— SuperSlide 2 (轮播图插件,PC用)
SuperSlide 2 轮播图插件,较老.但还好用. 适用于PC,是绑定到jquery上的方法: $.slide(); 如果在实际中找不到.slide方法,请检查jquery等.js文件的引入次序 ...
- 33.纯 CSS 创作牛奶文字变换效果
原文地址:https://segmentfault.com/a/1190000015037234 感想:transform: translateY(50% & -50%); animatio ...
- 《算法》第二章部分程序 part 2
▶ 书中第二章部分程序,加上自己补充的代码,包括若干种归并排序,以及利用归并排序计算数组逆序数 ● 归并排序 package package01; import java.util.Comparato ...
- Redis zset数据类型
zadd():添加元素 zcard :返回元素个数
- ubuntu简单安装apache
环境: ubuntu 目标: 1.安装web服务器apache 2.打开浏览器,访问自己的web服务器,看到 Hello,World! 开始动手了! 安装sudo apt-get install ap ...
- vue的初识与简单使用---前后端分离通过接口调取数据
vue的安装 #### .环境搭建 ''' - 安装node ``` 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ ``` - 安装cnpm ``` npm inst ...
- bootsrap Collapse用法
collapse用处还是挺多的. 使用方法先看看bootstrap官方文档:https://v3.bootcss.com/javascript/#collapse You can use a link ...
- 解决eclipse新建项目看不到src/main/java目录办法
1.eclipse->window->preferences->java->compiler->选择本地要用的Java版本 2.eclipse->window-&g ...
- Xcode 新建bundle id不同的且app图标也不同的新的target的步骤
方法一: duplicate一个target 修改target配置文件中的bundle id,app icon图标文件位置(必要时重命名app icon文件名),plist文件位置,entitleme ...