windwos与linux基于inotify实现文件实时同步实战记录
cwRsync是基于cygwin平台的rsync软件包,支持windows对windows、windows对Linux、Linux对windows高效文件同步。由于CwRsync已经集成了cygwin类库,因此安装的时候可以省去cygwin包。Cwrsync还集成了OpenSSH for windows,可以实现Linux 下Rsync一模一样的操作。使用 cwRsync 来同步文件后,只需要对一台主服务器进行文件修改,其他镜像服务器可以自动同步,包括文件的更新、删除、重命名等。
正好符合我现在的需求
cwRsync分为付费版和免费版两种,我们只需要使用免费版即可,在官方网站上面下载cwRsync的客户端版本和服务器版本。
请在附件中下载
客户端版本:cwRsync 4.0.5 Installer
服务器版本:cwRsyncServer 4.0.5 Installer
这里我只需要让win做服务端,客户端rsync linux默认就有
查看服务器是否安装rsync
# rpm -aqrsync
rsync-3.0.9-15.el7.x86_64
如果没有可以yum装下
# yum installrsync -y
1.安装:
对于cwRsync的安装没有什么好说的,我选择的全部都是默认安装,对于服务器版本的安装,这里再多加一句,在安装过程中会提示要求我们输入Serviceaccount以及密码,如果我们不指定的话会使用SvcCWRSYNC这个账户,密码是随机生成的,所以要记住这个密码。但是在我后面的配置中,并没有用到这个Serviceaccount。
密码保持默认,占时我还没发现这个密码所用之地
2.配置:
cwRsync的架构很简单,有一个Server和多个Client组成。安装server版的cwRsync以后,在服务器上面启动cwRsync服务,然后在客户端上面执行文件同步命令即可实现文件同步功能。如果我们将文件同步命令添加到windows计划任务当中,就可实现定义同步的功能。
2.1服务器端配置
在cwRsync的安装目录下,可以找到一个rsyncd.conf的配置文件,下面我根据自己实际的业务需求来讲名配置文件的修改方法
下面我将自己服务器端配置文件贴出来,在配置文件的下端,我们看到[user]标签,这就是我们需要同步的user目录,这里需要注意的就是对于文件目录名称的变更。在windows系统下,目录地址为c:\work的,在我们的配置文件path中,需要修改为/cygwin/c/work。同样的,我们的当前想要同步的目录是D:\xxx\user,那么我就写成path =/cygdrive/d/xxx/user。其他的配置就按照给出的模板来配置即可。
配置文件
配置文件内容:
use chroot = false strict modes = false log file = rsyncd.log port = 873 uid=0 gid=0 hosts allow = 10.172.191.172 [user] path = /cygdrive/d/rqt/user read only = false transfer logging = yes list = no auth users = rsync_backup secrets file = etc/rsync.password [static_3] path = /cygdrive/d/rqt/static_3 read only = false transfer logging = yes list = no auth users = rsync_backup secrets file = etc/rsync.password [contract] path = /cygdrive/d/rqt/contract read only = false transfer logging = yes list = no auth users = rsync_backup secrets file = etc/rsync.password
2.2创建密码文件:
2.3启动服务
2.4查看服务是否启动
3.LINUX端配置
3.1Linux端创建密码文件,并修改权限为600
3.2命令测试
客户端推往服务器:
rsync -avzp /etc/hosts rsync_backup@10.173.49.15::test
客户端向服务端拉去文件:
rsync -avzp rsync_backup@10.173.49.15::test/root/test
3.3 同步数据老提示错误 uid4294967295 (-1) is impossible to set on 查资料说是软件bug··· 但是数据同步是不受到影响的。
解决方法:
在server端添加一行参数:
fake super= yes
重启rsync服务即可。再同步就不会出现错误信息了。
3.4 安装inotify
安装
前提 rsnyc 服务配置成功,可以正常在客户端正常推送拉取数据,然后才能配置inotify
Inotify在客户端配置 ,内核必须在2.6以上
必须有以下3个文件
[root@es-server ~]# ll/proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Apr 17 14:45 max_queued_events #监控最大值
-rw-r--r-- 1 root root 0 Apr 17 14:45 max_user_instances
-rw-r--r-- 1 root root 0 Apr 17 14:45 max_user_watches
max_queued_events 改大, 例如:50000000
max_user_instances 改大, 例如:320000
max_user_watches 改大,例如:8192
下载源码包
inotify-tools下载地址:
http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
cd /usr/local/src
tar zxvf inotify-tools-3.14.tar.gz #解压
cd inotify-tools-3.14 #进入解压目录
./configure--prefix=/usr/local/inotify-tools-3.14 #配置
make #编译
make install #安装
3.5 同步脚本
脚本:
#!/bin/bash host01=10.162.222.27 src=/project/rqt/contract dst=contract user=rsync_backup rsync_passfile=/etc/rsync.password inotify_home="/usr/local/inotify-3.14" if [ ! -e"$src" ] || [ ! -e"${rsync_passfile}" ]|| [ ! -e"${inotify_home}/bin/inotifywait" ]|| [ ! -e"/usr/bin/rsync" ]; then echo "Check File and Folder" exit 9 fi ${inotify_home}/bin/inotifywait-mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f‘ -e close_write,create,attrib$src | while read file do cd $src && rsync -aruz -R ./--timeout=100 $user@$host01::$dst --password-file=${rsync_passfile}>/dev/null 2>&1 sleep 10 cd $src && rsync -aruz -R --timeout=100$user@$host01::$dst --password-file=${rsync_passfile} ./ >/dev/null2>&1 done exit 0
解释:
host01:要同步机器的Ip
src:要同步的目录
dst:目标主机模块名
user:同步用户
rsync_passfile:密码文件,需要和目标主机密码文件一个,注意这个是在本机,只存密码
inotify_home:inotify目录
3.5 运行:sh sync.sh &
4 测试:
4.1 在win端创建testA.txt
4.2 在linux端创建testB.txt
再ls看下win下的testA已经同步过来了
4.3 然后再回到win端,会发现文件testB.txt已经同步过来
4.4 故障排除:http://53cto.blog.51cto.com/9899631/1771826
本文出自 “停止奋斗=停止生命” 博客,请务必保留此出处http://53cto.blog.51cto.com/9899631/1771837