目录
- 一、概念
- 二、rsync的三种备份模式
- 本地备份
- 远程备份
- 守护进程备份
- 三、选项讲解
- 四、避免交互输入密码
我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
个人博客:传送阵
笔者微信:zhanghe15069028807
,非诚勿扰。
一、概念
1、rsync-server必知概念
- rsync 一个快速、通用的远程(和本地)文件备份工具。
- 默认占用tcp-873端口
- 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 \r 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 [email protected]:/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.
[email protected]'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 [email protected]:/tmp
#将本地的test.txt文件上传到server服务器的/tmp目录下。
[root@server ~]# ls /tmp/issue
/tmp/issue
远程备份其实也是有缺点的,有什么缺点呢?
- 首先,你得知道远程服务器的登录密码,而且每次都得手动输入密码,这样风险太大!
- 其次 ,我们上面演示的时候用的都是最高权限的用户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
根据上面定义的配置文件,我们要做以下几个事情:
- 创建rsync用户用来运行rsync服务,不创建家目录,不能登录。
- 创建登录用户,以及登录用户密码文件,并定义权限为600,记住,linux上的密码文件权限必须是600,密码的所有人和所属组不用搞成rsync
- 创建/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 [email protected]::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 [email protected]::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 [email protected]::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\nzhanghe02\nzhanghe03\nzhanghe04\nzhanghe05" > paichu.list
[root@client tmp]# cat paichu.list
zhanghe01
zhanghe02
zhanghe03
zhanghe04
zhanghe05
[root@client tmp]# rsync -avz --exclude-from=paichu.list [email protected]::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 [email protected]::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 ./ [email protected]::backup #客户端正常上传
[root@server backup]# ls #由于/tmp里面什么都没有,所以不影响服务器的backup目录
zhanghe01 zhanghe02 zhanghe03 zhanghe04 zhanghe05 zhanghe06 zhanghe07 zhanghe08 zhanghe09 zhanghe10
[root@client tmp]# rsync -avz --delete ./ [email protected]::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 [email protected]::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 [email protected]::backup
Password:
sending incremental file list
1g.txt
135,266,304 12% 10.13MB/s 0:01:28 #速度会一直保持在10M左右
四、避免交互输入密码
两种方法:
- 第一种方法是通过定义变量的方式
- 第二种方法是通过密码文件
我们最常用的就是第一种方法,由于是写脚本的时候,如下所示:
[root@web1 ~]# export RSYNC_PASSWORD=1
[root@web1 ~]# rsync -avz test.txt [email protected]::backup
第二种方法就是我们我们把密码提前写到文件里面,然后通过rsync命令调用
[root@web1 ~]# echo 1 > /etc/rsync.pass #先生成一个密码文件
[root@web1 ~]# rsync -avz test.txt [email protected]::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 [email protected]::backup --password-file=/etc/rsync.pass #成功