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 下, 加 �Cn 选项,仅做测试
[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 [email protected]:/tmp/test
[root@mode_11 ~]# ls /tmp/test/
etc
例,传送一个大文件,演示―stats 以及 �Cprogress 选项的效用
[root@php5_6 src]# rsync -rz -e ssh --stats --progress /tmp/all.tar.gz [email protected]:/tmp/test
[email protected]'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文件同步回来
以压缩的方式,并用ssh安全的将11主机上的/tmp/test/all.tar.gz 同步到本地的/root目录下
[root@php5_6 src]# rsync -rz -e ssh --stats --progress [email protected]:/tmp/test/all.tar.gz /root/
[email protected]'s password:
Permission denied, please try again.
[email protected]'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 [email protected]:/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 =>创建一个目录,作为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 [email protected]::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 [email protected]::mydata =>推送到服务器上
Password: =>输入正确的认证密码
去服务器端检查
[root@mode_11 xinetd.d]# ls /data/
abc.abc a.txt bincp.sh my.rsync ==>ok, 文件推送成功
要实现主rsync服务器的数据和 从rsync服务器的数据同步,那该怎么办呢?
我们可以使用一个 inotify 的工具来时时监听 共享目录下的数据是否发生变化,如有变化,则利用脚本,推送给从节点
下载安装文件,解压后配置安装
[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 ==>让输入密码时一路按回车[即,使用空密码生成密钥]
进入 /root/.ssh/查看 id_rsa.pub 文件 , 将这个文件发送到要同步的主机上,并添加到 相应的 /root/.ssh/authorized_keys文件中
将生成的公钥文件传到要同步的主机上
[root@mode_11 .ssh]# rsync id_rsa.pub [email protected]:/root
[email protected]'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 [email protected]
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=/data
[email protected]:/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 [email protected]:/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 ==>已同步