使用inotify+rsync实现服务器间文件同步
| 1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。 运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。Rsync可以搭配ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。 基本特点: 
 命令语法: rsync的命令格式可以为以下六种:  rsync [OPTION]… SRC DEST  rsync [OPTION]… SRC [USER@]HOST:DEST  rsync [OPTION]… [USER@]HOST:SRC DEST  rsync [OPTION]… [USER@]HOST::SRC DEST  rsync [OPTION]… SRC [USER@]HOST::DEST  rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST] 对应于以上六种命令格式,我们可以总结rsync有2种不同的工作模式: 
 当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口,或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日志和lock file的权限。当rsync以daemon模式运行时,它还需要一个配置文件——rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。 我们一般把DEST远程服务器端成为rsync Server,运行rsync命令的一端SRC称为Client。 安装: rsync在CentOS6上默认已经安装,如果没有则可以使用yum install rsync -y,服务端和客户端是同一个安装包。 1.2 同步测试 rsync参数的具体解释如下  -v, --verbose 详细模式输出  -q, --quiet 精简输出模式  -c, --checksum 打开校验开关,强制对文件传输进行校验  -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD  -r, --recursive 对子目录以递归模式处理  -R, --relative 使用相对路径信息  -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。  --backup-dir 将备份文件(如~filename)存放在在目录下。  -suffix=SUFFIX 定义备份文件前缀  -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)  -l, --links 保留软链结  -L, --copy-links 想对待常规文件一样处理软链结  --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结  --safe-links 忽略指向SRC路径目录树以外的链结  -H, --hard-links 保留硬链结  -p, --perms 保持文件权限  -o, --owner 保持文件属主信息  -g, --group 保持文件属组信息  -D, --devices 保持设备文件信息  -t, --times 保持文件时间信息  -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间  -n, --dry-run现实哪些文件将被传输  -W, --whole-file 拷贝文件,不进行增量检测  -x, --one-file-system 不要跨越文件系统边界  -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节  -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步  --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息  -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件  --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件  --delete 删除那些DST中SRC没有的文件  --delete-excluded 同样删除接收端那些被该选项指定排除的文件  --delete-after 传输结束以后再删除  --ignore-errors 及时出现IO错误也进行删除  --max-delete=NUM 最多删除NUM个文件  --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输  --force 强制删除目录,即使不为空  --numeric-ids 不将数字的用户和组ID匹配为用户名和组名  --timeout=TIME IP超时时间,单位为秒  -I, --ignore-times 不跳过那些有同样的时间和长度的文件  --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间  --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0  -T --temp-dir=DIR 在DIR中创建临时文件  --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份  -P 等同于 --partial  --progress 显示备份过程  -z, --compress 对备份的文件在传输时进行压缩处理  --exclude=PATTERN 指定排除不需要传输的文件模式  --include=PATTERN 指定不排除而需要传输的文件模式  --exclude-from=FILE 排除FILE中指定模式的文件  --include-from=FILE 不排除FILE指定模式匹配的文件  --version 打印版本信息 1.2.1 本机文件夹同步 会看到从/root/传输文件到/tmp/rsync_bak/的列表和速率,再运行一次会看到sending incremental file list下没有复制的内容,可以在/root/下touch某一个文件再运行看到只同步了修改过的文件。 上面需要考虑以下问题: 
 1.3 同步到远程服务器 在服务器间rsync传输文件,需要有一个是开着rsync的服务,而这一服务需要两个配置文件,说明当前运行的用户名和用户组,这个用户名和用户组在改变文件权限和相关内容的时候有用,否则有时候会出现提示权限问题。配置文件也说明了模块、模块化管理服务的安全性,每个模块的名称都是自己定义的,可以添加用户名密码验证,也可以验证IP,设置目录是否可写等,不同模块用于同步不同需求的目录。 1.3.1 服务端配置文件 /etc/rsyncd.conf:  这里配置socket方式传输文件,端口873,[module_test]开始定义一个模块,指定要同步的目录(接收)path,授权用户,密码文件,允许哪台服务器IP同步(发送)等。关于配置文件中选项的详细说明依然参考rsync与inotifywait命令和配置选项说明。 经测试,上述配置文件每行后面不能使用#来来注释 /etc/rsyncd.secrets:  一行一个用户,用户名:密码。请注意这里的用户名和密码与操作系统的用户名密码无关,可以随意指定,与/etc/rsyncd.conf中的auth users对应。 修改权限:chmod 600 /etc/rsyncd.d/rsync_server.pwd。 1.3.2 服务器启动rsync后台服务 修改/etc/xinetd.d/rsync文件,disable 改为 no 执行service xinetd restart会一起重启rsync后台进程,默认使用配置文件/etc/rsyncd.conf。也可以使用/usr/bin/rsync --daemon --config=/etc/rsyncd.conf。 为了以防rsync写入过多的无用日志到/var/log/message(容易塞满从而错过重要的信息),建议注释掉/etc/xinetd.conf的success: 如果使用了防火墙,要添加允许IP到873端口的规则。 建议关闭selinux,可能会由于强访问控制导致同步报错。 1.3.3 客户端测试同步 单向同步时,客户端只需要一个包含密码的文件。 /etc/rsync_client.pwd: chmod 600 /etc/rsync_client.pwd 命令: 将本地/root/目录同步到远程172.29.88.223的/tmp/rsync_bak2目录(module_test指定): 当然你也可以将远程的/tmp/rsync_bak2目录同步到本地目录/root/tmp: 从上面两个命令可以看到,其实这里的服务器与客户端的概念是很模糊的,rsync daemon都运行在远程172.29.88.223上,第一条命令是本地主动推送目录到远程,远程服务器是用来备份的;第二条命令是本地主动向远程索取文件,本地服务器用来备份,也可以认为是本地服务器恢复的一个过程。 1.4 rsync不足 与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过crontab方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了! 2. inotify-tools 2.1 什么是inotify inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。 CentOS6自然已经支持: 使用ll /proc/sys/fs/inotify命令,是否有以下三条信息输出,如果没有表示不支持。 
 inotify-tools: inotify-tools是为linux下inotify文件监控工具提供的一套C的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。 下载inotify-tools-3.14-1.el6.x86_64.rpm,通过rpm包安装: 2.2 inotifywait使用示例 监控/root/tmp目录文件的变化: 上面的命令表示,持续监听/root/tmp目录及其子目录的文件变化,监听事件包括文件被修改、删除、创建、移动、属性更改,显示到屏幕。执行完上面的命令后,在/root/tmp下创建或修改文件都会有信息输出: 3. rsync组合inotify-tools完成实时同步 这一步的核心其实就是在客户端创建一个脚本rsync.sh,适用inotifywait监控本地目录的变化,触发rsync将变化的文件传输到远程备份服务器上。为了更接近实战,我们要求一部分子目录不同步,如/root/tmp/log和临时文件 3.1 创建排除在外不同步的文件列表 排除不需要同步的文件或目录有两种做法,第一种是inotify监控整个目录,在rsync中加入排除选项,简单;第二种是inotify排除部分不监控的目录,同时rsync中也要加入排除选项,可以减少不必要的网络带宽和CPU消耗。我们选择第二种。 3.1.1 inotifywait排除 这个操作在客户端进行,假设/tmp/src/mail/2014/以及/tmp/src/mail/2015/cache/目录下的所有文件不用同步,所以不需要监控,/tmp/src/下的其他文件和目录都同步。(其实对于打开的临时文件,可以不监听modify时间而改成监听close_write) inotifywait排除监控目录有--exclude 和--fromfile 两种格式,并且可以同时使用,但主要前者可以用正则,而后者只能是具体的目录或文件。 使用fromfile格式只能用绝对路径,不能使用诸如*正则表达式去匹配,@表示排除。 如果要排除的格式比较复杂,必须使用正则,那只能在inotifywait中加入选项,如--exclude '(.*/*\.log|.*/*\.swp)$|^/tmp/src/mail/(2014|201.*/cache.*)',表示排除/tmp/src/mail/以下的2014目录,和所有201*目录下的带cache的文件或目录,以及/tmp/src目录下所有的以.log或.swp结尾的文件。 3.1.2 rsync排除 使用inotifywait排除监控目录的情况下,必须同时使用rsync排除对应的目录,否则只要有触发同步操作,必然会导致不该同步的目录也会同步。与inotifywait类似,rsync的同步也有--exclude和--exclude-from两种写法。 个人还是习惯将要排除同步的目录卸载单独的文件列表里,便于管理。使用--include-from=FILE时,排除文件列表用绝对路径,但FILE里面的内容请用相对路径,如: /etc/rsyncd.d/rsync_exclude.lst: 排除同步的内容包括,mail下的2014目录,类似2015/201501/20150101/下的临时或隐藏文件,等。 3.2 客户端同步到远程的脚本rsync.sh 下面是一个完整的同步脚本,请根据需要进行裁剪,rsync.sh: --bwlimit=200用于限制传输速率最大200kb,因为在实际应用中发现如果不做速率限制,会导致巨大的CPU消耗。 在客户端运行脚本# ./rsync.sh即可实时同步目录。 文章来源 CODETC,欢迎分享,转载请注明地址: http://www.codetc.com/article-321-1.html | 
使用inotify+rsync实现服务器间文件同步的更多相关文章
- rsync+sersync+inotify实现服务器间文件同步之一
		rsync+sersync+inotify实现服务器间文件同步之一:rsync安装配置 2013年12月14日 ⁄ Linux管理, 服务器集群技术 ⁄ 共 4925字 ⁄ rsync+sersync ... 
- Linux 之 rsync实现服务器的文件同步
		rsync实现服务器的文件同步 参考文献链接: 一.rsync实现负载均衡集群文件同步,搭建线上测试部署环境 二.rsync. 三.rsync常见错误. 四.rsync 安装使用详解. 环境部署: 服 ... 
- C#实现服务器间文件同步
		using System.IO; /// <summary> /// 远程登陆服务器 /// </summary> /// <param name="remot ... 
- windows服务器间文件同步搭建步骤搜集
		Rsync https://www.cnblogs.com/janas/p/3321087.html https://yq.aliyun.com/ziliao/110867 subersion协议 h ... 
- 使用rsync实现不同Linux服务器间目录同步
		实现目标: A 服务器上 /opt/web 目录,与B服务器上 /opt/web目录实现同步.即:B主动与A进行同步. OS: Reaht AS4 A Server 192.168.1 ... 
- C# 实现文件(夹)在ftp服务器间的同步【无需将文件(夹)保存到本地】
		C#实现不同ftp服务器间文件(夹)同步 图1 实现不同ftp服务器间文件(夹)同步的实现思路图 /// <summary> /// 将文件夹1从ftp服务器1移到ftp服务器2文件夹2 ... 
- rsync + inotify 打造多server间文件实时同步
		在上篇文章ssh无password登陆server的基础之上.能够利用rsync + Inotify 在多server间实现文件自己主动同步. 例如以下測试机基于三台server做的.内网IP分别例如 ... 
- Linux服务器间文件实时同步的实现
		使用场景 现有服务器A和服务器B,如果服务器A的指定目录(例如 /home/paul/rsync/ )中的内容发生变更(增删改和属性变更),实时将这些变更同步到服务器B的目标目录中(例如 /home/ ... 
- Sersync+Rsync实现触发式文件同步
		背景 通常我们在服务器上使用rsync加上crontab来定时地完成一些同步.备份文件的任务.随着业务和应用需求的不断扩大.实时性要求越来越高.一般rsync是通过校验所有文件后,进行差量同步,如果文 ... 
随机推荐
- META http-equiv="refresh" 实现网页自动跳转
			使用说明: < HEAD> < TITLE>刷新内容< /TITLE> < META HTTP-EQUIV="REFRESH" CONTE ... 
- CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程
			CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程 昨天在腾讯云上买了个服务器,是CentOS6.6操作系统的裸机,里面什么都没,然后开始了一天一夜的LAMP(Apache+My ... 
- [转载]抓包工具Charles乱码解决办法
			FROM: http://blog.csdn.net/huanghanqian/article/details/52973651 安装 SSL 证书 Mac 端 首先去 http://www.char ... 
- DevExpress 项目目录列表参考(收集的 350个cs project)
			DevExpress.ExpressApp.Tools\DBUpdater\DBUpdater.csproj DevExpress.BonusSkins\DevExpress.BonusSkins.c ... 
- minic 词法单元建立
			#include <stdio.h> #include "symbol_table_def.h" //前面的那个词法和文法说明只是大概的说明,现在又有了改动,把指针运算 ... 
- [转]mysql 常用命令集锦[绝对精华]
			测试环境:mysql 5.0.45 [注:可以在mysql中通过mysql> SELECT VERSION();来查看数据库版本] 一.连接MYSQL. 格式: mysql -h主机地址 -u用 ... 
- Moving Tables-贪心
			id=19566" target="_blank" style="color:blue; text-decoration:none">Movin ... 
- freemarker的list指令小技术归纳
			1.问题:当数据超过3位的时候,freemarker会自动用逗号截取,例如2,311 解决方法(一种即可): (1)加.toString(),如:${(data).toString()} (2)加?c ... 
- UITextField,UITextView字数限制
			UITextField,UITextView字数限制 主要是使用他们的两个代理方法 //标题限制在 30个字以内 - (BOOL)textField:(UITextField *)textField ... 
- MQTT 学习笔记
			MQTT特点 MQTT协议是为大量计算能力有限,且工作在低带宽.不可靠的网络的远程传感器和控制设备通讯而设计的协议. 1.使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合 2.对负载内容 ... 
