RSYNC + inotify介绍与实战

什么是rsync

如果公司里面有两台web服务器,那么,怎么实现这两台服务器之间的文件同步呢?

Scp复制,当然还有rsync远程同步

 

那么scprsync两者区别在哪里呢?

Scp是复制,从一个服务器复制文件到另一个服务器,相当于Windows的复制粘贴

 

Rsync是远程同步,比如一台服务器有所改动,如添加或者删除些文件,那么另一台也会自动去同步。

 

Rsyncscp典型的区别在于scp是将文件整个都复制过去,rsync是同步文件所改动的地方实时同步

 

 

Rsync缺点:

首先,rsync同步数据 时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的 一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定 会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

 

什么是inotify

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统 中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样 的一个第三方软件。

 

 

Rsync+inotify实时同步

环境

Server 192.168.1.110

backup 192.168.1.120

 

 

首先确认服务端安装rsync服务默认是自带rsync服务所以不用安装

创建共享目录,然后一些文件放入到共享目录里

[root@www ~]# mkdir  /common;cp /etc/init.d/*  /common/

然后编辑rsyncconf文件

Vim /etc/rsyncd.conf

 

 

[root@www etc]# vim rsyncd.conf

[root@www etc]# cat rsyncd.conf

#/etc/rsyncd.conf   设置服务器文件名称

motd file = /etc/rsyncd.motd   该文件中编写提示信息

transfer  logging = yes  开启日志传输功能

log file = /var/log/rsyncd.log  日志名称

pid file = /var/run/rsyncd.pid   pid进程号保存文件名称

lock file = /var/run/rsync.lock  锁文件名称

port = 873  端口号rsync 默认873

address = 192.168.1.110 服务器接口ip地址

uid = nobody  进行数据传输的账户名称默认nobody

gid = nobody   gid 默认nobody

use chroot = no 是否开启root权限不开启

read only = yes  是否允许客户上传数据,这里设置只读

max connection = 10 设置并发连接数

[common]   共享文件的模块

comment = Web content

path = /common  同步目录用path指定

ignore errors  忽略IO错误

#exclude = test/

auth users = tom,jerry 用户

secrets file = /etc/rsyncd.secrets  密码验证文件

hosts allow=192.168.1.0/255.255.255.0  允许哪个网段

hosts deny=*  拒绝所有

list = false  客户端请求显示模块列表,本模块是否显示,默认true

 

然后开始创建rsync同步用户

 

[root@www ~]# echo "tom:pass" >/etc/rsyncd.secrets  创建用户到指定文件里

[root@www ~]# echo "xiaohu:pass" >>/etc/rsyncd.secrets

[root@www ~]# chmod  600 /etc/rsyncd.secrets   给权限

[root@www ~]# echo "welcome rsync" >/etc/rsyncd.motd  设置提示信息

[root@www ~]# rsync –daemon 启动rsync

[root@www ~]# echo "/usr/bin/rsync --daemon" >> /etc/rc.local   添加到开机启动文件里

[root@www ~]# iptables –F 关闭防火墙

 

 

 

 

客户端同步数据

[root@localhost ~]# rsync  -vzrtopg --progress jerry@192.168.1.110::common  /test

welcome to access

 

Password:

receiving incremental file list

created directory /test

./

abrtd

        1708 100%    1.63MB/s    0:00:00 (xfer#1, to-check=63/65)

acpid

        1725 100%    1.65MB/s    0:00:00 (xfer#2, to-check=62/65)

atd

        2122 100%    1.01MB/s    0:00:00 (xfer#3, to-check=61/65)

auditd

        3378 100%    1.61MB/s    0:00:00 (xfer#4, to-check=60/65)

 

 

OK 同步成功

 

到这里我们的rsync就完事了

如果要实现无密码登录呢?

需要在客户端创建密码文件给600权限

[root@localhost ~]# echo "111" > /etc/rsync.pass

[root@localhost ~]# chmod  600 /etc/rsync.pass

再次同步加参数—password-file

[root@localhost ~]# rsync  -avz --delete --password-file=/etc/rsync.pass  jerry@192.168.1.110::common  /test

编写一个脚本,让文件自动同步。不用手动输入命令

 

[root@localhost ~]# cat check_rsync.sh

#!/bin/bash

#this is rsync fuzhi jiaoben

export PATH=/bin:/usr/bin:/usr/local/bin

SRC=common

BEN=o

Server=192.168.1.110

user=jerry

passwd=/etc/rsync.pass

#kaishifuzhi

[ ! -d  $BEN ] && mkdir $BEN

rsync -az --delete  --password-file=$passwd  ${user}@${Server}::$SRC $BEN/$(date+%Y%m%d)

 

 

那么rsync只是同步,那么如何给他做到实时t同步,比如文件发生一个小改动,怎么同步?

 

那么就用到inotify

 

安装inotify

[root@localhost ~]# tar zxf inotify-tools-3.14\ \(1\).tar.gz

[root@localhost ~]# cd inotify-tools-3.14

[root@localhost inotify-tools-3.14]# ./configure &&make && make install

 

创建监控文件,然后打开终端查看这个文件,看看inotify反应

[root@localhost ~]# mkdir -p /tast; echo "hello">/tast/foo

[root@localhost ~]# inotifywait  /tast/

Setting up watches.

Watches established.

/tast/ OPEN,ISDIR

 

 

写一个脚本实时监控rsync日志相关信息

脚本文件

[root@localhost ~]# cat jiankong.sh

#!/bin/bash

while inotifywait -e modify /var/log/rsyncd.log

do

if tail -n1 /var/log/rsyncd.log

then

echo love

fi

done

测试情况

[root@localhost ~]# sh jiankong.sh

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:47 [29061] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:47 [29061] connect from UNKNOWN (192.168.1.120)

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:49 [29061] rsync on common/ from jerry@unknown (192.168.1.120)

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:49 [29061] building file list

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:49 [29061] sent 924 bytes  received 58 bytes  total size 251858

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:58 [29082] params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:58 [29082] connect from UNKNOWN (192.168.1.120)

love

Setting up watches.

Watches established.

/var/log/rsyncd.log MODIFY

2016/04/18 08:11:59 [29082] auth failed on module common from unknown (192.168.1.120): password mismatch

love

Setting up watches.

Watches established.

 

 

[root@localhost ~]# cat jiankong.sh

#!/bin/bash  变量

while inotifywait -e modify /var/log/rsyncd.log  条件 监控rsyncd.log文件

do  循环

if tail -n1 /var/log/rsyncd.log  指令 如果rsyncd.log第一行更新会打印出来,并循环

then  然后

echo love  提示love

fi  结束

done结束