首页 > 代码库 > rsync的应用

rsync的应用

rsync是一个远程同步工具,可以在本主机,或者在远程主机上完成数据远程同步,基于rsync算法,检测本主机,或者远程主机源目标之间的数据是否相同,来完成数据同步.

特点:
        1、可以镜像保存整个目录树或文件系统;
        2、较高的数据传输效率;
        3、可以借助于ssh实现安全数据传输;
        4、支持匿名传输;

rsync命令的工作模式:
        第一种模式:shell模式,也称作本地模式;类似cp 命令,但是它仍然基于rsync算法做比较,效率不及cp,所以它不能完全代替cp命令
        第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;可以实现安全传输
        第三种模式:列表模式,仅列出源中的内容,-nv
        第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求;也可以为客户端更新数据, 能push,pull

rsync命令的选项:
        -n: 同步测试,不执行真正的同步过程;
        -v: 详细输出模式
        -q: 静默模式
        -c: checksum,开启校验功能
        -r: 递归复制 

        -a: 归档,保留文件的原有属性;
        -p: 保留文件的权限;
        -t: 保留文件的时间戳;
        -l: 保留符号链接
        -g: 保留属组
        -o: 保留属主
        -D:保留设备文件

        -e ssh: 使用ssh作为传输承载;
        -z: 压缩后传输;

        --progress: 显示进度条
        --stats: 显示如何执行压缩和传输

注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本向;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;

 

例1: 我们将 /etc/passwd 同步到 /tmp 下, 加 –n 选项,仅做测试

[root@mode_11 ~]# rsync -nv /etc/passwd /tmp/      加  -n 选项,仅做测试
passwd

sent 30 bytes  received 15 bytes  90.00 bytes/sec
total size is 1623  speedup is 36.07 (DRY RUN)  =>显示 DRY RUN 就表示仅做测试
[root@mode_11 ~]# ls /tmp/     =>查看 /tmp 目录, 没有passwd文件
my.repo

[root@mode_11 ~]# rsync -v /etc/passwd /tmp/
passwd

sent 1693 bytes  received 31 bytes  3448.00 bytes/sec
total size is 1623  speedup is 0.94
[root@mode_11 ~]# ls /tmp     =>去掉 n 选项后,passwd文件就同步过来了
my.repo  passwd

 

例2, 拷贝 /etc/profile.d 目录,看 加/ 与不加的区别

[root@mode_11 ~]# rsync -r /etc/profile.d/ /tmp/test   =>源目录加/
[root@mode_11 ~]# ls /tmp/test/                       ==>很明显,是将 /etc/profile.d 目录下所有的文件都拷过来
colorls.csh  cvs.csh  glib2.csh  gnome-ssh-askpass.csh  lang.csh  less.csh  qt.csh  udisks-bash-completion.sh  vim.sh
colorls.sh   cvs.sh   glib2.sh   gnome-ssh-askpass.sh   lang.sh   less.sh   qt.sh   vim.csh  

 

[root@mode_11 ~]# rsync -r /etc/profile.d /tmp/test   ==>源目录不加 /
[root@mode_11 ~]# ls /tmp/test/
colorls.csh  cvs.sh     gnome-ssh-askpass.csh  lang.sh   profile.d  udisks-bash-completion.sh  which2.sh
colorls.sh   glib2.csh  gnome-ssh-askpass.sh   less.csh  qt.csh     vim.csh
cvs.csh      glib2.sh   lang.csh               less.sh   qt.sh      vim.sh

 

我们再开一台虚拟机, 用rsync 传输测试一些大文件

-e ssh: 使用ssh作为传输承载;
-z: 压缩后传输;

--progress: 显示进度条

例,本机是 172.16.26.6,将本机上的 /etc 目录,递归并以压缩的方式发送到 172.16.26.11主机上的/tmp/test目录下

[root@php5_6 src]# rsync -rz /etc root@172.16.26.11:/tmp/test

[root@mode_11 ~]# ls /tmp/test/
etc

 

例,传送一个大文件,演示—stats   以及 –progress 选项的效用

image

[root@php5_6 src]# rsync -rz -e ssh --stats --progress /tmp/all.tar.gz root@172.16.26.11:/tmp/test
root@172.16.26.11‘s password:
sending incremental file list
all.tar.gz
   119062528 100%   18.07MB/s    0:00:06 (xfer#1, to-check=0/1)

Number of files: 1
Number of files transferred: 1
Total file size: 119062528 bytes
Total transferred file size: 119062528 bytes
Literal data: 119062528 bytes
Matched data: 0 bytes
File list size: 25
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 119102576
Total bytes received: 31

sent 119102576 bytes  received 31 bytes  10356748.43 bytes/sec
total size is 119062528  speedup is 1.00   ==>输送的结果

 

在目标主机上查看,文件是否传输过来

[root@mode_11 ~]# ls /tmp/test/
all.tar.gz  etc

那么远程传输到本地呢?也很简单,我们把刚才发送过去的 all.tar.gz文件同步回来

image

 

以压缩的方式,并用ssh安全的将11主机上的/tmp/test/all.tar.gz 同步到本地的/root目录下

[root@php5_6 src]# rsync -rz -e ssh --stats --progress  root@172.16.26.11:/tmp/test/all.tar.gz /root/
root@172.16.26.11‘s password:
Permission denied, please try again.
root@172.16.26.11‘s password:
receiving incremental file list
all.tar.gz
   119062528 100%   22.93MB/s    0:00:04 (xfer#1, to-check=0/1)

Number of files: 1
Number of files transferred: 1
Total file size: 119062528 bytes
Total transferred file size: 119062528 bytes
Literal data: 119062528 bytes
Matched data: 0 bytes
File list size: 25
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 30
Total bytes received: 119102581

sent 30 bytes  received 119102581 bytes  8213973.17 bytes/sec
total size is 119062528  speedup is 1.00  ==>同步回本地的结果

[root@php5_6 src]# ls /root
all.tar.gz       apr-1.5.0       bincp.sh        busybox-1.22.1.tar.bz2  httpd-2.4.6  install.log.syslog   nginx-1.4.7         pcre-8.35       

同步结果已然在目标目录中

 

验证rsync的同步工作机制

删除11主机上的/tmp/test/etc下的两个文件

[root@mode_11 test]# rm -f etc/man.config etc/issue

测试同步时,是否只是同步这两个文件

[root@mode_11 test]# rsync -zr -e ssh --stats --progress root@172.16.26.6:/etc /tmp/test/

skipping non-regular file "etc/ssl/certs" ==>例如,如果目标位置,文件已存在,会显示 skipping跳过

etc/issue                       ==>需要同步的,则会显示 传输的进度和速率
          47 100%   45.90kB/s    0:00:00 (xfer#1, to-check=1183/1227)
etc/man.config
        4963 100%    4.73MB/s    0:00:00 (xfer#2, to-check=1168/1227)


rsync 的服务器模式

例,我们将172.16.26.11 作为rsync服务器端

[root@mode_11 xinetd.d]# mkdir /data =http://www.mamicode.com/>创建一个目录,作为rsync的数据同步目录

rsync 平时访问比较少,所以它是委托xinetd 超级守护进程监听

yum install xinetd =>如果超级守护进程没安装,执行该命令安装

如果超级守护进程已安装,在 /etc/xinetd.d目录下,会有一个 rsync 的配置文件

[root@mode_11 test]# cd /etc/xinetd.d/
[root@mode_11 xinetd.d]# ls

chargen-dgram   daytime-dgram   discard-dgram   echo-dgram   rsync

将 rsync 文件中的 disable 选项,改为no,以开启 rsync服务器模式

disable = no

2、为rsync提供配置文件
            /etc/rsyncd.conf 

配置文件分两段:
全局配置段:1个
共享配置段:多个           
    [SHARE_NAME]

配置示例:
# Global Settings 全局配置
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    =>运行日志

# Directory to be synced
[mydata]
path = /data                         =>共享工作目录
ignore errors = yes                => 是否忽略错误[如传输过程中,某一文件出现错误]
read only = no                     =>是否只读
write only = no                    => 是否只可上传, 别人不能看
hosts allow = 172.16.0.0/16   =>订义能访问的列表
hosts deny = *                     => 出了能匹配到的,都不允许
list = false                           =>是否允许列出共享目录列表  
uid = root                           => 共享用户,专门针对这个共享的身份配置
gid = root                           =>共享组, 也是专门针对 rsync 服务订义的

 

注,该服务监听在tcp的873 端口

 

rsync有两种工作模式,一种是从远程服务器上推送数据,另一种是将数据从服务器上更新到本地

例,我们在服务端的主机上的rsync服务目录是 /data

  将本地的文件,推送到服务器上的mydata共享上

[root@php5_6 ~]# rsync bincp.sh 172.16.26.11::mydata

查看服务器上的共享目录

[root@mode_11 ~]# cd /data/
[root@mode_11 data]# ls
a.txt  bincp.sh          =>OK,共享成功

那么,要将rsync服务器上的文件同步到本地,该怎么做呢

[root@php5_6 tmp]# rsync -a 172.16.26.11::mydata/ ./    =>将服务器上的文件同步到本地的当前目录下, 
[root@php5_6 tmp]# ls
a.txt  bincp.sh                    ==>同步OK

如果只想同步某一指定文件,需要在共享目录名称后,加上具体文件名字

[root@php5_6 tmp]# rsync 172.16.26.11::mydata/a.txt ./       =>清空本地/tmp目录, 同步远程服务器上的 mydata共享的a.txt文件
[root@php5_6 tmp]# ls
a.txt

 

在服务器端,单纯的以ip地址段来设定访问权限,不灵活,也不安全,还可以实现以用户认证的方式,来限制访问权限

让服务器端提供用户认证功能

在/etc/rsyncd.conf 主配置文件中

添加如下两行

auth users = robert,judy               ==>认证用户名单
secrets file = /etc/rsyncd.passwd    ==> 配置认证用户密码 , 注意,认证的密码不能超过8位数

 

[root@mode_11 xinetd.d]# vim /etc/rsyncd.passwd =>编辑密码文件

robert:abcabc
judy:abcabc

 

密码认证文件的权限必须是600,否则重启服务会失败

[root@mode_11 xinetd.d]# chmod 600 /etc/rsyncd.passwd

[root@mode_11 xinetd.d]# service xinetd restart  =>重启超级守护进程

 

从远程服务器同步数据到本地

[root@php5_6 tmp]# rsync judy@172.16.26.11::mydata/abc.abc ./   =>同步远程共享目录下的abc.abc文件到本地
Password:                                  =>输入正确密码
[root@php5_6 tmp]# ls
abc.abc    =>OK, 数据同步成功

 

本地推送数据到服务器端

[root@php5_6 tmp]# touch my.rsync         =>在本地创建一个文件
[root@php5_6 tmp]# rsync my.rsync judy@172.16.26.11::mydata      =>推送到服务器上
Password:                              =>输入正确的认证密码

 

去服务器端检查

[root@mode_11 xinetd.d]# ls /data/
abc.abc  a.txt  bincp.sh my.rsync   ==>ok, 文件推送成功

要实现主rsync服务器的数据和 从rsync服务器的数据同步,那该怎么办呢?

我们可以使用一个 inotify 的工具来时时监听 共享目录下的数据是否发生变化,如有变化,则利用脚本,推送给从节点

 

  image 下载安装文件,解压后配置安装

[root@mode_11 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify

[root@mode_11 inotify-tools-3.14]#  make && make install

安装完成后,使用该工具监听 /data目录, 体验一下 inotify的功用 

[root@mode_11 bin]# /usr/local/inotify/bin/inotifywait -mrq -e modify,delete,create,attrib /data

/data/ CREATE b.txt

/data/ ATTRIB b.txt

/data/ DELETE a.txt

另开一个终端,在/data 目录里,创建,删除文件等操作, 上述监听都能监测到

有了这个监听保证,我们可以写一个脚本,让它开机自动运行,就能实现rsync作为主服务器数据发生变化后

向从服务器推送数据了.

在主服务器 11 上生成密钥

[root@mode_11 ~]# ssh-keygen -t rsa   ==>让输入密码时一路按回车[即,使用空密码生成密钥]

image

进入 /root/.ssh/查看 id_rsa.pub 文件 ,   将这个文件发送到要同步的主机上,并添加到 相应的 /root/.ssh/authorized_keys文件中

image

将生成的公钥文件传到要同步的主机上

[root@mode_11 .ssh]# rsync id_rsa.pub root@172.16.26.6:/root

root@172.16.26.6‘s password:   =>正确输入目标主机密码,文件就可以传输过去了

将该文件的内容导入到 /root/ .ssh/authorized_keys 中

[root@php5_6 ~]# cat id_rsa.pub > .ssh/authorized_keys

[root@php5_6 ~]# cat .ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqm/kmH8IJ2aI1mw2Q1zpHTWCY3XvX4XzvRQSG4cpcp8g3uEE6kf00Wm2HaLOZ3qK1ZbgbiNzUrd8fPPDYjRjc0Pz70ehyXnmkQEIsphRM7WFMmeruVjmWe47d7JfT/5fHsqgEJLHxOaN9fTDEn1jy5CPljp0oARg8gBvKlR9TIBiE1yGmncsYBwoan99kpT5KEhkhowQTHORpSkB54bLtGdIjE8C89asF7MmTtGqAG8779aC3r9Jjw2OZQOA42WecJOUNijPm1YFWAVxLVL+mZ0/Ixb4ZKtc0JWLZ2X45JPB4h+3D1EjFHKWMWfPfaHk3jyTPf6sMIZPuejatLNebQ== root@mode_11.cc

我们去 11 主机上连接目标主机,

[root@mode_11 ~]# ssh root@172.16.26.6

Last login: Sun Aug 24 16:33:53 2014 from 172.16.26.176   =>ok,不需要输入密码,就能认证通过了,

OK,前期准备工作都已完成,那么我们可以写脚本了

[root@mode_11 ~]# vim /usr/local/inotify/bin/inotify.sh  ==>编辑这个文件 内容如下

#!/bin/bash

src=http://www.mamicode.com/data

mb_ip=root@172.16.26.6:/data

/usr/local/inotify/bin/inotifywait -mrq -e modify,delete,create,attrib $src | while read file ;do =>当inotifywait 监测到目标目录有变化时,将执行while 循环中的语句

        /usr/bin/rsync -aqz -e ssh  ${src}/ ${mb_ip} && echo $file" send is ok"  ==>利用ssh 协议承载传输,同步本地源和目标机的数据

    #   /usr/bin/rsync -aqz -e ssh /data  root@172.16.26.6:/data

done

[root@mode_11 bin]# ./inotify.sh  运行该脚本

在172.16.26.11上的另一个终端窗口,创建一个 a.txt 文件

[root@mode_11 data]# touch a.txt

在脚本运行窗口查看

[root@mode_11 bin]# ./inotify.sh 

/data/ CREATE a.txt send is ok

/data/ ATTRIB a.txt send is ok   ==>监听端显示,发送已成功

[root@php5_6 data]# ll       ==>在目标主机上查看文件

total 0

-rw-r--r--. 1 root root 0 Aug 24 17:04 a.txt ==>已同步

rsync的应用