rsync

rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用

下行同步

超详细CentOS6.5配置rsync+inotify实现同步
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端
而负责响应来自客户机的rsync同步操作的服务器称为同步源
在同步过程中,同步源负责提供文档的原始位置,发起端应对该位置具有读取权限

inotify

超详细CentOS6.5配置rsync+inotify实现同步
inotify是一个Linux特性,它监控文件系统操作,比如读取、写入和创建。inotify反应灵敏,用法非常简单,并且比cron任务的繁忙轮询高效得多。将rsync工具与inotify机制相结合,可以实现实时同步,只要原始位置发生变化,就立即启动增量备份操作,否则处于静默等待状态,这样避免了按固定周期备份时存在的延时性、周期过密性等问题

实验环境

  • 系统环境:centos6.5
  • 同步源IP:192.168.100.96/24
  • 同步源主机名:redhat6_4
  • 发起端IP:192.168.100.97/24
  • 发起端主机名:redhat6_5
  • 共享模块站点:/var/www/html

搭建步骤:

一、准备工作

1、同步源端、发起关闭防火墙、Selinux

[root@redhat6_4 ~]# vim /etc/sysconfig/selinux
超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_4 ~]# chkconfig iptables off #开机启动关闭防火墙
超详细CentOS6.5配置rsync+inotify实现同步

二、配置同步源服务器

1、建立并编辑主配置文件

[root@redhat6_4 ~]# rpm -qa | grep 'rsync'
超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_4 html]# vim /etc/rsyncd.conf #centos6中,配置文件需要手工建立,但是在centos7中系统事先已经建立

全局配置

uid = nobody #指定执行用户(系统伪用户)
gid = nobody #指定用户组
use chroot = yes #将用户禁锢在当前目录下(源目录)
address = 192.168.100.96 #服务器监听地址
port 873 #服务端口
log file = /var/log/rsyncd.log #日志存放位置
pid file = /var/run/rsyncd.pid #进程ID文件存放位置
host allow = 192.168.100.0/24 #允许访问的客户端地址

模块定义

[page] #共享模块名称
path = /var/www/html #共享目录的实际路径
conmment = This is the site directory of a site #描述信息
read only = yes #是否为只读文件,yes代表只读,反之可以写,这里暂时制作备份,定义"yes"即可
dont compress = .gz .bz2 .tgz .zip .rar .z #同步时不再压缩的文件类型
auth users = rcuser #指定授权账户,如果多个用户以空格进行分割,此用户不是系统用户,只是指定一个专门进行的备份的一个账户而已
secrets file = /etc/rsyncd_users.db #存放账户信息的数据文件

2、建立并编辑账户数据文件

[root@redhat6_4 ~]# vim /etc/rsyncd_users.db
超详细CentOS6.5配置rsync+inotify实现同步
[root@redhat6_4 ~]# chmod 600 /etc/rsyncd_users.db #修改权限,这里必须改,否则客户端远程同步会报错,认证有问题,亲测!!!

3、同步源安装httpd并写入测试文件

[root@redhat6_4 ~]# yum -y install httpd
[root@redhat6_4 ~]# /etc/init.d/httpd start
[root@redhat6_4 ~]# cd /var/www/html/
[root@redhat6_4 html]# rm -rf *
[root@redhat6_4 html]# echo "<h1>hello world </h1>" > index.html
[root@redhat6_4 html]# chmod 777 /var/www/html/ #修改权限最大化,方便测试

4、启动rsync服务

[root@redhat6_4 ~]# rsync --daemon
[root@redhat6_4 ~]# netstat -anpt | grep ":873"

超详细CentOS6.5配置rsync+inotify实现同步

三、发起端使用rsync备份工具进行下行同步

1、使用rsync命令实现下行同步

[root@redhat6_5 ~]# rsync -avz rcuser@192.168.100.96::page /root/ #访问同步源模块page,下载到本地/root目录下进行备份

参数解析:

-r:递归模式,包含目录及子目录中的所有文件
-l:对于符号链接文件仍然复制为符号链接文件(软链接)
-v:显示同步过程的详细(verbose)信息
-a:归档模式,保留文件的权限、属性等信息,等同于组合选项"-rlptgoD"
-z:在传输文件时进行压缩(compress)
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-H:保留硬连接文件
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件

超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_5 ~]# mkdir /opt/pub 
[root@redhat6_5 ~]# rsync -avz rsync://rcuser@192.168.100.96/page /opt/pub/ #再次请求同步源服务将页面备份到/opt/pub/下

超详细CentOS6.5配置rsync+inotify实现同步

2、删除同步源服务器共享模块文件测试

[root@redhat6_4 ~]# cd /var/www/html/
[root@redhat6_4 html]# rm -rf *
[root@redhat6_4 html]# echo "123" > file1#写入测试文件
[root@redhat6_4 html]# echo "456" > file2

3、发起端再次发起下行同步

[root@redhat6_5 ~]# rsync -avzH --delete rcuser@192.168.100.96::page /opt/pub/
超详细CentOS6.5配置rsync+inotify实现同步

4、引入周期性计划任务,通过免密访问进行同步管理

[root@redhat6_5 ~]# vim /etc/server.pass #创建用户密码文件
超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_5 ~]# chmod 600 /etc/server.pass #密码文件权限最小化,否则报错
[root@redhat6_5 ~]# crontab -e

超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_5 ~]# /etc/init.d/crond restart
[root@redhat6_5 ~]# chkconfig crond on

四、配置rsync+inotify实时同步

1、调整inotify内核参数

[root@redhat6_5 ~]# vim /etc/sysctl.conf

添加以下参数

fs.inotify.max_queued_events = 16384 #监控事件队列
fs.inotify.max_user_instances = 1024 #最多监控实例数
fs.inotify.max_user_watches = 1048576 #每个实例最多监控文件数

[root@redhat6_5 ~]# sysctl -p #重新刷新文件

2、安装inotify-tools

[root@redhat6_5 ~]# yum -y install gcc gcc-c++ #安装编译器
[root@redhat6_5 ~]# tar xvfz inotify-tools-3.14.tar.gz  #解压
[root@redhat6_5 ~]# cd inotify-tools-3.14 
[root@redhat6_5 inotify-tools-3.14]# ./configure #配置
[root@redhat6_5 inotify-tools-3.14]# make && make install #编译及编译安装

3、使用inotifywait命令进行监控测试

[root@redhat6_5 ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html #对本地网站目录进行递归式实时监控,监控的事件包括修改、创建、移动、删除……

-m:持续的进行监控
-r:递归整个目录
-q:简化
-e:指定监控的事件
modify:修改
create:创建
move:移动
delete:删除
attrib:属性更改
/var/www/html:对此目录进行监控

4、对网站目录内容进行增、删、改、移

超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_5 ~]# cd /var/www/html/ 
[root@redhat6_5 html]# touch abc.txt          #创建测试文件
[root@redhat6_5 html]# echo "12345" > abc.txt #修改测试文件内容
[root@redhat6_5 html]# mv abc.txt fgh.txt     #修改测试文件名称
[root@redhat6_5 html]# rm -rf fgh.txt         #删除测试文件

5、查看监控信息

超详细CentOS6.5配置rsync+inotify实现同步

6、编写触发式同步脚本(将本地站点文件上行源端)

[root@redhat6_5 ~]# vim inotify_rsync.sh

#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ rcuser@192.168.100.96::page/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done

解析脚本:

①.INOTIFY_CMD:执行实时监控
②.RSYNC_CMD:将本地网站目录上行到源端
③.DIRECTORY EVENT FILE指动态监控的信息赋予给这三个变量变量
DIRECTORY :目录,输出的是/var/www/html
EVENT :发生事件,输出的是如create、modify、move……
FILE:文件的名称,输出的是修改、新建的文件名称
④.循环判断此时此刻rsync是否在运行,如果没有,将本地网站目录上行至源端

[root@redhat6_5 ~]# chmod +x inotify_rsync.sh  #添加执行权限
[root@redhat6_5 ~]# echo '/root/inotify_rsync.sh' >> /etc/rc.local #将输出追加至/etc/rc.local中

7、修改同步源配置文件

[root@redhat6_4 ~]# vim /etc/rsyncd.conf
超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_4 run]# kill -9 $(cat /var/run/rsyncd.pid) #杀死rsync进程
[root@redhat6_4 run]# rm -rf /var/run/rsyncd.pid         #必须删除进程文件,再次启动,系统自动生成
[root@redhat6_4 ~]# rsync --daemon                       #启动rsync

[root@redhat6_4 ~]# ll -d /var/www/html/ #查看站点权限

超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_4 ~]# chown nobody:nobody /var/www/html/ #修改所有者、所属组为nobody系统进程进程用户

[root@redhat6_4 ~]# cd /var/www/html/
[root@redhat6_4 html]# rm -rf *  #删除站点目录下的所有文件,方便测试

8、发起端运行同步脚本测试

[root@redhat6_5 ~]# chmod 777 /var/www/html/ #发起端修改权限,设置为最大化
[root@redhat6_5 html]# chown nobody:nobody /var/www/html/ #修改所有者、所属组为nobody系统进程进程用户

[root@redhat6_5 ~]# cd /var/www/html/
[root@redhat6_5 html]# rm -rf *      #清空文件方便测试

[root@redhat6_5 ~]# sh -x inotify_rsync.sh  #执行同步脚本

超详细CentOS6.5配置rsync+inotify实现同步

[root@redhat6_5 html]# echo "this is test html" &gt; /var/www/html/index.html #创建测试页面
超详细CentOS6.5配置rsync+inotify实现同步

9、同步源查看同步结果

[root@redhat6_4 ~]# cat /var/www/html/index.html

超详细CentOS6.5配置rsync+inotify实现同步