Rsync简介

  • Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。

小提示:利用Rsync还可以实现删除文件和目录的功能,这又相当于rm命令!

  • 一个rsync相当于scp,cp,rm,但是还优于他们每一个命令。

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

提示:传统的cp,scp工具拷贝每次均为完整的拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync工具更胜一筹。

  • CentOS5,rsync2.x比对方法,把所有的文件比对一遍,然后进行同步。

  • CentOS6,rsync3.x比对方法,一边比对差异,一边对差异的部分进行同步。

 

 

rsync 命令常用参数选项说明:

-v,--verbose 详细模式输出,传输时的进度等信息
-z,--compress 传输时进行压缩以提高传输效率,--compress-level=NUM可按级别压缩。
-a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgD1(字母1)
-r,--recursive对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r
-t,--times 保持文件时间信息
-o,--owner 保持文件属主信息
-p,--perms 保持文件权限
-g,--group 保持文件属组信息
-P,--progress 显示同步的过程及传输时的进度等信息
-D,--devices 保持设备文件信息
-l,--links 保留软链接
-e,--rsh=COMMAND 使用的信道协议(remote shell),指定替代rsh的shell程序。例如:ssh --exclude=PATTERN 指定排除不需要传输的文件模式(和tar参数一样)
--bwlimit=RATE limit socket I/O bandwidth
--delete 让源目录SRC和目标目录数据DST一致

例:

    rsync -avz dbfile 10.0.0.41:/backup #没有给带宽做限制
    rsync -avz --bwlimit=100 dbfile 172.16.1.41:/backup   #限定了带宽

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

示例1:推送:将当前主机内容推送到远程主机

rsync -avzP -e 'ssh -p 22'/etc/ root@192.168.197.129:/tmp/
#命令说明
-e 'ssh -p 22' 表示以ssh的方式通过22端口推送,如果不写默认22端口

示例2:将远程主机内容拉取到当前主机

rsync -avzP -e 'ssh -p 22' root@192.168.197.129:/opt /tmp
关键语法说明:
1)-avz相当于-vzrtopgDI,表示同步时文件和目录属性不变。
2)-P显示同步的过程,可以用--progress替换。
3)-e ‘ssh -p 22’表示通过ssh通道传输数据,可省略
4)root@chensiqi2:/opt 远程主机系统用户,地址,路径
5)/tmp本地的路径
可以去掉 -e ‘ssh -p 22’(默认22端口)
rsync -avzP root@192.168.197.129:/opt /tmp/

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

A-Server:192.168.50.129服务端

B-Server:192.168.50.128客户端

开始部署rsync服务--Rsync服务端A-Server

首先安装:
yum -y install rsync
然后创建rsyncd.conf文件,并添加如下内容(文件默认不存在)
vim /etc/rsyncd.conf
#rsync_config_____start
#created by chensiqi 13:40 2017-3-6
##blog:http://www.cnblogs.com/chensiqiqi/
##rsyncd.conf start##
# 用户
uid = rsync
# 组
gid = rsync
# 程序安全设置
fake super = yes 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 ########################################## [backup] # 使用目录 path = /backup/ # 有错误时忽略 ignore errors # 可读可写(true或false) read only = false # 阻止远程列表(不让通过远程方式看服务端有啥) list=false # 允许IP hosts allow = 192.168.50.0/24 # 禁止IP hosts deny = 0.0.0.0/32 # 虚拟用户 auth users = rsync_backup # 存放用户和密码的文件 secrets file = /etc/rsync.password ##rsync_config______end##
useradd -M -s /sbin/nologin rsync  #创建rsync用户
mkdir /backup #创建共享目录
#启动服务:rsync --daemon
rsync --daemon
netstat -antup | grep rsync

tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 1803/rsync
tcp6 0 0 :::873 :::* LISTEN 1803/rsync
将A-Server上的/backup文件夹更改属主rsync
chown -R rsync /backup

创建rsync虚拟账户名和密码
echo "rsync_backup:123456" >/etc/rsync.password

将账户密码文件的权限设置为600(必须否则失败)
 chmod 600 /etc/rsync.password 

加入开机启动
 echo "rsync --daemon" >> /etc/rc.local

如何重启rsync服务

pkill rsync #关闭rsync服务 
rsync --daemon #启动rsync服务

开始部署rsync服务--Rsync客户端B-Server

只需要创建密码文件

只需要创建密码文件
yum -y install rsync
echo "123456" > /etc/rsync.password
将密码文件的权限设置为600(必须否则失败)
chmod 600 /etc/rsync.password
至此rsync客户端B-Server配置完毕。

 Rsync同步测试

推送1:将客户端B指定目录内容推送到服务器端A的rsync指定目录下。

rsync -avz /backup/ rsync_backup@192.168.50.129::backup --password-file=/etc/rsync.password
命令说明:
-avz:保持稳健各项属性不变,-v显示同步信息 -P显示具体同步过程
/backup/:要推送的内容所在目录
rsync_backup:服务器端rsync服务的同步的用户名(非Linux用户)
192.168.50.128:rsync服务器IP地址
backup:rsync服务器配置文件里的模块名
--password-file=/etc/rsync.password:免密码的操作,指定密码文件位置,如果不写,则会要求用户交互式输入密码。(如果想挂定时任务,必须得非交互式)

推送2:将客户端B任意目录推送到rsync服务器A端指定目录下

    rsync -avzP /tmp/ rsync_backup@192.168.50.129::backup --password-file=/etc/rsync.password

拉取1:将rsync服务器A端指定目录全部内容同步到客户端B

    rsync -avzP rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password
    命令说明:
    和推送相比,只是两个目录换了个位置。

拉取2:将rsync服务器端A指定目录下的指定内容同步到客户端B

    rsync -avzP rsync_backup@192.168.50.129::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password

 拉取3: 将rsync服务器端指定目录下的全部内容排除某目录或文件后,同步到客户端

方法一:通过命令行实现排除

ls
a  b  c  chen  d  e

ls chen
1  2  3  4  5

说明:
a,b,c,d,e为文件,chen是目录。目录下有1,234,5文件

rsync -avz --exclude=a --exclude=chen/3 --exclude=chen/4 rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 
命令说明:
--exlude=文件名 :排除的文件

方法二:通过列表文件实现排除

创建排除列表文件
cat /root/exclude.txt 
1
3
5
b
e

测试命令:

    rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password
    命令说明:
    --exclude-from=文件的绝对路径 :引用一个排除列表,列表里只需要输入排除的文件名即可

rsync同步拉取测试:让rsync客户端指定目录内容始终和rsync服务器共享目录内容保持一致

1.和rsync服务器目录内容始终保持一致:始终保持一致的意思是说,当Rsync服务器共享目录增加文件,那么客户端指定目录也增加,服务器端共享目录删除文件,那么客户端指定目录也删除文件

    rsync -avz --delete rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 
    命令说明:
    --delete :表示同步增,删,改(文件内容出现变化,也会同步的)

2.排除某文件后,再和服务器进行同步.

    rsync -avz --delete --exclude=c rsync_backup@192.168.50.129::backup /backup/ --password-file=/etc/rsync.password 
    命令说明:
    --exclude=c:同步时不考虑文件名为c的文件

rsync同步推送测试:让Rsync服务器端共享目录始终和rsync客户端指定目录内容一致。

1)和rsync客户端目录内容始终保持一致

始终保持一致的意思是说,当Rsync客户端指定目录增加文件,那么服务器端共享目录也增加,客户端指定目录删除文件,那么服务器端共享目录也删除文件

rsync -avz --delete /backup/ rsync_backup@192.168.50.129::backup --password-file=/etc/rsync.password 
命令说明:
--delete :表示同步增,删,改(文件内容出现变化,也会同步的)
与同步拉取相比:只是客户端目录放在了服务器端的前边

Rsync企业应用之风险提示

特别说明:
执行--delete参数从rsync服务器端往rsync客户端拉取数据时,一定要小心,最好不用,它比从rsync客户端带--delete参数往rsync服务端推送危险的多。客户端带--delete参数往服务端推送仅删除服务端模块下的数据,而前者有能力删除rsync客户端本地的所有数据包括跟下的所有目录。

rsync推送企业工作场景:
1)备份 --delete 风险
本地有啥,远端就有啥,本地没有的远端有也要删除。服务器端的目录数据可能丢失。

rsync拉取企业工作场景:
1)代码发布,下载。--delete风险
远端有啥,本地(客户端)就有啥,远端没有的本地有也要删除。本地的目录数据可能丢失

rsync优点:

1,增量备份,支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)。
2,远程SHELL通道模式还可以加密(SSH)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务

rsync缺点:

1,大量小文件时候同步的时候,比对时间较长,有的时候,同步过程中,rsync进程可能会停止,僵死了。
2,同步大文件,10G这样的大文件有时也会出问题,中断。未完整同步前,是隐藏文件,可以通过续传(--partial)等参数实现传输
3,一次性远程拷贝可以用scp,大量小文件要打成一个包再拷贝。(重要)

rsyncd.conf配置文件常用参数说明:

rsyncd.conf参数参数说明
uid=rsync rsync使用的用户。
gid=rsync rsync使用的用户组(用户所在的组)
use chroot=no 如果为true,daemon会在客户端传输文件前“chroot to the path”。这是一种安全配置,因为我们大多数都在内网,所以不配也没关系
max connections=200 设置最大连接数,默认0,意思无限制,负值为关闭这个模块
timeout=400 默认为0,表示no timeout,建议300-600(5-10分钟)
pid file rsync daemon启动后将其进程pid写入此文件。如果这个文件存在,rsync不会覆盖该文件,而是会终止
lock file 指定lock文件用来支持“max connections”参数,使得总连接数不会超过限制
log file 不设或者设置错误,rsync会使用rsyslog输出相关日志信息
ignore errors 忽略I/O错误
read only=false 指定客户端是否可以上传文件,默认对所有模块为true
list=false 是否允许客户端可以查看可用模块列表,默认为可以
hosts allow 指定可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数,即都可以连接
hosts deny 指定不可以联系的客户端主机名或ip地址或地址段,默认情况没有此参数,即都可以连接
auth users 指定以空格或逗号分隔的用户可以使用哪些模块,用户不需要在本地系统中存在。默认为所有用户无密码访问
secrets file 指定用户名和密码存放的文件,格式;用户名;密码,密码不超过8位
[backup] 这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护
path 这个模块中,daemon使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题

特别说明
1)模块中的参数项可以拿到全局配置中使用
2)以上配置文件中的参数,为生产中经常使用的参数,初学者掌握这些足够了。
3)以上配置文件中没有提到的参数请参考man rsyncd.conf查看

开发rsync服务启动脚本

    #!/bin/bash
    #author:wk
    # chkconfig:35 13 91
    # description:This is Rsync service management shell script
    # 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 [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then
            action "Stopping Rsync: " /bin/true
            sleep 1
        else
            action "Stopping Rsync:" /bin/true
            sleep 1
        fi
    }
    case "$1" in
        start)
            start;
            ;;
        stop)
            stop;
            ;;
        restart|reload)
            stop;
            start;
            ;;
        *)
            echo $"Usage: $0 {start|stop|restart|reload}"
            ;;
    esac

 sersync  需要配置在rsync客户端

sersync需要依赖inotify和rsync,所以需要安装对应软件

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum
-y install inotify-tools #之前rsync装过了只需装inotify

 安装sersync

cd /usr/local/
wget https://raw.githubusercontent.com/wsgzao/sersync/master/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/ /usr/local/sersync

配置sersync详解

vim /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host><!--本地主机地址-->
    <debug start="false"/><!--是否打开调试信息-->
    <fileSystem xfs="false"/><!--文件系统是否支持xfs文件系统-->
    <filter start="false"><!--排除不想同步的文件-->
    <exclude expression="(.*)\.svn"></exclude><!--不想同步的文件-->
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify><!--监控的事件类型--> 
    <delete start="true"/>
    <!--监控删除文件或目录-->
    <createFolder start="true"/>
    <!--监控创建文件夹-->
    <createFile start="true"/>
    <!--监控创建文件-->
    <closeWrite start="true"/>
    <!--文件或目录封闭,写模式-->
    <moveFrom start="true"/>
    <!--监控移动进来的文件-->
    <moveTo start="true"/>
    <!--监控移动出去的文件-->
    <attrib start="false"/>
    <!--监控文件或目录属性被改变-->
    <modify start="false"/>
    <!--监控文件或目录内容被修改-->
    </inotify>
    <sersync><!--本地需要监视的目录-->
    <localpath watch="/www"><!--本地监视/www目录-->
        <remote ip="192.168.50.179" name="backup"/><!--rsync服务端的IP及模块名-->
        <!--<remote ip="192.168.8.39" name="tongbu"/>--> 
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync>   <!--sersync调用rsync时的参数配置段-->
        <commonParams params="-az"/><!-- rsync使用az参数 -->
        <!--开启虚拟用户密码认证 用户名 密码存放位置-->
        <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
        <userDefinedPort start="false" port="874"/><!--port=874--><!--指定rsync服务端的端口 默认874-->
        <timeout start="ture" time="100"/><!--timeout=100 --><!-- 超时时间-->
        <ssh start="false"/>
    </rsync>
    <!--指定如果同步失败,记录到哪个文件,以便在60分钟后尝试重传-->
    <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <!--指定多长时间间隔执行一次完整同步-->
    <crontab start="false" schedule="600"><!--600mins-->
        <!--可以过滤哪些不同步-->
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>
    </sersync>

    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>    <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>

    <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>

启动sersync

/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d     run as a daemon
option: -r     rsync all the local files to the remote servers before the sersync work
option: -o     config xml name:  /usr/local/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost    host port: 8008
will ignore the inotify createFile event 
daemon start,sersync run behind the console 
use rsync password-file :
user is    rsync_backup
passwordfile is     /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /www && rsync -az -R --delete ./ rsync_backup@192.168.50.179::backup --password-file=/etc/rsync.password >/dev/null 2>&1 
run the sersync: 
watch path is: /www

测试是否成功

cd /www && rsync -az -R --delete ./ rsync_backup@192.168.50.179::backup --password-file=/etc/rsync.password
#如果不报错 基本成功
[root@wk media]# > 113
[root@wk media]# ls
113

[root@wk backup]# ls
113

 

 

 

 

 

 

 

 

 

 

posted on 2018-10-30 10:46  临渊慕鱼不如退而结网  阅读(536)  评论(0编辑  收藏  举报