RSYNC + inotify介绍与实战
什么是rsync?
如果公司里面有两台web服务器,那么,怎么实现这两台服务器之间的文件同步呢?
Scp复制,当然还有rsync远程同步
那么scp和rsync两者区别在哪里呢?
Scp是复制,从一个服务器复制文件到另一个服务器,相当于Windows的复制粘贴
Rsync是远程同步,比如一台服务器有所改动,如添加或者删除些文件,那么另一台也会自动去同步。
Rsync和scp典型的区别在于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/
然后编辑rsync的conf文件
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结束
原文地址:http://10966380.blog.51cto.com/10956380/1767322