rsync

我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
个人博客:传送阵
笔者微信:zhanghe15069028807,非诚勿扰。

一、概念

1、rsync-server必知概念

  1. rsync 一个快速、通用的远程(和本地)文件备份工具。
  2. 默认占用tcp-873端口
  3. c/s架构,注意不是b/s,b/s是指带浏览器那样的。

2、备份的模式

备份的模式也就分为三种:推,拉,推拉结合

何谓推?比如我们将本地的文件上传到百度云服务器做备份,这就是推。

何谓拉?百度云有一个同步本地磁盘的功能,当我们在本地磁盘上做了更改之后,百度云盘会将我们做的更改“拉”走,同步到百度云的服务器上。

什么是推拉结合呢?其实很简单,比如我们本地有一个备份服务器,集群中所有的服务器将重要文件定时推到备份服务器上,此时我们新增一个异地容灾服务器,它也要同步本地备份服务器上的内容,但本地备份服务器在内网,数据无法在公网上传输!昨办?我们现在再不讨论NAT端口映射,只考虑存储的话,我们也有一个比较好的解决方案。我们可以买一个云存储,将本地备份服务器上的数据全部推到云存储上,然后用异地的备份服务器将云存储的内容拉下来。

二、rsync的三种备份模式

rsync有三种备份模式:本地备份、远程备份、守护进程备份。

本地备份

我们经常使用cp也可以用来做本地备份,其实rsync其实也可以用来做本地备份。但我们平时用cp就可以了,短小精悍,如果本地备份也要用rsync的话,有一种杀鸡用宰牛刀的感觉,演示一下吧!

rsync [OPTION...] SRC... [DEST]  #这就是本地备份的语法,简单至极,与cp一样
 
[zhanghe@localhost ~]$ rsync /etc/issue /tmp
[zhanghe@localhost ~]$ cat /tmp/issue 
S
Kernel 
 on an m

远程备份

远程备份,一看就要用到两台服务器,我们先来规划一下。

  • client:192.168.80.100
  • server:192.168.80.200

我们上面提到过,备份分为三种模式,我们在这里面演示两种,在client演示,将本地的文件推送到服务器上和用clinet将服务器上文件拉下来。

  • Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #pull是下拉,别搞混了!
  • Push: rsync [OPTION...] SRC... [USER@]HOST:DEST #push是推送
[root@client ~]# rsync -avz root@192.168.80.200:/etc/issue /tmp
#从客户端把服务器(80.200)的文件拉到本地的/tmp目录下,请先忽略avc是什么意思,我们下面会详细讲解的。
The authenticity of host '192.168.80.200 (192.168.80.200)' can't be established.
ECDSA key fingerprint is SHA256:57uTU9xPTEOp2Zt/LR3O9M9o0fpAlPxRn3CYL8i9fhg.
ECDSA key fingerprint is MD5:48:98:4f:85:40:07:b4:6a:6b:d9:34:fc:67:47:be:d1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.80.200' (ECDSA) to the list of known hosts.
root@192.168.80.200's password: 
receiving incremental file list
issue

sent 43 bytes  received 105 bytes  26.91 bytes/sec
total size is 23  speedup is 0.16
[root@client ~]# ls /tmp/issue 
/tmp/issue
[root@client ~]# echo zhanghehe > test.txt
[root@client ~]# rsync -avz ./test.txt root@192.168.80.200:/tmp
#将本地的test.txt文件上传到server服务器的/tmp目录下。
[root@server ~]# ls /tmp/issue 
/tmp/issue

远程备份其实也是有缺点的,有什么缺点呢?

  1. 首先,你得知道远程服务器的登录密码,而且每次都得手动输入密码,这样风险太大!
  2. 其次 ,我们上面演示的时候用的都是最高权限的用户root,如果用普通用户的话,肯定会权限不足的。

结论就是,rsync的远程备份模式平时偶尔用一用就可以了!

既然远程备份缺点这么多,怎么办呢?那就是我们下面要说的守护进程备份,这种方式才是我们要讲的重点,也是我们在真实的环境当中使用的。

守护进程备份

安装、启动:

[root@server ~]# yum -y install rsync    #默认就在后台运行
[root@server ~]# systemctl start rsyncd 
[root@server ~]# systemctl enable rsyncd
[root@server ~]# systemctl status rsyncd 


[root@server ~]# rpm -qc rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd

配置文件:

第一份配置文件用于学习不能直接粘贴使用,因为配置文件后面加了#,会干扰配置的,如果要用的话,请用第二份。

[root@server ~]# cat /etc/rsyncd.conf 
uid = rsync    #使用哪个用户来运行rsync
gid = rsync
port = 873 
fake super = yes   #忽略组的原始属性
use chroot = no  #是否把用户固定到某一个目录,不能到处跑,关闭
max connections = 200  #最大连接数
timeout = 600   #超时时间
ignore errors    #忽略错误
read only = false  #是否只读,关闭,我们要的可不只是这些
list = false     #是否只允许列表,关闭,我们要的可不只这些!
auth users = rsync_backup      #定义登录的用户
secrets file = /etc/rsync.passwd  #定义登录用户的密码文件
log file = /var/log/rsync.log  #定义日志的位置
[backup]   #模块的名称
comment = welcome!
path = /backup
cat /etc/rsyncd.conf 
uid = rsync
gid = rsync
port = 873 
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsync.log
[backup]
comment = welcome!
path = /backup

根据上面定义的配置文件,我们要做以下几个事情:

  1. 创建rsync用户用来运行rsync服务,不创建家目录,不能登录。
  2. 创建登录用户,以及登录用户密码文件,并定义权限为600,记住,linux上的密码文件权限必须是600,密码的所有人和所属组不用搞成rsync
  3. 创建/bakcup目录,用来存放文件,并保证sync用户能在此目录下写入
[root@server ~]# useradd -M -s /sbin/nologin rsync
[root@server ~]# echo "rsync_backup:1" > /etc/rsync.passwd  #密码定义为1
[root@server ~]# chmod 600 /etc/rsync.passwd
[root@server ~]# mkdir /backup
[root@server ~]# chown -R rsync:rsync /backup

好,下面要在客户端上进行测试使用了

Access via rsync daemon:

​ Push: rsync [OPTION...] SRC... [USER@]HOST::DEST #上传

​ Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #下载

[root@client ~]# rsync -avz /etc/issue rsync_backup@192.168.80.200::backup   #上传
rsync: failed to connect to 192.168.80.200 (192.168.80.200): No route to host (113)
rsync: mkstemp ".issue.3ZZt8M" (in backup) failed: Permission denied (13)

尽管我们已经考虑的很周到了,但是不可避免,还是出了以上两个错误,我们来仔细看一下,第一个报错说是没有主机路由,其实这两台主机是可以通信的,不存在路由问题,其实这是因为没有关闭防火墙,关了就好了。第二个错误说是错误拒绝,没有理由,权限我们问题已经很全面了,那是为什么呢?原因是因为selinux没关,关了就好了!

后来复现实验的时候,又出现了一个错误,如下

[root@Nfs tmp]# rsync -avz /tmp/test.txt rsync_backup@192.168.80.222::data
Password: 
@ERROR: auth failed on module data    #提示模块错误
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]

这个错误是因为配置文件后面后空格,导致的,删除了空格之后重启之后就好了。

上面演示的是上传,我们下面演示下载是怎样的:

 rsync -avz rsync_backup@192.168.80.200::backup /tmp   #将bakcup模块里面的东西下载下来,

三、选项讲解

我们上面一起用avx这三个 选项,我们还没有来得及好好讲解呢!下面就来说一说。

我们主要是记忆这三个,其余的会用就可以了。

-a 归档模式传输,和cp -a的意思差不多

-v verbose 输出详细信息

-z 传输时进行压缩

--exclude=指定排除文件,例如:

[root@server backup]# touch zhanghe{01..10}   #在服务端创建10个文件
[root@server backup]# ls
zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10

在客户端上如果我们不排除任何文件的话,就会把所有的文件都会下载下来,假设我们想要排除zhanghe01,如下:

[root@client tmp]# rsync -avz --exclude=zhanghe01  rsync_backckup /tmp

在客户端上如果我们不排除任何文件的话,就会把所有的文件都会下载下来,假设我们想要排除zhanghe01一直到zhanghe05这五个文件呢?我们把这个五个文件名写入到一个文件,让rsync命令直接读取这个文件,如下:

[root@client tmp]# echo -e "zhanghe01
zhanghe02
zhanghe03
zhanghe04
zhanghe05" > paichu.list
[root@client tmp]# cat paichu.list
zhanghe01
zhanghe02
zhanghe03
zhanghe04
zhanghe05
[root@client tmp]# rsync -avz --exclude-from=paichu.list  rsync_backup@192.168.80.200::backup /tmp

--delete 客户端是什么样子服务器就应该是什么样子。客户端强制让服务器一致,有覆盖的意思,比较危险,如下所示:

[root@server backup]# ls  #服务器上有10个文件
zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
[root@client tmp]# ls   #客户端上只有6个
paichu.list  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
[root@client tmp]# rsync -avz --delete rsync_backup@192.168.80.200::backup /tmp       #将服务器上backup目录强行同步到客户端
[root@client tmp]# ls   #客户端就成了10个文件了
zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10

反过来写效果更危险:

[root@client tmp]# ls    #客户端的/tmp目录什么都没有
[root@client tmp]# 
[root@server backup]# ls  #服务器这个目录有10个文件
zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
[root@client tmp]# rsync -avz ./ rsync_backup@192.168.80.200::backup  #客户端正常上传
[root@server backup]# ls  #由于/tmp里面什么都没有,所以不影响服务器的backup目录
zhanghe01  zhanghe02  zhanghe03  zhanghe04  zhanghe05  zhanghe06  zhanghe07  zhanghe08  zhanghe09  zhanghe10
[root@client tmp]# rsync -avz --delete ./ rsync_backup@192.168.80.200::backup      #加上delete选项
[root@server backup]# ls    #服务器的bakcup目录啥都没有了,太危险了,这操作,少用!慎用!
[root@server backup]# 

再来个限速的,限速真的非常重要,如果内部没有上网行为管理类的设备,一旦同步开启,就会加足马力,把内网的带宽完全占满,这是很常见的故障,所以我们在同步的时候,最好限定网速,通过--bwlimit 来限速,默认是单位是MB,我们先来看看如果不限速的话,带宽占用可以达到多少吧!

[root@client tmp]# dd if=/dev/zero of=./1g.txt bs=1M count=1000   #在客户端上生成一个1g的文件
[root@client tmp]# rsync -avzP ./1g.txt rsync_backup@192.168.80.200::backup    #-P就是显示传输速度
Password: 
sending incremental file list
1g.txt
    462,389,248  44%  110.32MB/s    0:00:05    #如果不限速可达100多MB,下面我们限一下速度
[root@client tmp]# rsync -avzP --bwlimit=10 ./1g.txt rsync_backup@192.168.80.200::backup     
Password: 
sending incremental file list
1g.txt
    135,266,304  12%   10.13MB/s    0:01:28     #速度会一直保持在10M左右

四、避免交互输入密码

两种方法:

  1. 第一种方法是通过定义变量的方式
  2. 第二种方法是通过密码文件

我们最常用的就是第一种方法,由于是写脚本的时候,如下所示:

[root@web1 ~]# export RSYNC_PASSWORD=1
[root@web1 ~]# rsync -avz test.txt rsync_backup@192.168.80.200::backup

第二种方法就是我们我们把密码提前写到文件里面,然后通过rsync命令调用

[root@web1 ~]# echo 1 > /etc/rsync.pass   #先生成一个密码文件
[root@web1 ~]# rsync -avz test.txt rsync_backup@192.168.80.200::backup --password-file=/etc/rsync.pass  #通过参数调用
ERROR: password file must not be other-accessible   #其他人权限错误,权限必须是600
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
[root@web1 ~]# chmod 600 /etc/rsync.pass 
[root@web1 ~]# rsync -avz test.txt rsync_backup@192.168.80.200::backup --password-file=/etc/rsync.pass   #成功
原文地址:https://www.cnblogs.com/yizhangheka/p/12106461.html