一、RSYNC简介
Rsync (remote sync)是一款开源、快速,多功能、可实现增量的本地或远程数据镜像同步备份优秀工具。它可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 使用所谓的“Rsync演算法”来使本地和远程主机之间的文件达到同步,该算法只传送两个文件中的不同部分,而不是每次都整份传送,因此速度相当快。
二、RSYNC的特性:
1、支持拷贝特殊文件如链接、设备等。
2、可以有排除制定文件或目录同步的功能,相当于打包命令tar。
3、可以做到保持原来文件或目录的权限、时间、软硬连接等所有属性均不改变。
4、可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。
5、可以使用rcp,rsh,ssh等方式配合传输文件,也可以通过直接的socket连接。
6、支持匿名的或认证的进程模式传输,方便进行数据备份及镜像
7、优化的流程,文件传输效率高
三、RSYNC的工作模式:
1、列表模式
和ls -l相似,负责列出源的内容。不仅可以看本地还可以看远端。
2、shell模式,也称为本地模式
和cp相似,本地拷贝文件
3、远程shell模式,可以通过通过rcp,ssh等通道传输
和rcp相似,不过可以实现增量备份,并且能够通过安全的ssh方式进行数据传输。
4、服务器模式
在这种模式下,rsync 守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。
四、RSYNC命令的选项:
-n :同步测试,不执行真正的同步过程。 -v:详细输出模式。 -q:静默模式,这个选项通常用于脚本文件中。 -c:开启校验功能 -r:递归复制 -a: 归档,保留文件的原有属性; -p: 保留文件的权限; -t: 保留文件的时间戳; -l: 保留符号链接 -g: 保留属组 -o: 保留属主 -D:保留设备文件 -e ssh: 使用ssh作为传输承载,借助ssh传输,更安全; -z: 压缩后传输; --progress: 显示进度条 --stats: 显示如何执行压缩和传输
注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;
五、Rsync操作示例:
1、列表模式:显示本地目录中的文件信息,rsync显示目录内文件信息时,类似ls命令:
[root@rsync ~]# rsync /tmp/ drwxrwxrwt 4096 2014/08/23 15:07:37 . -rw-r--r-- 972 2014/08/23 15:07:37 fstab srwxrwxrwx 0 2014/08/23 13:03:12 mysql.sock drwxrwxrwt 4096 2014/08/23 13:03:03 .ICE-unix drwxr-xr-x 4096 2014/08/23 03:44:32 sysroot
注意,如果要显示目录本身信息,目录的名称后不能有路径分隔符/:
[root@rsync ~]# rsync /tmp drwxrwxrwt 4096 2014/08/23 15:07:37 tmp
2、本地模式,将本地目录中的文件复制到其他目录:
[root@rsync ~]# rsync -v /etc/fstab /tmp fstab sent 1041 bytes received 31 bytes 2144.00 bytes/sec total size is 972 speedup is 0.91 [root@rsync ~]# ls /tmp fstab mysql.sock sysroot
3、远程shell模式,语法格式为:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
[root@rsync tmp]# rsync -r --stats -e ssh /etc/pam.d [email protected]:/tmp #向远程服务器端同步数据目录及目录下的文件至对方的/tmp目录下 [email protected]'s password: skipping non-regular file "pam.d/fingerprint-auth" skipping non-regular file "pam.d/password-auth" skipping non-regular file "pam.d/smartcard-auth" skipping non-regular file "pam.d/smtp" skipping non-regular file "pam.d/system-auth" Number of files: 56 Number of files transferred: 50 Total file size: 13978 bytes Total transferred file size: 13887 bytes Literal data: 13887 bytes Matched data: 0 bytes File list size: 1145 File list generation time: 0.001 seconds File list transfer time: 0.000 seconds Total bytes sent: 17199 Total bytes received: 966 sent 17199 bytes received 966 bytes 7266.00 bytes/sec total size is 13978 speedup is 0.77
[root@httpd1 tmp]# ll #在远程服务器端查看推送数据结果 total 4 drwxr-xr-x 2 root root 4096 Aug 23 03:36 pam.d
[root@rsync tmp]# rsync -a --stats -z [email protected]:/etc /tmp #从远程服务器端拉取数据至本地文件系统目录 [email protected]'s password: Number of files: 2190 Number of files transferred: 1372 Total file size: 33312618 bytes Total transferred file size: 33299868 bytes Literal data: 33299868 bytes Matched data: 0 bytes File list size: 62076 File list generation time: 0.001 seconds File list transfer time: 0.000 seconds Total bytes sent: 28783 Total bytes received: 10185815 sent 28783 bytes received 10185815 bytes 756636.89 bytes/sec total size is 33312618 speedup is 3.26
[root@rsync tmp]# ls #查看拉取到的数据文件 etc fstab mysql.sock sysroot
需要注意:同步数据的命令重复执行时,rsync的工作机制是传输差异部分数据,所以如果数据完全相同,是不会发生真正的数据传送的,在传输结果的信息字段Number of files中显示的结果是0:
[root@rsync ~]# rsync -a --stats -z [email protected]:/etc /tmp [email protected]'s password: Number of files: 2195 Number of files transferred: 0 Total file size: 33313611 bytes Total transferred file size: 0 bytes Literal data: 0 bytes Matched data: 0 bytes File list size: 62199 File list generation time: 0.001 seconds File list transfer time: 0.000 seconds Total bytes sent: 261 Total bytes received: 63163 sent 261 bytes received 63163 bytes 18121.14 bytes/sec total size is 33313611 speedup is 525.25
4、服务器模式,RSYNC工作为守护进程,能够接收客户端的同步请求,服务器端要有一个存放数据的目录,客户端可以向服务器端推送数据,也可以从服务器端拉取数据,工作在服务器模式的RSYNC可以交由xinetd代为管理,需要安装xinetd,然后启动xinetd和RSYNC服务。
[root@rsync ~]# yum install -y xinetd # [root@rsync ~]# chkconfig rsync on #启动rsync服务 [root@rsync ~]# chkconfig --list # 查看服务启动结果 xinetd based services: chargen-dgram: off chargen-stream:off daytime-dgram: off daytime-stream:off discard-dgram: off discard-stream:off echo-dgram: off echo-stream: off rsync: on tcpmux-server: off time-dgram: off time-stream: off
创建服务器端数据目录,并提供RSYNC的配置文件,这个配置文件需要手动编辑,配置示例:
[root@rsync ~]# mkdir /data
[root@rsync ~]# vim /etc/rsyncd.conf # Global Settings uid = nobody gid = nobody use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Directory to be synced [tools] path = /data ignore errors = yes read only = no write only = no hosts allow = 172.16.0.0/16 hosts deny = * list = true uid = root gid = root
[root@rsync ~]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ]
查看服务监听的结果:
[root@rsync ~]# ss -tnlp | grep xinetd LISTEN 0 64 :::873 :::* users:(("xinetd",3164,5))
注意:由于rsyncd.conf文件是手动编辑提供的,而程序启动的时候却需要读取该文件,该文件在编辑时提供的名称一定要写为rsyncd.conf,如果文件名称不正确在服务器端的日志中可以查看到错误提示:
[root@rsync data]# tail /var/log/messages #服务器端操作 Aug 23 17:07:32 rsync xinetd[3251]: START: rsync pid=3262 from=::ffff:192.168.2.2 Aug 23 17:07:32 rsync rsyncd[3262]: rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory (2) [root@httpd1 tmp]# rsync /etc/fstab 192.168.2.1::tools #客户端操作 rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(759) [sender=3.0.6]
推送示例一:
[root@httpd1 ~]# rsync /etc/fstab 192.168.2.1::tools #客户端操作,推送数据 [root@rsync data]# ls #服务器端操作,查看推送结果 fstab
推送示例二:
[root@httpd1 ~]# rsync /etc/fstab rsync://192.168.2.1/tools #客户端操作,推送数据 [root@rsync data]# ls #服务器端操作,查看推送结果 fstab
拉取示例一:
[root@httpd1 tmp]# ls #客户端用以存放数据的目录下的原文件 pam.d root@httpd1 tmp]# rsync -a 192.168.2.1::tools /tmp #客户端从服务器端拉取整个数据目录下的文件 [root@httpd1 tmp]# ls #查看客户端拉取操作后得到的数据 CentOS-Base.repo.bak CentOS-Media.repo fstab pam.d CentOS-Debuginfo.repo CentOS-Vault.repo local.repo [root@httpd1 tmp]# rsync -a 192.168.2.1::tools/issue /tmp #客户端拉取服务器端数据目录下的单个文件操作 [root@httpd1 tmp]# ls #查看客户端拉取操作后得到的数据 CentOS-Base.repo.bak CentOS-Media.repo fstab local.repo CentOS-Debuginfo.repo CentOS-Vault.repo issue pam.d
拉取示例二:
[root@httpd1 tmp]# rsync -a rsync://192.168.2.1/tools/fstab ./ #使用rsync://协议的方式拉取数据 [root@httpd1 tmp]# ls fstab pam.d
服务器模式下还可以以授权用户的方式让用户来获取或推送数据,而不仅仅是基于IP地址的方式来访问服务器端,首先,需要在服务器端的配置文件中添加用户的白名单列表和相应的密码文件,密码文件中保存了对应用户的密码信息。
配置文件示例: # Global Settings uid = nobody gid = nobody use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Directory to be synced [tools] path = /data ignore errors = yes read only = no write only = no hosts allow = 192.168.2.0/24 hosts deny = * list = true uid = root gid = root auth users = user1,user2 secrets file = /etc/rsyncd.passwd
创建密码文件:
[root@rsync data]# echo -e "user1:redhat\nuser2:redhat" > /etc/rsyncd.passwd [root@rsync data]# chmod 600 /etc/rsyncd.passwd [root@rsync data]# cat /etc/rsyncd.passwd user1:redhat user2:redhat
重启服务:
[root@rsync data]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ]
基于用户名从Rsync服务器拉取数据:
[root@httpd1 tmp]# rsync -r [email protected]::tools ./
Password:
[root@httpd1 tmp]# ls
CentOS-Base.repo.bak CentOS-Media.repo fstab local.repo
CentOS-Debuginfo.repo CentOS-Vault.repo issue pam.d
基于用户名从Rsync服务器推送数据:
[root@httpd1 tmp]# rsync /etc/rc.d/rc.sysinit [email protected]::tools #客户端操作 [root@rsync data]# ls #服务器端查看推送结果 CentOS-Base.repo.bak CentOS-Media.repo fstab local.repo CentOS-Debuginfo.repo CentOS-Vault.repo issue rc.sysinit