什么是Rsync?

rsync可以实现增量备份,配合inotify可以实现时事的数据备份


Rsync的三种工作模式

1)本地备份,相当于 cp 命令

将 /etc/hosts 文件拷贝到 /tmp/ 目录下

rsync -avz /etc/hosts /tmp/

删除一个目录

先新建一个空目录,然后使用 rsync 命令同步

mkdir /zhao

添加 --delete参数,目录 zhao 为空

rsync --delete /zhao/ /tmp/

命令解释:以前面的目录为准,前面目录有啥后面目录有啥,前面目录没有的,后面目录也不能有

2)通过网络远程 shell

push(推)

将本地的 /tmp/ 目录中的内容推到 192.168.133.130 的 /opt/ 目录下

rsync -avzP -e 'ssh -p 22' /tmp/ [email protected]:/opt/

pull(拉)

将 192.168.133.130 的 /tmp/ 目录下的文件拉到本地的 /opt/ 目录下

如果下面的命令 /tmp/ 写为 /tmp 则拉去的是 tmp 的整个目录

rsync -avzP -e 'ssh -p 22' [email protected]:/tmp/ /opt/

3)daemon模式

daemon是我们平时工作中最长用的一种模式,本篇文章也主要是介绍的daemon模式


rsync 客户端的常用参数

-a 归档模式,表示以递归方式传输文件,并保持所有文件属性

-v 详细模式输出,传输时的进度等信息

-z 传输时进行压缩以提高传输效率

-r 对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r

-t 保持文件时间信息

-o 保持文件属主信息

-p 保持文件权限

-g 保持文件属组信息

-P 显示同步的过程及传输时的进度等信息

-D 保持设备文件信息

-l 保留软连接


配置 daemon 模式

在配置 daemon 模式前需要准备两台虚拟机,我的虚拟机是CentOS6.7 64位

两台的系统都一样,详细截图如下

uname -r

cat /etc/redhat-release      

p_w_picpath

正常情况下系统默认就已经安装 rsync,所以我们需要先检查一下两台机器是否已经安装

这里我只截图了一张,但是两台必须都有 rsync 哈

rpm -qa | grep rsync

p_w_picpath


rsync daemon 端操作如下

rsync 默认没有配置文件,那么我们就手动在 daemon 端创建配置文件

touch /etc/rsyncd.conf

编辑 rsyncd.conf 文件

vim /etc/rsyncd.conf

文件内容如下

#Rsync server

#yuci

uid = rsync

gid = rsync

use chroot = no

max connections = 2000

timeout = 600

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

ignore errors

read only = false

list = false

hosts allow = 192.168.0.0/24

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

###################################

[backup]

comment = www by yuci

path = /backup


添加 rsync 用户

useradd -s /sbin/nologin -M rsync

启动 rsync

rsync --daemon

检查 873 端口是否开启

netstat -tlunp | grep 873

p_w_picpath


创建共享目录

mkdir /backup

并将 /backup 目录的属主改为 rsync 用户

chown -R rsync /backup/

Image

因为后面还需要用到 inotify 配合脚本做实时同步,所以需要创建一个密码文件

用户就是之前 rsyncd.conf 文件中的 auth rsync 用户

echo "rsync_backup::123456" > /etc/rsync.password

Image

安全考虑还需要更改该文件的权限

chmod 600 /etc/rsync.password

Image

将该服务加到开机自动中

echo "rsync --daemon" >> /etc/rc.local

tail -1 /etc/rc.local

Image

到此为止,rsync 的 daemon 端操作完成


rsync 客户端的操作

还是在 client 端查看系统中安装了 rsync 软件

rpm -qa | grep rsync    

p_w_picpath


创建一个密码文件,内容只需要有密码即可

因为我们下面连接时,必须要指定连接的用户,并修改这个文件的权限

echo "123456" > /etc/rsync.password

chmod 600 /etc/rsync.password


现在开始测试服务是否搭建成功,在测试前介绍一下环境

服务端:daemon  地址 192.168.133.131

客户端:client  地址 192.168.133.130

现在我在 client 端测试推送功能,在 133.130 机器的 /tmp/ 目录里我创建了从1到5的5个目录,尝试推送到 133.131 的 /backup 目录中

rsync -avz /tmp/ [email protected]::backup --password-file=/etc/rsync.password

Rsync+inotify 实现实时同步数据文件_第1张图片

在 133.131 上查看 /backup 目录

p_w_picpath

推送成功。      


继续返回到 133.130 上测试拉取服务

我将 133.130 的 /tmp 目录清空,尝试拉取 133.131 上的 /backup 目录中的文件

rsync -avz [email protected]::backup /tmp/ --password-file=/etc/rsync.password

Rsync+inotify 实现实时同步数据文件_第2张图片

拉取成功。

可以通过以下脚本配合定时任务完成简单的数据备份


脚本内容如下

#!/bin/bash

path=/backup

dir="`ifconfig eth0 | awk -F '[ :]+' 'NR==2 {print $4}'`_$(date +%F)"

mkdir $path/$dir -p && \

/bin/cp /var/spool/cron/root $path/$dir/cron_root_$(date +%F) && \

/bin/cp /etc/rc.local $path/$dir/rc.local_$(date +%F) && \

rsync -az $path/ [email protected]::backup/ --password-file=/etc/rsync.password

定时任务,每一小时同步一次增量备份(定时任务做好写绝对路径)

00 01 * * * /bin/sh /root/bak.sh > /dev/null 2>&1

每一小时同步一次,在某些情况下似乎达不到预期的标准,那么就需要配合 inotify 进行实时同步了


安装 inotify 软件

安装 inotify 软件的前提 rsync 服务安装成功,可以在客户端推送拉取数据

另外:inotify 是在客户端配置安装的软件,别装错了

检查系统的内核版本,必须要在 2.6.16 以上才可以

uname -r

Image

查看是否有以下三个文件,有这三个文件才表示系统支持 inotify 服务

ls -l /proc/sys/fs/inotify/

Image(1)


编译安装 inotify

tar zxf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure --prefix=/usr/local/inotify-tools-3.14

make && make install


做一个软连接,取出版本号

ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify


inotify 安装目录下的各目录介绍

bin   #inotify执行命令(二进制)

include   #inotify程序所需用的头文件

lib   #动态链接的库文件

share  #帮助文档


手动测试监控,下面的实验是在本机上操作

因为测试监控的是 133.130 上的 /backup 目录,所以需要创建一个 backup 目录,监控 create 命令

mkdir /backup

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e create /backup

(-m  持续监听状态)

在新开一个窗口,在 /backup 目录下创建文件和目录,在之前的窗口查看有无反应

在新窗口下操作

touch test.txt

mkdir zhao

Image(2)

在之前的窗口中查看

Rsync+inotify 实现实时同步数据文件_第3张图片

检测成功。那么我们只需要结合 rsync 的通过推送命令,就可以实现实时同步了。


最终的实时同步脚本命令

#!/bin/bash

host01=192.168.133.131

src=/backup

dst=backup/

user=rsync_backup

rsync_passfile=/etc/rsync.password

inotify_home=/usr/local/inotify/

#panduan

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 --format '%w%f' -e create,close_write,delete,attrib $src | \

while read line

do

   cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} > /dev/null 2>&1

done

exit 0