你必须要知道的数据备份工具rsync

数据镜像备份工具:rsync

什么是rsync ?

  rsync 是Linux/UNIX系统下的文件同步工具和数据传输工具,它采用:“rsync算法”使一个客户机和远程文件服务器之间的文件同步。

rsync传输的范围:通过rsync可以将同一个服务器的数据从一个分区备份到另一个分区,也可以将本地系统的数据通过网络传输方式备份到任何一个远程主机上;

rsync可以在中断之后恢复传输;rsync只传输源文件和目标文件之间不一致的部分;

rsync可以执行完整备份或增量备份

rsync的特性:

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

2、可以增量同步数据、文件传输效率高,因而同步时间短

3、可以保持原有文件的权限、时间等属性

4、加密传输数据,保证数据的安全性

5、可以使用rcp、ssh等方式来传输文件,当然也可以直接通过Socket连接传输文件。

6、支持匿名传输

rsync的主页地址为:http://rsync.samba.org/

rsync的应用模式:

第一种:shell应用模式,也称为本地shell模式;

第二种:远程shell应用模式,是利用SSH执行底层连接和加密传输;

第三种:是查询(也叫列表)模式,与ls命令实现的功能类似;

最后一种是服务器模式,平时所说的架设rsync服务器是指这种模式。

下面来说一下这四模式的应用:

1、本地shell模式

本地shell模式主要用于复制指定目录到另外一个目录,例如:

 
  
  1. [root@localhost ~]# rsync -av /var /tmp   // -a 表示以递归的方式传输文件,并保持所有文件的属性;-v 表示输出详细信息。 
  2.  
  3. .... 
  4.  
  5. ..... 
  6.  
  7. var/www/usage/webalizer.png 
  8.  
  9. var/yp/ 
  10.  
  11. var/yp/nicknames 
  12.  
  13. var/yp/binding/ 
  14.  
  15.  
  16.  
  17. sent 65435260 bytes  received 20012 bytes  43636848.00 bytes/sec 
  18.  
  19. total size is 65359881  speedup is 1.00 

 
  
  1. [root@localhost ~]# ls /tmp 
  2.  
  3. var 

这时在/tmp下里有一个var目录

 
  
  1. [root@localhost ~]# rsync -av /var/ /tmp 
  2.  
  3. www/usage/webalizer.png 
  4.  
  5. yp/ 
  6.  
  7. yp/nicknames 
  8.  
  9. yp/binding/ 
  10.  
  11. sent 65435223 bytes  received 20011 bytes  43636822.67 bytes/sec 
  12.  
  13. total size is 65359881  speedup is 1.00 
  14.  
  15. [root@localhost ~]# ls /tmp 
  16.  
  17. account  cache  crash  cvs  db  empty  games  gdm  lib  local  lock  log  mail  nis  opt  preserve  racoon  run  spool  tmp  tux  var  www  yp 

这时在/tmp下有很多目录,这些目录是var下的所有目录。

[root@localhost ~]# rsync -av /var /tmp

[root@localhost ~]# rsync -av /var/ /tmp

对于上面这两个命令所不同之处就是在var后面有没有那个斜杠,

对于第一个命令是就是将指定的源目录复制到指定的目的目录;

对于第二个命令就是复制指定源目录中的内容到目的目录中,而不是目录本身。

而对于目标参数的后面是否有斜杠没有任何作用

2、远程shell模式

通过远程shell模式,rsync可以把指定的本地目录复制到另一个系统中。例如:

 
  
  1. [root@localhost ~]# rsync -av /var 192.168.35.4:test 
  2.  
  3. root@192.168.35.4's password: 
  4.  
  5. .... 
  6.  
  7. ..... 
  8.  
  9. var/www/usage/webalizer.png 
  10.  
  11. var/yp/ 
  12.  
  13. var/yp/nicknames 
  14.  
  15. var/yp/binding/ 
  16.  
  17. sent 65435260 bytes  received 20012 bytes  43636848.00 bytes/sec 
  18.  
  19. total size is 65359881  speedup is 1.00 

  如果以root用户身份来执行此命令,rsync会提示输入远程主机192.168.35.4的root密码。完成密码验证后,会在远程主机的root用户根目录下创建test目录,如果所指定的目录存在则不创建。在默认情况下,rsync使用Secure Shell(SSH)作为传输机制。

3、rsync列表模式

在这个模式下,rsync与ls命令有些相似的功能。例如,查看本地系统中/tmp/var/目录的内容,

 
  
  1. [root@localhost ~]# rsync -a /tmp/var 
  2.  
  3. ... ... 
  4.  
  5. ... ... 
  6.  
  7. -rw-r--r--        3714 2012/06/20 10:26:41 var/www/usage/index.html 
  8.  
  9. -rw-r--r--        1478 2006/07/13 10:18:28 var/www/usage/msfree.png 
  10.  
  11. -rw-r--r--        2056 2012/06/20 10:26:41 var/www/usage/usage.png 
  12.  
  13. -rw-r--r--       29976 2012/06/20 10:26:41 var/www/usage/usage_201206.html 
  14.  
  15. -rw-r--r--        1253 2006/07/13 10:18:28 var/www/usage/webalizer.png 
  16.  
  17. drwxr-xr-x        4096 2012/06/19 17:08:19 var/yp 
  18.  
  19. -rw-r--r--         185 2006/07/13 13:00:59 var/yp/nicknames 
  20.  
  21. drwxr-xr-x        4096 2009/04/15 17:03:41 var/yp/binding 

也可以来查看远程主机的

 
  
  1. [root@localhost ~]# rsync -a 192.168.35.4:test/var 
  2.  
  3. root@192.168.35.4's password:  
  4.  
  5. ... ... 
  6.  
  7. ... ... 
  8.  
  9. -rw-r--r--        3714 2012/06/20 10:26:41 var/www/usage/index.html 
  10.  
  11. -rw-r--r--        1478 2006/07/13 10:18:28 var/www/usage/msfree.png 
  12.  
  13. -rw-r--r--        2056 2012/06/20 10:26:41 var/www/usage/usage.png 
  14.  
  15. -rw-r--r--       29976 2012/06/20 10:26:41 var/www/usage/usage_201206.html 
  16.  
  17. -rw-r--r--        1253 2006/07/13 10:18:28 var/www/usage/webalizer.png 
  18.  
  19. drwxr-xr-x        4096 2012/06/19 17:08:19 var/yp 
  20.  
  21. -rw-r--r--         185 2006/07/13 13:00:59 var/yp/nicknames 
  22.  
  23. drwxr-xr-x        4096 2009/04/15 17:03:41 var/yp/binding 

4、服务器模式

这种模式是基于C/S模式的,这种模式下,rsync在后台启用了一个守护进程,这个进程在rsync服务器永久的运行,用于接收文件传输请求,因此,客户端既可以把文件发送给守护进程,也可以向守护进程请求文件。rsync的服务器模式非常适合于异地的中心备份服务器或数据异地存储库来使用。关于服务器模式的使用方法。

下面来针对这种模式做一个实验:

有两台服务器:A和B 所用的系统是Linux,A 系统作为网站服务器,B作为A的远程容灾备份机,所以A就是rsync的服务器端,B是rsync的客户端。

所用的Linux版本是:Red Hat Enterprise 5.4

内核版本:2.6.18-164.el5

A系统的ip地址:192.168.35.3 255.255.255.0

B系统的ip地址:192.168.35.4 255.255.255.0

在两台服务器上分别下载安装上rsync这个软件,安装过程:

下载地址:http://rsync.samba.org/,这里用的是:rsync-3.0.9 下面进行编译安装:

 
  
  1. # tar zxvf rsync-3.0.9.tar.gz 
  2.  
  3. # cd rsync-3.0.9 
  4.  
  5. # ./configure 
  6.  
  7. # make 
  8.  
  9. # make install 

这样就完成了rsync的安装

下面来为实验做一些配置

1、在A系统上配置rsync

rsync的配置文件为/etc/rsyncd.conf 在安装完rsync时默认是没有这个文件的,手动创建一个就行了。rsync.conf 文件由一个或多个模块结构组成的。

配置文件如下:

uid = nobody

gid = nobody

-------------这两项是指定当该模块传输文件时守护进程应该具有的用户ID和组ID,默认值是“nobody”------------

use chroot = no

max connections = 10

--------这项是指定模块的最大并发连接数量,以保护服务器。如果是0说明没有限制-------

strict modes = yes

----------这项是指定是否检查口令文件的权限,yes为是,no为否,如设置yes,密码文件的权限必须是root用户的权限---------

pid file = /var/run/rsyncd.pid

----rsync守护进程对应的PID文件路径-----------

lock file = /var/run/rsync.lock

-----------用来支持 max connections的锁文件,默认值是 /var/run/rsyncd.lock--------

log file = /var/log/rsyncd.log

----日志文件输出文件路径-----

--------下面定义的是一个模块,也是要复制的内容和一些所要用到的文件定义-----

[ixdba]

path = /var  -------指定要复制的文件或者目录,是必须要设置的项------

comment = ixdba file

ignore errors

--------忽略一些无关的I/O的错误--------

read only = no  -----设置为no表示客户可以上传文件,设置为yes表示只读------

write only = no  -----设置为no表示客户可以下载文件,设置为yes表示不能下载----

hosts allow = 192.168.35.4  ---设置可以连接rsync服务器的主机,也可以设置为 “*” 表示允许连接任何主机-----

hosts deny = 172.16.0.1 ---表示拒绝连接的主机---

list = false ----设定当客户请求可以可以使用的模块列表时,该模块是否被列出来。默认值true,设置为false为隐藏的模块--------

uid = root

gid = root

auth users = backup -----用来定义可以连接该模块的用户名,多个用户可以用逗号或者空格隔开。需要注意的是,这里的用户和Linux系统用户没有任何关系。-------

secrets file = /etc/server.pass ------------------这个一个文件的路径,这个文件是用来定义用户名和密码的。 这个与auth users配合使用的,只有在auth users被定义时,该文件才起作用。这个文件也要自己来创建---------

完整的配置如下:

 
  
  1. uid = nobody 
  2. gid = nobody 
  3. use chroot = no 
  4. max connections = 10 
  5. strict modes = yes 
  6. pid file = /var/run/rsyncd.pid 
  7. lock file = /var/run/rsync.lock 
  8. log file = /var/log/rsyncd.log 
  9.  
  10. [ixdba] 
  11. path = /var 
  12. comment = ixdba file 
  13. ignore errors 
  14. read only = no 
  15. write only = no 
  16. hosts allow = 192.168.35.4 
  17. hosts deny = 172.16.0.1 
  18. list = false 
  19. uid = root 
  20. gid = root 
  21. auth users = backup 
  22. secrets file = /etc/server.pass 

下面来创建/etc/server.pass文件

# vim /etc/server.pass   添加如下内容即可:

backup:ixdba123

还要改变一下这个文件的权限:

# chmod 600 /etc/server.pass

2、在A系统上启动rsync守护进程

执行如下指令启动rsync守护进程:

# /usr/local/bin/rsync --daemon

来查看一下

[root@localhost ~]# ps aux | grep rsync

root      1498  0.0  0.1   4184   552 ?        Ss   15:57   0:00 /usr/local/bin/rsync --daemon

说明进程启动了,再来看一下873端口是否打开了。

[root@localhost ~]# netstat -tlnp | grep rsync

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      1498/rsync          

tcp        0      0 :::873                      :::*                        LISTEN      1498/rsync 

873端口也打开了。这样在A上就配置完成了,下面来B上来做一些工作。

3、在B服务器上配置rsync

在备份机上是不用做太的多设置的,只要执行rsync同步操作即可。为了不在同步的过程中不用输入密码,只要在B服务器上创建一个文件就行了也就相当于A上的server.pass文件

# vim /etc/server.pass

在里面只要有一个密码就行了。

ixdba123 ---这个密码一定要于A服务器上的server.pass文件中写的密码相同不然会出错的。

下面来执行同步操作:

 
  
  1. [root@localhost ~]# /usr/local/bin/rsync -vzrtopg --delete --progress --exclude "*access*" --exclude "debug*" backup@192.168.35.3::ixdba /ixdba.net/ --password-file=/etc/server.pass  

在这个命令中参数的含义如下:

在 “-vzrtopg”选项中,v 是详细模式输出;z表示即在传输时对备份的文件进行压缩处理;r表示递归模式处理;t是用来保持文件时间信息;o是用来保持文件属主信息;p用来保持文件权限;g是用来保持文件的属组信息。

--delete 指定以rsync服务器端为基准进行数据镜像同步,也就是要保持rsync服务器端目录与客户端目录的完全一致。在这里是A为基准进行同步的。

--progress 用于显示数据镜像同步的过程

--exclude 用于排除不需要传输的文件类型。

“backup@192.168.35.3::ixdba”表示对服务器192.168.35.3中的ixdba模块进行备份,也就是指定备份的模块。backup表示使用“backup”这个用户对模块进行备份。

“/ixdba.net”用于指定备份文件在客户端机器上的存放路径,也就是将备份的文件放在备份机的/ixdba.net目录下。

--password-file=/etc/server.pass 用来指定客户机上存放密码文件的位置,这样在客户端执行同步命令就无需输入交互密码。

其实,rsync作为客户端工具,还有很多的选项和参数,更多详细可以man rsync 一下,来查看。

在客户端执行这个命令时可能会出现一些,意想不到的错误,这些错误的解决方法在网上都能找到,在这里也贴出一些常见的错误。

Rsync同步常见问题:

错误一:

@ERROR: auth failed on module xxxxx

rsync: connection unexpectedly closed (90 bytes read so far)

rsync error: error in rsync protocol data stream (code 12) at io.c(150)

解决:这是因为密码设置错了,无法登入成功,检查一下rsync.pwd,看客服是否匹配。还有服务器端没启动rsync 服务也会出现这种情况。

错误二:

password file must not be other-accessible

continuing without password file

Password:

解决:这是因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd

错误三:

@ERROR: chroot failed

rsync: connection unexpectedly closed (75 bytes read so far)

rsync error: error in rsync protocol data stream (code 12) at io.c(150)

解决:这是因为你在 rsync.conf 中设置的 path 路径不存在,要新建目录才能开启同步。

错误四:

rsync: failed to connect to 218.107.243.2: No route to host (113)

rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]

解决:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp 的873端口打开。

我在执行这个命令时出现了最后一种错误,把iptables关闭后,命令就执行成功了。

在客户端也可以定义一个任务计划来实现自动备份也就是加入crontab

 
  
  1. # crontab -e  
  2.  
  3. 或 # vim crontab 
  4.  
  5. */5 * * * * root /usr/local/bin/rsync -vzrtopg --delete --progress --exclude "*access*" --exclude "debug*" backup@192.168.35.3::ixdba /ixdba.net/ --password-file=/etc/server.pass  

保存退出,就执行了。

也可以写成一个脚本来执行。

以上方法是实现了rsync的远程热备份,但不是实时备份,服务器端和客户端的数据有可能存在不一样,因为在备份的时候有一段时间间隔。

很好的是,Linux 2.6.13以后的内核提供了inotify文件系统监控机制,通过rsync与inotify的组合,可以实现rsync服务器端和客户端数据的实时同步。

这个会在下一篇文章中出现。