码迷,mamicode.com
首页 > 其他好文 > 详细

rsync

时间:2016-03-26 20:35:24      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:rsync


1.1   Rsync介绍

1.1.1         什么是Rsync

Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步及备份的优秀工具。Rsync软件使用与Unix/Linux/windows等多种操作系统平台。

1.2         Rsync简介

Rsync全称为Remote Rynchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似SSH自带的SCP命令,但又优于SCP命令的功能,SCP每次都是全量拷贝,Rsync可以增量拷贝(但,SCP是加密的)。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也由于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。利用Rsync还可以实现删除文件和目录的功能,这又相当于rm命令

在同步备份数据时,默认情况下,Rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。

1.1.3         Rsync的特性

  支持拷贝特殊文件,如链接文件,设备文件等

  可以排除指定文件或目录同步的功能,相当于打包命令tar的排除功能

  可以做到保持源文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变-p

  可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高

  可以使用rcprshssh等方式来配合传输文件(rsync本身不对数据加密)

  可以通过socket(进程当时)传输文件和数据(服务端和客户端)

  支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像

1.1.4         Rsync的企业工作场景说明

企业需求:

两台服务之间同步数据

客户服务器数据同步到备份服务器

rsync+inotifyrsync+sersync进行增量备份,inotifysersync检查文件差异,rsync进行备份


1.1.5         Rsync的工作方式

Rsync大致使用三种主要的传输数据的方式,分别为:

  • 单个主机本地之间的数据传输(此时类似于CP命令的功能)

  • 借助rcp,ssh等通道来传输数据(此时类似于SCP命令的功能)

  • 以守护进程(socket)的方式传输数据(这个是rsync自身的重要功能)

以上的几种rsync的工作方式,可以通过man rsync帮助或者查看官方手册获得。

2.1.1   本地数据传输模式(Local-Only mode

      Rsync本地传输模式的语法为:

       Local:  rsync [OPTION...] SRC...[DEST]

      语法说明:

  1. Rsync为同步的命令;

  2. [OPTION……]为同步时的参数选项;

  3. SRC为源,即待拷的分区、文件或目录等;

  4. [DEST]为目的分区、文件或目录等;

实例1:把系统的hosts文件同步到/tmp目录

[root@lab-1-C6~]# rsync /etc/hosts /tmp
[root@lab-1-C6~]# ll /tmp
-rw-r--r--.1 root root  176 Jan  9 16:34 hosts
 
[root@lab-1-C6~]# rsync -avz /etc/hosts /tmp
sendingincremental file list
hosts
 
sent 142bytes  received 31 bytes  346.00 bytes/sec
total sizeis 176  speedup is 1.02

      实例2:删除/tmp目录下的内容

[root@lab-1-C6~]# mkdir /null
[root@lab-1-C6~]# rsync -r --delete /null/ /tmp/   #将/null里面的内容复制到/tmp目录下
[root@lab-1-C6~]# ll /tmp
total 0

 

2.1.2借助SSH通道在不同主机之间传输数据

[szk@lab-1-C6~]$ rsync -avz /etc/hosts -e ‘ssh -p 60522‘ szk@192.168.37.102:~
sendingincremental file list
hosts
 
sent 149bytes  received 31 bytes  3.50 bytes/sec
total sizeis 183  speedup is 1.02
[szk@lab-2-C6~]$ ll
总用量 8
-rw-r--r--.1 szk szk 183 1月   9 16:53 hosts
[szk@lab-1-C6~]$ rsync -avz  -e ‘ssh -p 60522‘szk@192.168.37.102:~/hosts /tmp
receivingincremental file list
hosts
 
sent 30bytes  received 165 bytes  3.79 bytes/sec
total sizeis 183  speedup is 0.94
[szk@lab-1-C6~]$ ll /tmp
total 4
-rw-r--r--.1 szk szk 183 Jan  9 16:53 hosts

2.1.3以守护进程(socket)的方式传输数据

======================服务端配置
/etc/rsyncd.conf    rsync服务端配置文件,需手工创建
[root@lab-1-C6~]# cat  /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot= no
maxconnections = 200
timeout =300
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file =/var/log/rsyncd.log
[szk]
path =/szk/
ignoreerrors
read only =false
list =false
hoses allow= 192.168.37.0/24
hosts deny= 0.0.0.0/32
auth users= rsync_backup
secretsfile = /etc/rsync.password
[root@lab-1-C6~]# rsync --daemon   #以daemon模式启动
[root@lab-1-C6~]#echo “/usr/bin/rsync --daemon” >>/etc/rc.local
[root@lab-1-C6~]# netstat -lntup | grep 873
tcp        0     0 0.0.0.0:873                0.0.0.0:*                   LISTEN      1077/rsync         
tcp        0     0 :::873                     :::* 
[root@lab-1-C6~]# cat /var/log/rsyncd.log   #查看rsync报错日志
2016/01/1314:34:11 [1077] rsyncd version 3.0.6 starting, listening on port 873
2016/01/1314:34:25 [1081] rsync: failed to create pid file /var/run/rsyncd.pid: Fileexists (17)
2016/01/1314:34:25 [1081] rsync error: error in file IO (code 11) at clientserver.c(985)[receiver=3.0.6
[root@lab-1-C6~]# mkdir /szk
[root@lab-1-C6~]# useradd rsync -s /bin/nologin
[root@lab-1-C6~]# chown -R rsync.rsync /szk
[root@lab-1-C6~]# echo "rsync_backup:szk" >/etc/rsync.password #设置rsync虚拟用户的密码
[root@lab-1-C6~]# chmod 600 /etc/rsync.password
[root@lab-1-C6~]# /etc/init.d/iptables status
iptables:Firewall is not running.
[root@lab-1-C6~]# getenforce
Permissive
=====================客户端配置
[root@lab-2-C6~]# rpm -qa rsync
rsync-3.0.6-9.el6_4.1.x86_64
[root@lab-2-C6~]# echo "szk" >/etc/rsync.password
[root@lab-2-C6~]# chmod 600 /etc/rsync.password
[root@lab-2-C6~]# cat  /etc/rsync.password
szk
[root@lab-2-C6szk]# rsync -avz rsync_backup@192.168.37.101::szk /szk--password-file=/etc/rsync.password
receivingincremental file list                  #拉
 
sent 61bytes  received 163 bytes  448.00 bytes/sec
total sizeis 8443214  speedup is 37692.92
[root@lab-2-C6szk]# touch {1..3}
[root@lab-2-C6szk]# rsync -avz /szk/ rsync://rsync_backup@192.168.37.101/szk--password-file=/etc/rsync.password
sendingincremental file list                   #推
./
1
2
3
 
sent 211bytes  received 68 bytes  558.00 bytes/sec
total sizeis 8443214  speedup is 30262.42

相关错误:

1.  认证失败

@ERROR:auth failed on module szk

rsyncerror: error starting client-server protocol (code 5) at main.c(1503)[receiver=3.0.6]

问题为:服务端配置文件与密码文件路径或文件名不匹配

2.2.1 Rsync命令同步参数选项

rsync [OPTION...] SRC... [DEST]

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

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

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

-r 对子目录以递归模式

-t 保持文件时间信息

-o 保持文件属主信息

-g 保持文件属组信息

-p 保持文件权限

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

-D 保持设备文件信息

-l 保留软链接

-e --rsh=COMMAND 使用的信道协议,指定替代rsh的shell程序

--exclude 排除指定文件

--exclude-from=file 排除file文件中指定的文件

--bwlimit=rate 限速

 

 

总结:

服务端

  1. vim /etc/rsyncd.conf (用户,目录,模块,虚拟用户,密码文件)

  2. 创建共享目录 /szk

  3. 创建rsync用户,并且授权访问/szk

  4. 创建密码文件,复制配置文件里的路径,然后添加密码内容(虚拟用户名-密码)

  5. 密码文件权限600

  6. rsync --daemon 然后放入/etc/rc.local,开机启动

  7. tail /var/log/rsyncd.log  ,查看日志

 

客户端

  1. 密码文件和服务端没任何关系

--password-file=/etc/rsync.password  内容:密码
2. /etc/rsync.password  600
3.  同步 
拉:rsync -avzrsync_backup@192.168.37.101::szk /szk --password-file=/etc/rsync.password
推:rsync -avz /szk/rsync://rsync_backup@192.168.37.101/szk
--password-file=/etc/rsync.password

 

排错:

  1. 防火墙和selinux

  2. 日志/var/log/rsyncd.log

  3. 整个部署流程整体考虑排查

 

2.2.2客户端排除打包

--exclude=PATTERN       exclude files matching PATTERN
--exclude-from=FILE     read exclude patterns from FILE  
2.2.2.1 排除单个文件
[root@lab-2-C6szk]# rsync -avz --exclude=a /szk/ rsync://rsync_backup@192.168.37.101/szk --password-file=/etc/rsync.password
sendingincremental file list
./
1
2
3
b
c
d
etc.tar.gz
 
sent7641094 bytes  received 144 bytes  5094158.67 bytes/sec
total sizeis 8546712  speedup is 1.12
[root@lab-1-C6szk]# ll
total 8348
-rw-r--r--.1 rsync rsync       0 Jan 13 16:19 1
-rw-r--r--.1 rsync rsync       0 Jan 13 16:19 2
-rw-r--r--.1 rsync rsync       0 Jan 13 16:19 3
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 b
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 c
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 d
-rw-r--r--.1 rsync rsync 8546712 Jan 13 20:
2.2.2.2 排除多个
--exclude={1..3}
[root@lab-2-C6szk]# rsync -avz --exclude-from=paichu.log /szk/ rsync://rsync_backup@192.168.37.101/szk--password-file=/etc/rsync.password
sendingincremental file list
./
a
b
c
d
etc.tar.gz
paichu.log
 
sent7641067 bytes  received 125 bytes  15282384.00 bytes/sec
total sizeis 8546718  speedup is 1.12
[root@lab-2-C6szk]# cat paichu.log
1
2
3
[root@lab-1-C6szk]# ll
total 8352
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 a
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 b
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 c
-rw-r--r--.1 rsync rsync       0 Jan 13 15:42 d
-rw-r--r--.1 rsync rsync 8546712 Jan 13 20:28 etc.tar.gz
-rw-r--r--.1 rsync rsync       6 Jan 14 13:18 paichu.log

2.2.3服务端排除打包(不灵活)

[root@lab-1-C6szk]# echo "exclude=a b" >> /etc/rsyncd.conf
[root@lab-1-C6szk]# kill “/var/run/rsyncd.pid”
[root@lab-1-C6~]# rsync --daemon
[root@lab-2-C6szk]# rsync -avz  rsync://rsync_backup@192.168.37.101/szk /szk  --password-file=/etc/rsync.password
receivingincremental file list
./
1
2
3
c
d
etc.tar.gz
paichu.log
 
sent 197bytes  received 7641196 bytes  5094262.00 bytes/sec
total sizeis 8546718  speedup is 1.12

2.2.4无差异双向同步

一般是有需要两台服务器之间,必须要求数据一致,且实时性又不是很高的情况,如两台负载均衡下面Web服务器之间的同步,或者高可用双机配置之间的同步等,rsync无差异同步非常的危险,而且,有很多的替代方案,因此,生产场景没有特殊的需求,应避免使用。

备份风险:本地有啥,远端就有啥,本地没有的远端有也要删除。服务器端的目录数据可能丢失

 

2.2.5多目录共享实战

[root@lab-1-C6data]# tail -5 /etc/rsyncd.conf
secretsfile = /etc/rsync.password
[szk]
path =/szk/
[data]
path =/data/

2.2.6常见错误

  • 服务端无共享目录错误

  • 没有目录共享权限

  • 防火墙或Selinux未放行

  • 服务端密码文件权限放大错误

 

2.2.7 本地打包脚本

#!/bin/bash
ip=$(ifconfigeth1 | sed -n ‘s#^.*addr:\(.*\) B.*$#\1#gp‘)
[ ! -d/backup/$ip ] && mkdir -p /backup/$ip
cd/backup/$ip &&tar zcfbak_&(date +%F).tar.gz /var/www/html/ /app/logs/  /sh /var/spool/cron/ /etc/
rsync -az/backup/ rsync-backup@192.168.37.1::backup/ --password-file=/etc/rsync.password
find/backup -type f -name "*.tar.gz"

2.2.8错误小结

[root@lab-1-C6~]# rsync -avz /etc/hosts -e ‘ssh -p 60522‘ root@192.168.1.202:~
rsync:Failed to exec ssh: No such file or directory (2)
rsyncerror: error in IPC code (code 14) at pipe.c(84) [sender=3.0.6]
rsync:connection unexpectedly closed (0 bytes received so far) [sender]
rsyncerror: error in rsync protocol data stream (code 12) at io.c(600)[sender=3.0.6]
 
解决方法:
yum install-y openssh-clients


本文出自 “抚琴煮酒” 博客,请务必保留此出处http://szk5043.blog.51cto.com/8456440/1755464

rsync

标签:rsync

原文地址:http://szk5043.blog.51cto.com/8456440/1755464

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!