rsync备份服务

1.1 rsync数据复制传输服务介绍

1.1.1 rsync的官方网站

https://download.samba.org/pub/rsync/rsync.htmlhtml

1.1.2 rsync的官方定义

rsync是一款快速的、多功能的、开源的、而且能够实现全量及增量,可实现远程或本地数据复制的优秀工具linux

总结:算法

(1)rsync的核心做用是实现本地服务器和远程服务器上的文件或目录的复制传输(包括本地推到远程,远程拉到本地两种同步方式);shell

(2)rsync也能够实现本地不一样路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步;windows

(3)rsync既能够拷贝文件,也能够拷贝目录。安全

(4)rsync软件适用于unix/linux/windows等多种操做系统平台服务器

重要概念:网络

本地:本机,本身手里正在操做的这台服务器;并发

远程:非本机,除了本身手里正在操做的这台之外的全部服务器;ssh

全量:须要被操做的全部数据(数据第一次被操做的时候必定是全量);

增量:须要被操做的全部数据里面,相对上一次操做后,发生了变化的数据(数据至少被操做了一次以后,才会有增量这个概念);

推送:从本地往远程复制传输数据(也就是由己及人叫作推),get、pull;

拉取:从远程往本地复制传输数据(也就是由人及己叫作拉),put、push。

1.1.3 rsync详细特色介绍

(1)支持拷贝普通文件与特殊文件,如连接文件(-l参数),设备(-D参数)等;

(2)能够作到保持原文件或目录的权限(-p参数)、时间(-t参数)、软硬连接(-l参数)、属主(-o参数)、属组(-g参数)等全部属性均不改变;

(3)能够有排除指定文件或目录同步的功能,至关于打包命令tar的排除功能;

     # 做为对比,给出tar命令的相关功能举例

     # 在打包全部的脚本时,排除掉test.sh文件;目录同理

     cd /server/scripts/;tar zcvf allShell_backup.tar.gz *.sh --exclude=test.sh

(4)可实现增量同步,既只同步发生变化的数据,所以数据传输效率很高(tar -N);

     # 做为对比,给出tar命令的相关功能举例

     # 备份/server/script目录自2018-03-21以来修改过的文件

       cd /server/scripts/;tar -N 2018-03-21 -zcvf /tmp/inc-backup_$(date +%F).tar.gz .

     # 备份/server/script目录自昨天以来修改过的文件

       cd /server/scripts/;tar -N $(date -d yesterday "+%F") -zcvf /tmp/inc-backup_$(date +%F).tar.gz ./

     # 添加文件到已经打包的文件内,即追加文件到已存在的打包文件内

       cd /server/scripts/;tar -rf all.tar *.sh

     # 说明:这条命令是将全部的sh文件增长到all.tar的包里面去,-r是表示增长文件的意思

(5)rsync虽然自己不对数据加密,但可使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(-e参数);

(6)能够经过socket(进程方式)传输文件和数据(服务端和客户端)*****重点讲解的部分;

(7)支持匿名的或认证(无需系统用户)的进程模式传输,方便安全的拷贝传输数据。

1.1.4 rsync拷贝传输服务工做原理介绍

(1)前提条件:

     须要复制传输数据的多台服务器之间的网络链接要通畅;

(2)检查模式(决定哪些文件须要复制传输):

     检查模式是指按照指定规则来检查哪些文件须要被同步。

     rsync有一个本身独特的叫作“quick check”的算法,

     这个算法默认会快速的比对源文件和目标文件(若是存在)的大小和修改时间是否一致,

     若是两端文件的大小或修改时间不一样,则发送端会传输该文件,不然将忽略该文件,

     这样就能够作到不是每次都整份复制传输,这也是rsync复制传输时速度至关快的缘由所在。

     固然,也能够经过在使用rsync时指定特定的选项来改变“quick check”算法的检查项,达到比对更多内容的目的。

     rsync支持很是多的选项,其中检查模式的自定义性是很是有弹性的。

(3)同步模式:

     同步模式是指在文件肯定要被复制传输后,在同步过程发生以前要作哪些额外工做。

     例如

     是否要先删除源服务器上没有但目标服务器上有的文件,

     是否要先备份已存在的目标文件,

     是否要追踪连接文件等额外操做。

     rsync也提供很是多的选项使得同步模式变得更具弹性。

总结:

    由“quick check”算法,结合rsync的参数,能够实现每次传输的时候,只传输有变化的部分,这样就可以达成一个灵活传输数据的目的。

    好比,

    可以只传输A里面属主或属组有变化的文件到B,

    可以只传输A里面权限有变化的文件到B,

    可以只传输A里面时间戳有变化的文件到B,

    还可以只传输B里面目录内新增或改动的文件到A,

    也可以将B里面有而A里面没有的数据传输到A

1.1.5 rsync功能说明:1v4

 

1)实现数据信息查看(VS  lsls -d命令)

                1.  

    ls命令实现:

        [root@backup ~]# ls -l /data/

        [root@backup ~]# ls -ld /data/

    rsync命令实现:

        [root@backup ~]# rsync /data              《《==查看目录信息

    注意:请比较下面这条rsync命令的执行结果与上一条rsync命令的执行结果的差异。

        [root@backup ~]# rsync /data/            《《==查看目录下文件信息

重要说明:

举例详细说明一下这一点:

rsync命令后面接的目录信息:/data/# 表示被操做的对象的是/data/目录下面的全部内容

rsync命令后面接的目录信息:/data #表示被操做的对象的是/data/目录自己以及/data/目录下面的全部内容

2)实现本地传输数据(local-only mode)(VS  cp命令)

语法格式

       rsync     [OPTION…]              SRC…             [DEST]

程序命令复制传输时的参数选项  要复制传输的分区、文件  目的地,即把数据复制传输到哪里

                1. 拷贝文件

[root@backup ~]# cp -a /etc/hosts /tmp/hosts_cp

[root@backup ~]# ls -l /tmp/hosts

rsync命令实现:

[root@backup ~]# rsync /etc/hosts /tmp/hosts_rsync 《《==把/etc/hosts拷贝到/tmp下,命名为hosts_rsync

[root@backup ~]# ls -l /tmp/

                1. 拷贝目录

    cp命令实现:

       [root@backup ~]# cp -ap /data /tmp/

       [root@backup ~]# ls -l /tmp/

    rsync命令实现:

       [root@backup ~]# rsync -av /data /tmp/   《《==-av参数,将/data目录拷贝到/tmp下

3)实现远程传输数据(remote shell mode)(VS  scp命令)

语法格式

       推送(pushrsync  [OPTION…]  SRC…  [USER@]   HOST:  [DEST]

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

                命令  参数   传输时使用用户  IP地址  数据把数据复制到本地服务器的位置

                1. 分别使用scp及rsync命令推送本地172.16.1.41的/etc/hosts文件到远程172.16.1.31的/tmp/目录内

scp命令实现:

       [root@backup ~]# scp -rp /etc/hosts 172.16.1.31:/tmp/

       [root@backup ~]# rsync 172.16.1.31:/tmp/  《《==查看31服务器/tmp目录下文件信息

       [root@backup ~]# rsync 172.16.1.31:/tmp   《《==查看31服务器/tmp目录信息

    rsync命令实现:

       [root@backup ~]# rm /tmp/* -rf

       [root@backup ~]# rsync -avP /etc/hosts 172.16.1.31:/tmp 》》将本地hosts推送到31的/tmp下

                1. 分别使用scp及rsync命令拉取远端172.16.1.31的/data/目录到本地172.16.1.41的/tmp/目录内

scp命令实现:

        [root@backup ~]# scp -rp root@172.16.1.31:/data /tmp/

        [root@backup ~]# ls -l /tmp/

rsync命令实现:

        [root@backup ~]# rsync -vrtopglDP root@172.16.1.31:/data /tmp/ 《《==将31下的/data目录拉到本地/tmp下

        [root@backup ~]# ls -l /tmp/

4)实现数据清空操做(VS  rm命令)

                1. 删除/tmp目录的内容

    rsync命令实现:

        [root@backup ~]# touch /tmp/{1..10}.txt

        [root@backup ~]# mkdir /null

        [root@backup ~]# rsync -r --delete /null/ /tmp/  《《==同步/null内容到/tmp内

总结:rsync命令能够实现cpscprmls-l-d参数)这4个命令的功能,而且某些点上rsync命令的功能还优于它们。

1.2 rsync守护进程方式传输数据(daemon mode

1.2.1 语法格式

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

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

 

 

 

语法说明

推送push语法格式说明:

    rsync              # 程序命令

    [OPTION...]        # 参数

    SRC:               # 本地要备份的数据信息

    [USER@]             # 认证用户信息

    HOST::             # 远程主机IP地址或者域名信息

    DEST               # 模块信息

拉取pull语法格式说明:       

    rsync              # 程序命令

    [OPTION...]        # 参数  

    [USER@]            # 认证用户信息

    HOST::             # 远程主机IP地址或者域名信息  

    SRC                # 模块信息

    [DEST]             # 把备份的数据复制本地主机哪里

1.3 RSYNC的守护进程工做模式部署流程,重要程度,五颗星*****

rsync的守护进程模式分为服务端与客户端两部分,rsync默认使用的端口是873

1.4 服务端部署流程

1.4.1 服务器环境检查

不管作什么操做,都应该养成一个好的习惯,那就是先进行检查,再上手操做。

因此第一步应该先检查服务器上是否已经安装了rsync软件。

命令:rpm -qa rsync或rpm -qa | grep rsync

1.4.2 安装rsync软件(此步视上一步的结果来肯定是否须要操做)

若是检查结果是服务器上没有安装rsync软件,那么须要安装一下,通常rsync软件在装机时就已安装好了。

命令:yum install -y rsync

1.4.3 编写rsync服务配置文件

强调:rsyncd.conf这个配置文件里面,每一行的后面都不能够有任何的空格以及tab键存在,不然在使用时会报错

# created by oldboy at 2018

#####rsyncd.conf start#####

# 设置rsync守护进程模式保存进程号的文件的位置及名字

pid file = /var/run/rsyncd.pid

# 设置锁文件的位置及名字

lock file = /var/run/rsync.lock

# 设置日志文件的位置及名字,能够经过log format参数设置日志格式

log file = /var/log/rsyncd.log

# 设置进行数据传输时所使用的linux系统的用户或UID号

uid = rsync

# 设置进行数据传输时所使用的linux系统的用户组或GID号

gid = rsync

# 这是一个与安全有关的参数。若是设置use chroot = yes,rsync会首先进行chroot设置,

# 将根映射到path参数路径下,对客户端而言,系统的根就是path参数所指定的路径,但这样作须要root权限,

# 而且在同步符号链接资料时仅会同步名称,而内容将不会同步。

use chroot = no

# 设置并发链接数,0表明无限制。超出并发数后,若是依然有客户端链接请求,则将会接收到稍后重试的提示消息。

max connections = 200

# 超时时间

timeout = 300

# 忽略一些I/O错误

ignore errors

# 是否容许客户端传输数据到服务端,设置为yes表示客户端不可写,也就是只读。

read only = false

# 客户端请求显示模块列表时,是否予以显示。设置为true为显示,设置为false为不显示。

list = false

# 设置容许哪些主机能够同步数据,能够是单个IP,也能够是网段,多个IP和网段之间使用空格分隔。

hosts allow = 172.16.1.0/24  白名单

# 设置出hosts allow里面设置的主机之外,要拒绝的IP或网段信息。

hosts deny = 0.0.0.0/32      黑名单

# 设置容许链接服务端的rsync服务的虚拟用户,此用户与linux系统中的用户没有关系。

auth users = rsync_backup

# 设置秘钥认证文件,此文件要求权限为制度,建议设为600。

secrets file = /etc/rsync.password  chmod 600 /etc/

# 模块名称,rsync守护进程模式经过模块定义同步的目录,模块以[name]的形式定义。

[backup_test]

# 注释说明,非必须项。

comment = "backup dir by oldboy"

# 同步目录的真实路径

path = /backup

#####rsyncd.conf end#####

1.4.4 建立进行数据传输时所使用的linux系统用户

命令:useradd rsync -s /sbin/nologin -M

检查:id rsync

1.4.5 建立认证密钥文件

配置文件中指定的认证密钥文件默认是不存在的,须要建立出来。

命令:echo "rsync_backup:oldboyedu" > /etc/rsync.password

检查:cat /etc/rsync.password

1.4.6 设置密钥文件的权限

涉及到密码信息的文件,都应该格外注意安全性,因此尽可能将密钥文件的权限将至最低,将安全性提到最高。

rsync的密钥文件只须要root用户本身可以读写便可,因此权限设置为600便可。

命令:chmod 600 /etc/rsync.password

检查:ls -l /etc/rsync.password

1.4.7 建立本地同步目录

本地同步目录必定要确保存在,不存在的话务必要事先建立,不然在应用时会出错。

命令:mkdir -p /backup

检查:ls -ld /backup/

1.4.8 设置本地同步目录的属主和属组

因为在配置文件中设定了uid和gid的信息,因此须要将本地同步目录属主和属组为相应的用户。

命令:chown -R rsync.rsync /backup

检查:ls -ld /backup/

1.4.9 启动rsync服务

rsync --daemon

 

1.4.10 检查rsync服务是否正常启动

命令:ps -ef | grep rsync | grep -v grep

或netstat -nltup | grep rsync

或lsof -i :873

1.4.11 设置rsync开机自动启动

想要让rsync服务开机自动启动,能够将其添加至/etc/rc.local文件内。其中/etc/rc.local文件是                                 

/etc/rc.d/rc/local文件的软连接。

命令:

echo '# start rsync server when this machine opened.' >> /etc/rc.local

echo '/usr/bin/rsync --daemon' >> /etc/rc.local

1.4.12 中止rsync服务(在须要的时候使用,通常修改了服务的配置文件后会须要重启服务)

可使用killall或者pkill命令杀掉rsync服务,也能够查到端口号交给kill命令去直接杀掉。

命令:

killall rsync

或pkill rsync

或kill `cat /var/run/rsyncd.pid`

或ps aux |grep rsync |grep -v grep |awk '{print $2}' |xargs kill -9 && rm -f /var/run/rsyncd.pid

1.5 客户端部署流程

1.5.1 服务器环境检查

命令:rpm -qa rsync或rpm -qa | grep rsync

1.5.2 安装rsync软件(此步视上一步的结果来肯定是否须要操做)

若是检查结果是服务器上没有安装rsync软件,那么须要安装一下,通常rsync软件在装机时就已安装好了。

命令:yum install -y rsync

1.5.3 建立认证密钥文件

此处须要注意,与服务端不一样的地方在于,客户端的密钥文件里面只须要存放rsyncd.conf中auth users参数设定的用户的密码,不须要将用户也一并存放进去

也就是说,若是客户端的密钥文件里面也写成 user:password的形式,反却是错误的写法,在应用rsync的守护进程模式传输数据时,会致使传输失败。

命令:

echo 'oldboyedu' > /etc/rsync.password

检查:cat /etc/rsync.password

1.5.4 设置密码文件的权限

chmod 600 /etc/rsync.password

1.5.5 在客户端采用常规方式(也就是非免交互的方式)推送到服务端的命令格式以下

rsync -avzP /etc/hosts rsync_backup@172.16.1.41::backup_test

1.5.6 在客户端采用免交互的方式推送到服务端的命令格式以下

rsync -avzP /etc rsync_backup@172.16.1.41::backup_test --password-file=/etc/rsync.password

 

 

 

1.6 rsync错误问题收集

1.6.1 问题1:启动服务时提示:[root@backup ~]# rsync --daemon[root@backup ~]# failed to create pid file /var/run/rsyncd.pid: File exists

答: 这多是经过强制结束进程致使的,rsyncd.pid 是在启动服务的时候建立的,当经过不恰当的方法结束    了进程会致使该文件存在,当再次启动的时候生成此文件发现文件已存在就会报错

解决办法: rm -rf /var/run/rsyncd.pid

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

缘由:

服务器端的目录不存在或无权限,建立目录并修正权限可解决问题。

能够尝试修改所属组 所属主来解决此问题

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

缘由:

服务器端该模块(tee)须要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。

提供正确的用户名密码解决此问题。

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

模块错误,这个是常常出现的问题,解决办法 检查模块是否写错。

1.7 客户端上可能出现的问题:

1.7.1 client上遇到问题:

rsync -auzv --progress --password-file=/etc/rsync.pasword root@192.168.133.128::backup /home/

rsync: could not open password file "/etc/rsync.password": No such file or directory (2)

Password:

@ERROR: auth failed on module backup

rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]

遇到这个问题:client端没有设置/etc/rsync.password这个文件,而在使用rsync命令的时候,加了这个参

数 --password-file=/etc/rsync.pasword

1.7.2 问题2 rsync -auzv --progress --password-file=/etc/rsync.password root@192.168.133.128::backup /home/ @ERROR: auth failed on module backup rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]

遇到这个问题:client端已经设置/etc/rsync.pas这个文件,里面也设置了密码123456,和服务器一致,可是

服务器段设置有错误,服务器端应该设置/etc/rsync.password ,里面内容rsync_backup:123456 ,这里登录  名不可缺乏

1.7.3 问题3rsync: write failed on "/backup": No space left on device (28)

rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]

rsync: connection unexpectedly closed (2721 bytes received so far) [generator]

rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]

磁盘空间不够,因此没法操做。

能够经过df /backup 来查看可用空间和已用空间

1.7.4 问题4

rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)

注意查看同步的目录权限是否为755

1.7.5 问题5 :@ERROR: access denied to www from unknown (192.168.1.123)rsync: connection unexpectedly closed (0 bytes received so far) [receiver]rsync error: error in rsync protocol data stream (code 12) at io.c(359)

说明:此问题很明显,是配置选项host allow的问题,初学者喜欢一个容许段作成一个配置,而后模块又是同一个,导致致使

1.7.6 问题6:rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [generator=2.6.9]rsync error: received SIGUSR1 (code 19) at main.c(1182) [receiver=2.6.9]

说明:致使此问题多半是服务端服务没有被正常启动,到服务器上去查查服务是否有启动,而后查看下 /var/run/rsync.pid 文件是否存在,最干脆的方法是杀死已经启动了服务,而后再次启动服务或者让脚本加入系统启动服务级别而后shutdown -r now服务器