Linux的日常操作管理中,我们常常会用到同步的功能,文件同步,目录同步,说白了其实就是复制。但是对于我们的CP命令来说,目标是个非常大的文件的话CP命令将会相当占用资源,此时我向大家推荐rsync命令,此命令与cp的不同之处在于,当一个较大文件放生了微小的变化时,rsync只会将变化的那部分数据给同步过去,并不像cp那样把整个文件都复制过去。这样就大大节省了资源。

 

 

一、rsync的特点

特点:

     1、可以镜像保存整个目录树或文件系统;

     2、较高的数据传输效率;

     3、可以借助于ssh实现安全数据传输;

     4、支持匿名传输;

 

rsync命令的工作模式:

        第一种模式:shell模式,也称作本地模式;

        第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;

        第三种模式:列表模式,仅列出源中的内容,-nv

        第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求;

 

 

二、rsync命令的用法

 

rsync命令的选项:

       -n: 同步测试,不执行真正的同步过程;

       -v: 详细输出模式

       -q: 静默模式

       -c: checksum,开启校验功能

       -r: 递归复制

       -a: 归档,保留文件的原有属性;

       -p: 保留文件的权限;

       -t: 保留文件的时间戳;

       -l: 保留符号链接

       -g: 保留属组

       -o: 保留属主

       -D:保留设备文件

       -e ssh: 使用ssh作为传输承载;

       -z: 压缩后传输;

       --progress: 显示进度条

       --stats: 显示如何执行压缩和传输

【示例1

Linux之rsync+inotify_第1张图片



三、配置rsync工作在服务模式下

1、设定rsync服务器端

yum -y install xinetd

chkconfig rsync on

2、为rsync提供配置文件

vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid       pid文件存放处
log file = /var/log/rsyncd.log       log文件存放处

[tools]
path = /data                    服务默认路径
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.0.0/16       允许此网段的访问
hosts deny = *
list = false
uid = root                     以root身份访问
gid = root                     以root组访问


3、启动服务

service xinetd start

监听于873/tcp

注:若要开启rsync服务,首先要修改配置文件/etc/xinetd.d/rsync,把里边的disable = yes 改为disable = no


配置成rsync服务器后的推送与拉取命令

拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

     rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

推送: rsync [OPTION...] SRC... [USER@]HOST::DEST

     rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

【示例2】把本机的/tmp目录推送给 服务器

rsync -a /tmp 172.16.249.29::tools




四、配置rsync服务端启用用户认证的功能

/etc/rsyncd.conf文件中添加如下两行

Linux之rsync+inotify_第2张图片


创建密码文件/etc/rsyncd.passwd

vim /etc/rsyncd.passwd
tom:jsh                       创建用户为tom,密码为jsh
chmod 600 /etc/rsyncd.passwd

注:此文件不能允许其它用户有访问权限,且密码不能超过8个字

这样用户在下次推送或者拉取时就需要输入用户名和密码





五、安装inotify-tools实时触发rsync进行同步

1、查看服务器内核是否支持inotify

Linux之rsync+inotify_第3张图片

2、  安装inotify-tools

cd inotify-tools-3.14    解压
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify   配置
make && make install                 编译安装

3、设置系统环境变量,添加软连接

echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh

source /etc/profile.d/inotify.sh        使设置立即生效

echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf

ln -s /usr/local/inotify/include  /usr/include/inotify

4、修改inotify默认参数(inotify默认内核参数值太小)

修改参数:

sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
vi /etc/sysctl.conf #添加以下代码
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535

参数说明:

max_queued_events:

inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确

max_user_watches:

要同步的文件包含多少目录,必须保证max_user_watches值大于统计结果

max_user_instances:

每个用户创建inotify实例最大值

 

5、创建脚本,实时触发rsync进行同步

vim /usr/local/inotify/rsync.sh   
#!/bin/bash
srcdir=/data
dstdir=/tmp
rsyncuser=tom
rsyncpassdir=/etc/rsyncd.passwd
dstip="172.16.249.29"
for ip in $dstip
do
   rsync -a --progress $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
done
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srcdir |  while read file
do
    for ip in $dstip
    do
       rsync -a --progress $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
       echo "  ${file} was rsynced" >> /tmp/rsync.log 2>&1
    done
done

 
chmod +x /usr/local/inotify/rsync.sh

6、设置脚本开机自动执行

vim /etc/rc.d/rc.local                  编辑,在最后添加一行
bash /usr/local/inotify/rsync.sh &     设置开机自动在后台运行脚本



好了,这就完成了。接下来就是测试了!!!