2.7.1 rsync的概念



《构建高可用Linux服务器》第2章FreeBSD8.1在企业中的部署应用,本章将会详细讲解FreeBSD8.1的安装、最小化安装后的优化、jail虚拟机的部署,以及FreeBSD8.1下的应用部署。希望大家通过本章的学习,能够很好地掌握FreeBSD8.1的基础知识,并且可以快速地搭建自己的开发环境和测试环境。本节为rsync的概念。 




2.7 在FreeBSD8.1与Centos5.5下搭建rsync服务器

2.7.1 rsync的概念

rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地主机和远程主机之间的文件达到同步,这个算法并不是每次都整份传送,它只传送两个文件的不同部分,因此速度相当快。

rsync的优点如下:

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

可以很容易地做到保持原来文件的权限、时间、软硬链接等。

无须特殊权限即可安装。

拥有优化的流程,文件传输效率高。

可以使用rsh、SSH等方式来传输文件,当然也可以直接通过socket连接。

支持匿名传输。

另外,与scp相比,传输速度不是一个数量级的。我们在局域网时经常用rsync和scp传输大量MySQL数据库文件,发现rsync至少比scp快20倍以上。所以大家如果需要在Linux/Unix服务器之间互传海量数据,rsync是最好的选择。



 




2.7.2 在Centos5.5下配置rsync服务器(1)

具体安装步骤如下:

首先准备一台Centos5.5,系统为64位Centos、IP为192.168.21.41,将其作为rsync服务器。另外准备一台64-bit FreeBSD8.1、IP为192.168.21.44的机器作为其客户端。

具体的安装步骤不多说,只介绍重点内容。首先检查rsync是否安装,命令如下:



  1. rpm –q rsync  
  2. rsync-2.6.8-3.1 



上面的结果说明rsync已安装,如果出现package rsync is not installed提示,则说明这个软件包没有安装,大家可以使用如下命令进行安装:

yum –y install rsync另外,关闭防火墙和SELinux,因为是在内网中传输,所以没必要打开。关闭它们,免得引起不必要的麻烦,命令如下:



  1. service iptables stop  
  2. chkconfig iptables off  
  3. setenforce 0 



下面分享一下我自己定义的配置文件/etc/rsyncd.conf(说明:

此文件并不是系统创建的,你也可以给它取不同的名字)。先给出具体代码,后面再进行详细注释,代码如下:


1. uid=nobody
2. gid=nobody
3. user chroot=no
4. max connections=200
5. timeout=600
6. pid file=/var/run/rsyncd.pid  
7. lock file=/var/run/rsyncd.lock  
8. log file=/var/log/rsyncd.log  
9. [backup]  
10. path=/backup/  
11. ignore errors  
12. read only=no
13. list=no
14. hosts allow=192.168.21.0/255.255.255.0  
15. auth users=test
16. secrets file=/etc/rsyncd.password

下面说明一下/etc/rsyncd.conf的语法。


  1. uid=nobody


上面指的是进行备份的用户,nobody为任何用户。


  1. gid=nobody


表示进行备份的组,nobody为任意组。


  1. use chroot=no


如果use chroot指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做可实现额外的安全防护功能,但缺点是需要给用户root权限,并且不能备份通过外部的符号连接所指向的目录文件。在默认情况下,chroot值为true,但是这一般不需要,可选择no或false。list=no表示不允许列清单。


  1. max connections=200


表示最大连接数。


  1. timeout=600


表示覆盖客户指定的IP超时时间,也就是说rsync服务器不会永远等待一个崩溃的客户端。


  1. pidfile=/var/run/rsyncd.pid 




 



2.7.2 在Centos5.5下配置rsync服务器(2)

指的是pid文件的存放位置。



  1. lock file=/var/run/rsync.lock 


指的是锁文件的存放位置。


  1. log file=/var/log/rsyncd.log 


指的是日志文件的存放位置。[backup]这是认证模块名,即跟Samba语法一样,是对外公布的名字。


  1. path=/backup/ 


这是参与同步的目录。


  1. ignore errors 


表示可以忽略一些无关的I/O错误。


  1. read only=no


表示允许读和写。


  1. list=no


表示不允许列清单。


  1. hosts allow=192.168.21.0/255.255.255.0 


这里跟Samba的语法是一样的,只允许192.168.21.0/24的网段进行同步,拒绝其他一切网段连接。



  1. auth users=test


指的是认证的用户名。


  1. secrets file=/etc/rsyncd.password 



指的是密码文件的存放地址。

启动服务端的rsync,可通过xinetd来控制,这里要对rsync进行修改,我们先编辑rsync相关的文件etc/xinetd.d/rsync,如下所示:


1. service rsync  
2. {  
3. disable=yes
4.  socket_type=stream  
5.  wait= no  
6.  user= root  
7.  server = /usr/bin/rsync  
8.  server_args=--daemon  
9.  log_on_failure += USERID  
10. }


将disable=yes 改为disable=no,然后重启xineted即可,命令如下:



  1. /etc/ini.d/xinetd restart 



配置中应该注意的问题如下。

[backup]:认证模块名,这个认证模块名是服务器对外的名字,机器同步时只会认这个名字。这里的path不要随便设置,要知道这里是认证模块,以后从客户机备份的数据会存储在这里。

auth users=redhat:认证的用户名。这个名字是服务器端实实在在存在的用户,如果服务器端少了它,估计你的数据同步就无法实现了,请不要忽略它。

path=/backup/:参与同步的目录的权限。如果此目录权限不够,rsync同步是成功不了的。

这需要稍后在根目录下自己建,并分配相应的写权限,如下所示:



    1. mkdir /backup  
    2. chmod –R 777 /backup  
    3. echo "test:test" >/etc/rsyncd.password



    说明 这里我设置的是用户名和密码一致。

    为了安全起见,我设置他的权限为600,如下所示:



      1. chmod 600 /etc/rsyncd.password


      客户端配置如下:


      1. echo "test" >


      这里只需要密码,不需要用户名,免得要同步时还要手动互动。为了安全,一样配置600的权限,如下所示:


        1. chmod 600 /etc/rsyncd.password



        下面说说在工作中经常遇到的rsync问题。

        故障一:服务器端的目录不存在或无权限。故障描述如下:


        1. @ERROR: chroot failed  
        2. rsync error: error starting client-server protocol 
        (code 5) at main.c(1522) [receiver=3.0.3]


         



         



        2.7.2 在Centos5.5下配置rsync服务器(3)



        解决方法:创建目录或修改目录权限。

        故障二:服务器端该模块(tee)需要验证用户名和密码,但客户端没有提供正确的用户名和密码,认证失败。故障描述如下:


        1. @ERROR: auth failed on module tee  
        2. rsync error: error starting client-server protocol (code 5)
        at main.c(1522) [receiver=3.0.3]


        解决方法:提供正确的用户名和密码。

        故障三:服务器上不存在指定的模块。故障描述如下:


        1. @ERROR: Unknown module 'tee_nonexists'  
        2. rsync error: error starting client-server protocol 
        (code 5) at main.c(1522) [receiver=3.0.3]


        解决方法:提供正确的模块名。

        我们接着可以进行测试工作了。

        在FreeBSD8.1的机器上执行如下命令:


        1. rsync –vzrtopg --delete /home/andrewy/etc 
        test@192.168.21.41::backup --password-file=/etc/rsyncd.password


        这时候就可以看到正确的同步效果了。

        下面再说说工作中经常用到的rsync参数。

        如果不需要交互式的操作,rsync平时也可以像scp那样工作,我由于经常要在服务器之间拷贝MySQL文件,MySQL的库文件有时有几十GB,感觉rsync在速度上还是占绝对优势的。以下是我在工作中经常用到的rsync参数:

        -v --verbose:详细模式输出。

        -r --recursive:对子目录以递归模式处理。

        -p --perms:保持文件权限。

        -o --owner:保持文件属主信息。

        -g --group:保持文件属组信息。

        -t --times:保持文件时间信息。

        --delete:删除那些DST中存在而SRC中不存在的文件或目录。

        --delete-excluded:同样删除接收端那些被该选项指定排除的文件。

        -z --compress:对备份的文件在传输时进行压缩处理。

        --exclude=PATTERN:指定排除不需要传输的文件模式。

        --include=PATTERN:指定不排除需要传输的文件模式。

        --exclude-from=FILE:排除FILE中指定模式的文件。

        --include-from=FILE:不排除FILE指定模式匹配的文件。