RSYNC

 

rsync  ---->全量和增量,本地或远程

http://www.samba.org/ftp/rsync/rsync.html

 

rsync可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于scp命令,但优于scp命令的功能;当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这类似于cp命令,同样也优于cp命令。

提示:rsync还可以实现类似rm的删除功能!

 

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

 

rsync的特性如下:

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

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

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

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

  可以使用rcp,rsh,ssh等方式来配合传输文件。

  可以通过socket(进程方式)传输文件和数据。

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

 

 rsync的工作方式:

1.主机本地间的数据传输(此时类似于cp命令的功能)

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

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

 

一、本地数据传输模式(local-only mode)

 语法: rsync [OPTION..] SRC... [DEST]

语法说明:1、rsync为同步的命令

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

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

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

 

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

   rsync  /etc/hosts   /opt<---------cp  /etc/hosts  /opt

    实例2. 把opt目录拷贝到/mnt下

   rsync -avz  /opt  /mnt<---------cp  -ap  /opt   /mnt

 

二、通过远程shell进行数据传输(remote shell mode)

 通过远程shell(rcp,ssh等)传输可以分为两种情况,其语法分别为

   拉取pull:rsync [OPTION...] [USER@]HOST:SRC... [DEST]

   推送push:rsync [OPTION...] SRC... [USER@]HOST:DEST

 

语法说明:

1.rsync为同步的命令;

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

3.[USER@]HOST...为rsync同步的远程的连接用户和主机地址

4.SRC为源,即待拷的分区、文件或目录等,和HOST之间用一个冒号连接

5.[DEST]为目的分区、文件或目录等。

 

拉取实例:

rsync -vzrtopgP -e 'ssh -p 22' user1@192.168.1.147:/opt /mnt

推送实例:

rsync -vzrtopP -e 'ssh -p 22' /etc user1@192.168.1.147:/tmp

 

关键语法说明:

1.-vzrtopg相当于上文的-avz,表示同步文件和目录属性不变。

2.--progress显示同步的过程,可以用-P替换

3.-e 'ssh -p 22' ,表示通过ssh的通道传输数据,-p 22可省略。

4.user1@192.168.1.147:/opt远程的主机系统用户,地址,路径。

5./tmp本地的路径

 

三、使用守护进程的方式数据传输(daemon mode)

 通过守护进程方式传输同样分为两种情况,每种情况又有两种语法写法,分别为:

拉取:(1)   rsync  [OPTION...]  [USER@]HOST::SRC...   [DEST]

      (2)   rsync  [OPTION...]   rsync://[USER@]HOST[:PORT]/SRC...  [DEST]

推送:  (1) rsync [OPTION...] SRC... [USER@]HOST::DEST

        (2) rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

特别值得注意的是,与远程shell方式的命令不同的是,第(1)种语法格式,本节命令

 

[USER@]HOST::SRC和[USER@]HOST::DEST结尾处,均为双冒号连接SRC或DEST,另外,这个SRC或DEST也不再是路径了,而是守护进程中配置的模块名称。下文会以例子详细说明。

第2种方法实例(rsync://):

拉取实例命令:rsync -vzrtopgP rsync://rsync_backup@10.0.0.141:/peng /test --password-file=/etc/rsync.password

推送实例命令:rsync -vzrtopgP /test/ rsync://rsync_backup@10.0.0.141:/peng --password-file=/etc/rsync.password

特别说明:以上的用法是个不错的方法,它在拉取和推送时的写法极其类似,尤其是后面讲守护进程服务时,第一种方法通过双冒号加模块名的方法不利于记忆,所以对于初学者,建议大家也可以记忆此语法格式。

 

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

部署环境:

操作系统:

[root@server ~]# cat /etc/redhat-release

Red Hat Enterprise Linux Server release 6.4 (Santiago)

内核版本:

[root@server ~]# uname –r

2.6.32-358.el6.x86_64

[root@server ~]# uname -m

x86_64

[root@www ~]# lsb_release  –a      ------》可以查看系统版本信息

LSB Version:    :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch

Distributor ID: RedHatEnterpriseA-server

Description:    Red Hat Enterprise Linux A-server release 6.2 (Santiago)

Release:        6.2

Codename:       Santiago


主机网络参数配置

主机名

网卡eth0

默认网关

用途

A-server

192.168.1.145

192.168.1.254

rsync服务端

B-server

192.168.1.147

192.168.1.254

rsync节点

C-server

192.168.1.150

192.168.1.254

rsync节点

提示: 如无特殊要求,子网掩码都是255.255.255.0


具体要求: 要求在A-server上以rsync守护进程的方式部署rsync服务,使得所有rsync节点客户端主机,可以把本地数据通过rsync的方式备份到数据备份服务器A-server上。本例的客户端仅以B-server、C-server为例。

 备份拓扑:

 

rsync使用java rsync 详解_html

 

开始部署rsync服务—Rsync服务器端操作过程

1) 配置rsyncd.conf

首先确认软件是否安装:

[root@server ~]# rpm -qa rsync

rsync-3.0.6-9.el6.x86_64

 

2) 开始编辑 /etc/rsyncd.conf

[root@server ~]# cat  /etc/rsyncd.conf

#rsync_config____________start

#created by peng 13:05  2014-12--9

##rsyncd.conf start##

uid = rsync

gid = rsync

use chroot = no

max connections = 200

timeout = 300

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

[peng]

path  =  /peng/

ignore errors

read only = false

list = false

hosts allow = 192.168.1.0/24

hosts deny = 0.0.0.0/32

auth users = rsync_backup

secrets file = /etc/rsync.password

#rsync_config__________end

 

[root@A-server ~]# dos2unix  /etc/rsyncd.conf ---------》windows下的文件粘贴到linux下,尽可能的执行dos2unix查看下!

dos2unix: converting file /etc/rsyncd.conf to UNIX format ...


3) 配置文件常用参数选项说明:

Rsyncd.conf参数

参数说明

uid = rsync

rsync使用的用户,缺省uid为-2,通常为nobody.

gid = rsync

rsync使用的组(用户所在的组),缺省gid为-2,通常为nobody.

use  chroot  =  no

如果为true, daemon会在给客户端传输文件前“chroot  to the path” ,这是rsync 安全的一个配置,因为我们大多数都是在内网使用rsync,所以不配也可以。

max connections  =  200

设置最大连接数,默认为0,意为无限制,负值为关闭这个模块。

timeout  =  300

默认为0,意为no timeout ,建议为300-600(5分钟-10分钟)

pid file  =  /var/run/rsyncd.pid

rsync  daemon服务启动后将进程号写入此文件中,如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止。

lock file  =  /var/run/rsyncd.lock

指定lock文件用来支持“max  connections

参数,使得总连接数不会超过限制,默认为

/var/run/rsyncd.lock

log file  =  /var/log/rsyncd.log

不设置或者设置错误,rsync会使用syslog输出相关日志信息

ignore  errors

忽略i/o错误

read only  =  false

指定客户端是否可以上传文件,默认对所有模块都为true.

list  =  false

是否允许客户端可以查看可用模块列表,默认为可以。

hosts  allow  =  192.168.1.0/24

指定可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接。

hosts  deny  =  0.0.0.0/32

指定不可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接。

auth  users  =  rsync_backup

指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在,默认所有用户无密码的访问

secrets  file =  /etc/rsync.password

指定用户名和密码存放的文件,格式为用户名:密码,密码不超过8位。

[peng]

这里是模块名称,需要用中括号括起来,起名称没有特殊的要求,但最好是有意义的名称,便于以后维护。

path  =  /peng/

在这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题。

#exclude  = a c b/2

排错的文件或目录,相当路径。

man rsyncd.conf查看配置参数细节:

 特别说明:

1) 模块中的参数项可以拿到全局配置中使用

2) 以上配置文件中的参数,为经常使用的参数。

3) 以上配置文件中没有提到的参数请参考man rsyncd.conf查看

4) 如果配置中的path = /peng/提到的路径不存在则需要创建,命令为:

 mkdir /peng -p

 useradd rsync -s /sbin/nologin -M

 chown -R rsync.rsync /peng/    -----》授权权限可以根据配置文件中的属主来


配置用于rsync同步的账号,密码及账号文件权限

操作过程:

[root@A-server ~]# echo "rsync_backup:redhat">>/etc/rsync.password    

注意:其中rsync_backup:redhat 中的rsync_backup为同步传输用到的虚拟账号,这个账号仅为rsync的账号,不需要系统账号。后面的redhat为密码,不超过8位。账号和密码中间用冒号分隔。

 

[root@A-server ~]# cat /etc/rsync.password

rsync_backup:redhat

[root@A-server ~]# chmod 600 /etc/rsync.password   ------》必须为600权限。


启动rsync服务

  以守护进程方式来启动rsync服务:

   rsync  --daemon    ----》--daemon表示以守护进程的方式启动rsync服务。

 

拓展:

--address  --》绑定指定ip地址提供服务

--config=FILE  ---》更改配置文件路径,而不是默认的/etc/rsyncd.conf

--port=PORT   --》更改其他端口提供服务,而不是缺省的873端口

提示:以上几个选项为了解内容,生产场景使用的不多。

 

[root@server ~]# rsync --daemon

[root@server ~]# netstat -tunlp |grep 873

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

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

[root@server ~]# ps -ef |grep rsync |grep -v grep

root     10983     1  0 03:47 ?        00:00:00 rsync –daemon


设置服务开机自启动:

echo  “/usr/bin/rsync –daemon”  >> /etc/rc.local

注意:当然还可以用chkconfig  rsync  on 命令,但是必须要编写适合chkconfig操作的脚本才行。

(脚本:

#!/bin/bash
#rsync Start/Stop Rsync service
#chkconfig: 35 13 91
#description:This is Rsync service management shell script
#processname:rsyncd

#Source function library
. /etc/rc.d/init.d/functions
  start() {
            rsync --daemon
           if [ $? -eq 0 -a `ps -ef |grep -v grep |grep rsync|wc -l` -gt 0 ];then
            action "Starting Rsync:" /bin/true
            sleep 1
          else
            action "Starting Rsync:" /bin/false
            sleep 1 
           fi 
     }
     stop() {
              pkill rsync;sleep 1;pkill rsync
             #if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync |wc -l` -lt 1 ];then
             if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then
               action "Stopping Rsync:`ps -ef|grep -v grep|grep rsync|wc -l`" /bin/true
               sleep 1
             else 
               action "Stopping Rsync:`ps -ef|grep -v grep|grep "rsync --daemon"|wc -l`" /bin/false
               sleep 1
             fi
           }
         case "$1" in
           start)
              start;
             ;;
           stop)
              stop;
              ;;
           restart|reload)
             $0 stop;
             $0 start;
              ;;
          *)
             echo $"Usage: $0 {start|stop|restart|reload}"
             ;;
         esac
)

 

保存成rsyncd,放到/etc/init.d/rsyncd

chmod  700  /etc/init.d/rsyncd

chkconfig  rsyncd  on

chkconfig –list |grep rsyncd

/etc/init.d/rsyncd start

netstat  -tunlp |grep 873


开始部署rsync客户端:

在192.168.1.147和192.168.1.150上操作

请注意与服务端的配置区别

echo  "redhat"  >  /etc/rsync.password   ------》这里仅配置了密码,不需要账号了。这是与服务端的区别。

chmod  600  /etc/rsync.password  ------》必须为600权限

检查部署的rsync服务:

默认情况下,以下均在rsync客户端执行操作:

在192.168.1.147客户端上操作:

[root@www www]# pwd

/var/www

[root@www www]# tar  -zcvf  html_$(date +%F)_tar.gz  ./html/ ---》压缩份文件

./html/

./html/index.html

[root@www www]# ll

drwxr-xr-x. 2 root root 4096 Dec 10 14:57 html

-rw-r--r--. 1 root root  173 Dec 10 14:58  html_2014-12-10_tar.gz

 

开始推送到192.168.1.145服务器上:

[root@B-server www]# rsync -avzP html_2014-12-10_tar.gz  rsync_backup@192.168.1.145::peng----------->服务器端模块的名字

Password:   -----》需要输入密码

sending incremental file list

html_2014-12-10_tar.gz

         173 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)


sent 260 bytes  received 27 bytes  114.80 bytes/sec

total size is 173  speedup is 0.60

 

在服务端192.168.1.145上查看已经收到此文件

[root@A-server peng]# ls

html_2014-12-10_tar.gz

或不提示输入密码操作:

[root@www www]# rsync -avzP html_2014-12-10_tar.gz rsync_backup@192.168.1.145::peng --password-file=/etc/rsync.password

sending incremental file list


sent 43 bytes  received 8 bytes  102.00 bytes/sec

total size is 173  speedup is 3.39

[root@www www]# rsync -avzP html_2014-12-10_tar.gz rsync://rsync_backup@192.168.1.145/peng  --password-file=/etc/rsync.password      

sending incremental file list

html_2014-12-10_tar.gz

         173 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)


sent 260 bytes  received 27 bytes  574.00 bytes/sec

total size is 173  speedup is 0.60

或者从客户端192.168.1.147推送到服务端192.168.1.145的/peng/test目录下

先在服务端设置:

[root@A-server peng]# mkdir test

[root@A-server peng]# chown  rsync test   ------》要对创建的子目录赋予权限

 

开始在客户端推送:

[root@B-serve www]# rsync -avzP html_2014-12-10_tar.gz rsync://rsync_backup@192.168.1.145/peng/test  --password-file=/etc/rsync.password

sending incremental file list

html_2014-12-10_tar.gz

         173 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)


sent 260 bytes  received 27 bytes  574.00 bytes/sec

total size is 173  speedup is 0.60

也可以写成:[root@B-server www]# rsync -avzP html_2014-12-10_tar.gz rsync://rsync_backup@192.168.1.145:/peng/test  - -password-file=/etc/rsync.password


问题排查:NO route to host问题

解决办法:可能是防火墙阻挡了,telnet   ip   873检查,如果出现connection  refuse字样表示防火墙阻挡或服务没开启。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

rsync命令同步参数选项:

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

-z,--compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩

-r,--recursive 对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r

-t,--times 保持文件时间信息

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

-D,--devices 保持设备文件信息

-l,--links 保持软链接

-o,--owner 保持文件属主信息

-p,--perms 保持文件权限

-g,--group 保持文件属组信息

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

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

--exclude=PATTERN 指定排除

保持同步目录及文件属性:

这里的-avzP相当于 -vzrtopgDlP(还多了Dl功能),生产环境常用的参数选项为-avzP或-vzrtopgP,如果是放入脚本中,也可以把-v和-P去掉,这里的--progress可以用-P代替。

 

特别注意:

 请注意一下两命令的差别:

1)rsync -avz  /opt/ /tmp

2)rsync -avz  /opt  /tmp

1)中的/opt/意思是,仅把/opt/目录里面的内容同步过来,opt目录本身并不同步;而

后者2)中/opt表示把opt本身及其内部内容全都同步到/tmp下,仅一个/(斜线之差),意义就大不相同,请读者注意使用的差别。

2)在后面讲的通过远程shell进行数据传输的内容也会有类似的问题,要牢记!

 

 分发脚本:

[root@www ~]# cat fenfa.sh

#!/bin/bash

. /etc/init.d/functions

if [ $# -ne 1 ];then

    echo "Usage:$0 argv"

    exit

fi

for ip in 150

do

   scp  -P22 $1 root@192.168.1.$ip:/test >&/dev/null

   rsync -avzP $1 -e "ssh -p 22" root@192.168.1.$ip:/test >&/dev/null

   if [ $? -eq 0 ];then

      action "fenfa $1 successful." /bin/true

   else

      action "fenfa $1 failure." /bin/false

   fi

done

 

专注事业!