利用inotify463.com+rsync实现Linux文件批量更新

批量同步、批量更新,这应该是做运维的朋友们经常做的工作,rsync是linux下一款非常强大的同步工具,采用差异同步的方法,只上传文件/文件夹的不同部分,同时可以对上传部分先进行压缩,所以rsync的传输效率是很高的但rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题,一旦文件数到了一定规模,那么每次遍历都会消耗很多资源,如果只对经常改动的目录进行同步,也可以忽略这个问题,如果每次改动的目录多较大,那么就要用到inotify了,Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加、删除、修改、移动等各种事件,但inotify只提供了C语言接口,不方便调用,所以我们需要先安装inotify-tools

Linux下Rsync+Inotify-tools实现数据实时同步

一、系统环境:
CentOS_5.7-x86_64
更新源服务器:192.168.9.227
目的服务器:192.168.9.226  192.168.9.228  … …

 

二、目的服务器配置:192.168.9.226 192.168.9.228(rsync服务端):
1、检查rsync是否安装

注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且
file列表是循环形式触发rsync
,等于有10个文件发生更改,就触发10次rsync全量同步(简直就是噩梦),那还不如直接写个死循环的rsync全量同步得了。

rpm -qa|grep rsync 

解决方法
1、做判断http://www.ttlsa.com/web/let-infotify-rsync-fast/\#comments
2、使用金山周洋开发的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync
http://blog.chinaunix.net/uid-20639775-id-3011124.html
http://www.osyunwei.com/archives/7447.html
http://my.oschina.net/syyzhan/blog/210246
http://www.linuxidc.com/Linux/2012-02/53572.htm
http://storysky.blog.51cto.com/628458/538357/

如果没有发装,执以下命令进行安装

 

yum -y install rsync 

两篇文章都是用的同一个命令

2、定义rsync配置文件/etc/rsyncd.conf
192.168.9.226:

用crond分钟级同步 rsync -a
–delete $srcdir $rsyncuser@$ip::$dstdir &

cat >> /etc/rsyncd.conf << EOF uid = nobody   gid = nobody   use chroot = no max connections = 100   timeout = 600   pid file = /var/run/rsyncd.pid    lock file = /var/run/rsyncd.lock    log file = /var/log/rsyncd.log    [web1]   path = /data/www1/    ignore errors    read only = no   list = no   hosts allow = 192.168.9.0/255.255.255.0    auth users = www1   secrets file = /etc/www1.pwd   EOF 

 

192.168.9.228:

 

cat >> /etc/rsyncd.conf << EOF uid = nobody   gid = nobody   use chroot = no max connections = 100   timeout = 600   pid file = /var/run/rsyncd.pid    lock file = /var/run/rsyncd.lock    log file = /var/log/rsyncd.log    [web2]   path = /data/www2/    ignore errors    read only = no   list = no   hosts allow = 192.168.9.0/255.255.255.0    auth users = www2   secrets file = /etc/www2.pwd   EOF 

http://www.osyunwei.com/archives/7435.html

3、rsyncd.conf配置文件详解
uid = nobody      //运行RSYNC守护进程的用户
gid = nobody      //运行RSYNC守护进程的组
use chroot = 0    //不使用chroot
max connections = 0   // 最大连接数,0为不限制
port = 873  //默认端口873

说明:
操作系统:CentOS 5.X
源服务器:192.168.21.129
目标服务器:192.168.21.127,192.168.21.128
目的:把源服务器上/home/www.osyunwei.com目录实时同步到目标服务器的/home/www.osyunwei.com下
具体操作:

下面这些文件是安装完RSYNC服务后自动生成的文件
pid file = /var/run/rsyncd.pid    //pid文件的存放位置
lock file = /var/run/rsync.lock   //锁文件的存放位置.指定支持max
connections参数的锁文件,默认值是/var/run/rsyncd.lock.
log file = /var/log/rsyncd.log    //日志记录文件的存放位置

第一部分:分别在两台目标服务器192.168.21.127,192.168.21.128上操作

Timeout = 300
通过该选项可以覆盖客户指定的IP超时时间.通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端.超时单位为秒钟,0表示没有超时定义,这也是默认值.对于匿名rsync服务器来说,一个理想的数字是600.

一、分别在两台在目标服务器安装Rsync服务端
1、关闭SELINUX
vi /etc/selinux/config #编辑防火墙配置文件
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存,退出
setenforce 0  #立即生效

Log format = %t %a %m %f %b
通过该选项用户在使用transfer
logging可以自己定制日志文件的字段.其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:
%h 远程主机名
%a 远程IP地址
%l 文件长度字符数
%p 该次rsync会话的进程id
%o 操作类型:” send” 或” recv”
%f 文件名
%P 模块路径
%m 模块名
%t 当前时间
%u 认证的用户名(匿名时是null)
%b 实际传输的字节数
%c 当发送文件时,该字段记录该文件的校验码
默认log格式为:” %o %h [%a] %m (%u) %f %l”
,一般来说,在每行的头上会添加” %t [%p] ”
.在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件.

2、开启防火墙tcp 873端口(Rsync默认端口)
vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 873 -j
ACCEPT
:wq! #保存,退出
/etc/init.d/iptables restart #最后重启防火墙使配置生效

#transfer logging = yes
使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中.

3、安装Rsync服务端软件
yum install rsync xinetd #安装
vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync
disable = no #修改为no
:wq! #保存退出
/etc/init.d/xinetd start #启动(CentOS中是以xinetd来管理Rsync服务的)

syslog facility = local3
指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth,
authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log,
user, uucp, local0, local1, local2, local3,local4, local5,
local6和local7.默认值是daemon.

4、创建rsyncd.conf配置文件
vi /etc/rsyncd.conf #创建配置文件,添加以下代码
log file = /var/log/rsyncd.log
#日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile = /var/run/rsyncd.pid  #pid文件的存放位置
lock file = /var/run/rsync.lock  #支持max connections参数的锁文件
secrets file = /etc/rsync.pass 
#用户认证配置文件,里面保存用户名称和密码,后面会创建这个文件
motd file = /etc/rsyncd.Motd 
#rsync启动时欢迎信息页面文件位置(文件内容自定义)
[home_www.osyunwei.com] #自定义名称
path = /home/www.osyunwei.com/ #rsync服务端数据目录路径
comment = home_www.osyunwei.com
#模块名称与[home_www.osyunwei.com]自定义名称相同
uid = root #设置rsync运行权限为root
gid = root #设置rsync运行权限为root
port=873  #默认端口
use chroot = no #默认为true,修改为no,增加对目录文件软连接的备份
read only = no  #设置rsync服务端文件为读写权限
list = no #不显示rsync服务端资源列表
max connections = 200 #最大连接数
timeout = 600  #设置超时时间
auth users = home_www.osyunwei.com_user
#执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = 192.168.21.129 
#允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.21.254
#禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
:wq!  #保存,退出

模块参数
[web1]   //这里是认证的模块名,在client端需要指定
path = /data/www1/  //需要做镜像的目录,不可缺少!
comment = backup web  //这个模块的注释信息
ignore errors    //可以忽略一些无关的IO错误
read only = yes 
//该选项设定是否允许客户上载文件.如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的.默认值为true.
list = no        //不允许列文件
auth users = bak   
//认证的用户名,如果没有这行则表明是匿名,此用户与系统无关
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块.这里的用户和系统用户没有任何关系.如果”
auth users”
被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议.用户的名和密码以明文方式存放在”
secrets file”
选项指定的文件中.默认情况下无需密码就可以连接模块(也就是匿名方式).

5、创建用户认证文件
vi /etc/rsync.pass #配置文件,添加以下内容
home_www.osyunwei.com_user:123456 
#格式,用户名:密码,可以设置多个,每行一个用户名:密码
:wq!  #保存,退出

secrets file = /etc/www1.pwd     
//密码和用户名对比表,密码文件自己生成
该选项指定一个包含定义用户名:密码对的文件.只有在” auth users”
被定义时,该文件才有作用.文件每行包含一个username:passwd对.一般来说密码最好不要超过8个字符.没有默认的secures
file名,需要限式指定一个(例如:/etc/www1.pwd).注意:该文件的权限一定要是600,否则客户端将不能连接服务器.

6、设置文件权限
chmod 600 /etc/rsyncd.conf  #设置文件所有者读取、写入权限
chmod 600 /etc/rsync.pass  #设置文件所有者读取、写入权限

hosts allow = 192.168.9.0/255.255.255.0  //允许主机或网段
该选项指定哪些IP的客户允许连接该模块.客户模式定义可以是以下形式:
单个IP地址,例如:192.168.9.227
整个网段,例如:192.168.9.0/24,也可以是192.168.9.0/255.255.255.0
多个IP或网段需要用空格隔开,“*”则表示所有,默认是允许所有主机连接.

7、启动rsync
/etc/init.d/xinetd start  #启动
service xinetd stop   #停止
service xinetd restart #重新启动

hosts deny = 0.0.0.0/0  //禁止主机

第二部分:在源服务器192.168.21.129上操作

4、建立认证文件/etc/www1.pwd ,此文件须与配置文件中指定文件名保持一致
此处格式为:username:password,安全问题,并不建议实际使用中使用root用户
192.168.9.226:

一、安装Rsync客户端
1、关闭SELINUX
vi /etc/selinux/config #编辑防火墙配置文件
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存,退出
setenforce 0 #立即生效

echo "www1:741852" >> /etc/www1.pwd 

2、开启防火墙tcp
873端口(Rsync默认端口,做为客户端的Rsync可以不用开启873端口)
vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 873 -j
ACCEPT
:wq! #保存,退出
/etc/init.d/iptables restart #最后重启防火墙使配置生效
系统运维  www.osyunwei.com  温馨提醒:qihang01原创内容
版权所有,转载请注明出处及原文链接

192.168.9.228:

3、安装Rsync客户端软件
whereis rsync   #查看系统是否已安装rsync,出现下面的提示,说明已经安装
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz
yum install  xinetd 
#只安装xinetd即可,CentOS中是以xinetd来管理rsync服务的
yum install rsync xinetd
#如果默认没有rsync,运行此命令进行安装rsync和xinetd
vi /etc/xinetd.d/rsync #编辑配置文件,设置开机启动rsync
disable = no #修改为
/etc/init.d/xinetd start #启动(CentOS中是以xinetd来管理rsync服务的)

相关文章