基于rsync+inotify实现数据实时同步传输

前言

与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点, 通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之 rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。

rsync相关介绍

rsync(remote sync)是一款快速增量备份工具(远程同步),支持本地复制,或者与其他SSH(安全传输)、rsync主机同步。

特点

①可以镜像保存整个目录树或文件系统

②较高的数据传输效率

③可以借助于ssh实现安全数据传输

④支持匿名传输

工作模式

①shell模式,也称作本地模式

②远程shell模式,可以利用ssh协议承载其远程传输过程

③列表模式,仅列出源中的内容,-nv

④服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求

命令选项

-n: 同步测试,不执行真正的同步过程;-v: 详细输出模式-q: 静默模式-c: checksum,开启校验功能-r: 递归复制-a: 归档,保留文件的原有属性;-p: 保留文件的权限;-t: 保留文件的时间戳;-l: 保留符号链接-g: 保留属组-o: 保留属主-D:保留设备文件-e ssh: 使用ssh作为传输承载;-z: 压缩后传输;--progress: 显示进度条--stats: 显示如何执行压缩和传输

注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;如:rsync -r /var/log/ /tmp #复制/var/log目录下的所有文件,不包括log本身 rsync -r /var/log /tmp #复制/var/log整个目录

rsync同步数据的时候,需要完整扫描文件,比对变化的文件,如果文件数量过于庞大,这样扫描是非常耗时的,而且rsync虽然可以通过crontab实现定期同步,但是也达不到实时同步的要求,要想解决这一弊端,就需要inotify了

数据实时同步实现

inotify相关介绍

可用于定义监控指定的目录下的所有文件,一旦有文件的元数据发生改变,就通知rsync进行数据同步,以此实现实时同步

部署过程

我们通过一个实例来看一下rsync+inotify是如何实现数据同步的

案例要求

web服务器1:172.16.10.100(主服务器)

web服务器2:172.16.10.212(辅服务器)

两台web服务器,要求在主服务器上更新数据,辅服务器要自动更新数据

rsync角色说明:因为inotify是监控在rsync的客户端,而且是主动同步,所以在此应用场景中主服务器为rsync客户端,辅服务器为rsync服务器端

rsync服务器端配置

[root@scholar ~]# yum install xinetd -y #安装守护进程,rsync系统自带,如果没有安装即可[root@scholar ~]# vim /etc/xinetd.d/rsync #修改此项 disable = no #启用rsync[root@scholar ~]# vim /etc/rsyncd.conf #为rsync创建配置文件,默认没有此文件# Global Settingsuid = nobody #运行rsync用户gid = nobody #运行rsync组use chroot = no #关闭chrootmax connections = 10 #最大并发连接数strict modes = yes #开启严格模式pid file = /var/run/rsyncd.pid #pid文件位置log file = /var/log/rsyncd.log #日志文件位置# Directory to be synced[web] #文件共享名path = /web #共享文件路径ignore errors = yes #忽略错误read only = no #不允许读write only = no #不允许写hosts allow = 172.16.0.0/16 #白名单hosts deny = * #黑名单list = false #不允许列出文件uid = root #共享已root用户运行,可覆盖全局配置gid = root #共享已root组运行,可覆盖全局配置auth users = scholar #用户认证secrets file = /etc/rsync.passwd #认证文件[root@scholar ~]# vim /etc/rsync.passwd #创建认证文件#格式:username:password,此文件不能允许其它用户有访问权限,且密码不能超过8个字符scholar:scholar[root@scholar ~]# chmod 600 /etc/rsync.passwd #设置权限

启动服务,设置开机自启,查看监听端口

rsync客户端配置

创建认证文件,只需密码即可

测试数据同步的方法

Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 如:rsync --password-file=/etc/rsync.passwd scholar@172.16.10.212::web /web rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 如:rsync --password-file=/etc/rsync.passwd rsync://scholar@172.16.10.212/web /web Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 如:rsync --password-file=/etc/rsync.passwd /web scholar@172.16.10.212::web rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST 如:rsync --password-file=/etc/rsync.passwd /web rsync://scholar@172.16.10.212/web

安装inotify-tools

[root@scholar ~]# tar xf inotify-tools-3.14.tar.gz [root@scholar ~]# cd inotify-tools-3.14[root@scholar inotify-tools-3.14]# ./configure[root@scholar inotify-tools-3.14]# make && make install

创建rsync脚本

[root@scholar ~]# vim /usr/local/bin/rsyncd#!/bin/bashSRC=/web/DEST=webHOST=172.16.10.212/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $SRC | while read files;do rsync -vzrtopg --delete --progress --password-file=/etc/rsync.passwd $SRC scholar@$HOST::$DESTdone#inotifywait参数详解:#-m,表示始终保持事件监听状态#-r,表示递归查询目录#-q,表示打印出监控事件#-e,指定要监控的事件,包括modify、delete、create、attrib等#--timefmt:指定时间的输出格式#--format:指定变化文件的详细信息

设置开机自动运行

测试同步

我们在主服务器上增加一个站点,站点已做好我们直接复制进去

我们去辅服务器上看一下,数据有没有同步过来

同步成功,至此基于rsync + inotify实现数据实时同步配置完成

The end

好了,rsync + inotify就讲到这里了,如果要实现多台从服务器同步,多设几个rsync服务器端就好了,相应的主服务器inotify的脚本也需要略加修改,过程并不麻烦,实验过程中遇到问题可留言。以上仅为个人学习整理,如有错漏,大神勿喷~~~

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

互联网协议入门(二)

这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。

8320
来自专栏技术之路

go微服务框架go-micro深度学习(三) Registry服务的注册和发现

     服务的注册与发现是微服务必不可少的功能,这样系统才能有更高的性能,更高的可用性。go-micro框架的服务发现有自己能用的接口Registry。只要实...

46950
来自专栏Golang语言社区

Linux命令行:find的26个用法示例

作者 | Wray 来自 | http://www.codebelief.com/ Linux系统中的 find 命令在查找文件时非常有用而且方便。它可以根...

377130
来自专栏PHP实战技术

浏览器访问一个网站所经历的步骤

  搜索操作系统自身的DNS缓存(浏览器没有找到缓存或缓存已经失效)

27080
来自专栏编程心路

Linux目录及文件相关知识整理

Linux 文件管理是学习 Linux 的基础,看了鸟叔的 Linux 书籍,把 Linux 目录及文件相关的知识整理如下。

20340
来自专栏java思维导图

互联网协议入门(二)

技术文章第一时间送达! 本文来自“阮一峰的网络日志” 上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想。 这是从设计者的角度看问题,今天我想切换...

27780
来自专栏牛客网

Linux入门学习笔记

1. 指令、选项或参数之间不论空几个格, shell 都视为一个空格。 2. 指令太长时,可以使用“ \ ”(反斜杠)符号使指令连续到下一行。 3. Linux...

442100
来自专栏帘卷西风的专栏

Linux常用指令

服务器部署会经常用到linux,很多时候都是用的时候上网查一下指令,然后用完过不了多久就忘记了,因此本文记录一些自己常用的linux指令,以作备忘。并不断添...

30430
来自专栏Golang语言社区

Linux命令行:find的26个用法示例

Linux系统中的 find 命令在查找文件时非常有用而且方便。它可以根据不同的条件来查找文件,例如权限、拥有者、修改日期/时间、文件大小等等。在这篇文章中,我...

367130
来自专栏Windows

Windows2008 IIS 7 运行wordpress媒体中心上传文件图片出现HTTP错误的解决办法

服务器从windows2003升级到windows2008,原wordpress打开媒体中心上传图片或者文件出现了HTTP错误,如图:折腾了几天

36300

扫码关注云+社区

领取腾讯云代金券