备份的三种类型
- 全量备份
备份数据:
每次都把当前数据完整的copy一份
恢复数据:
只需要找到对应的时间点那一份数据,覆盖当前数据即可
- 差异备份
备份数据:
每次备份都用当前的数据跟第一次的全量备份数据进行比较,找出差异,然后进行备份
恢复数据:
只需要先恢复第一次备份的结果,然后再恢复对应时间点的差异备份结果即可
- 增量备份
备份数据:
每次备份都是用当前的数据跟上一次的数据进行比较,找出差异,然后进行备份
恢复数据:
全量备份+增量1+增量2+增量3...+当前增量数据
- 三种备份方式的对比
备份数据的过程,从占用资源的角度对比 : 全量备份占用的资源 > 差异备份占用的资源 > 增量备份占用的资源
恢复数据的过程,从恢复效率的角度对比 : 全量备份恢复数据的效率 > 差异备份恢复数据的效率 > 增量备份恢复是数据的效率
- 常用的备份工具
1. cp复制(可以,但是cp只能在本地拷贝,所以不会用它来进行备份)
2. scp远程传输
3. rsync远程传输
三种备份工具的差异:
cp和scp只支持全量备份
rsync可以支持全量备份,也可以支持增量备份
scp复制介绍
- scp = cp + ssh (只支持全量备份 ! ! !)
格式: scp -r 源路径 目标路径
mkdir /test
touch /test/{1..5}.txt
- 上传
1. 传输目录
scp -r /test root@192.168.80.120:/opt 将本地test目录(包含目录本身)传输到192.168.80.120的opt目录下
2. 传输文件
scp -r /test/* root@192.168.80.120:/opt 将本地test目录下的文件传输到192.168.80.120的opt目录下
ls /opt
# 1.txt 2.txt 3.txt 4.txt 5.txt test
- 下载
1. 下载目录
scp -r root@192.168.80.120:/opt /aaa 将192.168.80.120的opt目录下载到本地aaa目录下
2. 下载文件
scp -r root@192.168.80.120:/opt/* /aaa 将192.168.80.120的opt目录下的文件下载到本地aaa目录下
ls scp -r root@192.168.80.120:/opt/* /aaa
# 1.txt 2.txt 3.txt 4.txt 5.txt opt test
rsync介绍
-
rsync是Linux/Unix下的一个远程数据同步工具。它可以用过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以较少数据的传输。rcync支持全量备份和增量备份
-
rsync第一次会全量传输,后续会对比两个文件的不同,只传输文件更新的部分,传输速度比一般工具快(底层是通过算法来实现对比的)。
-
rsync支持在本地计算机与远程计算机之间同步数据(包括本地推到远程,远程拉到本地两种同步方式),不支持源路径与目标路径都是远程路径(scp可以实现)。
-
rsync的远程同步是跨平台的
inux --> windows windows --> linux linux --> mac mac --> linux mac --> windows
-
rsync虽然是远程同步,但也支持两个本地目录之间的同步文件,因此它也可以当作文件复制工具,代替cp和mv命令
-
-
rsync = cp + scp
-
验证rsync底层原理(1)
echo 111>a.txt
cp -a a.txt a1.txt -a不更改文件属性进行复制a.txt
stat a1.txt 查看a1的文件属性
# Change: 2021-04-15 21:08:54.998161802 +0800
\cp -a a.txt a1.txt \cp取消别名"-i",-a不更改文件属性进行复制
stat a1.txt
# Change: 2021-04-15 21:09:37.937162777 +0800
rsync -a a.txt a1.txt 使用rsync进行本地拷贝
stat a1.txt
# Change: 2021-04-15 21:09:37.937162777 +0800
- 结论:源文件的数据没有变化,rsync并没有对文件的数据进行覆盖,可以看出rsync备份只传输数据更新的部分
- rsync既能支持本地拷贝,也能支持远程传输
1. 本地模式
格式:rsync 选项 源数据 目标数据
常用的选项: -a 归档模式,表示递归传输并保持文件属性
-v 显示rsync过程中的详细信息
-z 传输时进行压缩提高效率(提升计算机的io效率)
-c 打开校验开关,强制对文件传输进行校验(会降低网络传输的效率)
-n 测试备份,不做实际修改
--delete 删除目标文件夹内多余的文档(数据的同步)
--exclude 排除某些文件或目录
--include 指定某些的文件模式,往往与--exclude结合使用
mkdir /a
mkdir /b
echo 111>/a/1.txt
echo 222>/a/2.txt
ls /a
# 1.txt 2.txt
rsync -a /a/ /b /目录/ 表示拷贝目录下的文件
ls /b
# 1.txt 2.txt
rsync -a /a /b /目录 表示拷贝目录本身以及目录下的文件
ls /b
# 1.txt 2.txt a
- 验证底层原理(2)
stat /b
# Change: 2021-04-15 21:31:14.802192228 +0800
echo 123>/a/1.txt
rsync -a /a /b
stat /b
# Change: 2021-04-15 21:31:14.802192228 +0800
stat /b/1.txt
# Change: 2021-04-15 21:31:08.174192078 +0800
- 结论:我们通过rsync命令更改目录下的文件属性,目录本身的属性是不会发生变化的,变更目录下的文件属性发生了变化。
- 更加证实了rsync备份只传输数据更新的部分的结论
=======================================================================================================================
--exclude 排除某些文件或目录
ls /a
# 1.jpg 1.mp4 1.txt 2.jpg 2.mp4 2.txt 3.jpg 3.mp4 3.txt
rsync -a --exclude="*.mp4" /a/ /b/ 备份a目录下除了*.mp4以外的所有文件
ls /b
# 1.jpg 1.txt 2.jpg 2.txt 3.jpg 3.txt
rm -rf /b/*
ls /b
mkdir /a/xxx
touch /a/xxx/{a..z}.log
rsync -a --exclude="xxx/*" /a/ /b/ 备份除了/a/xxx/*目录下的其他所有文件
ls /b
# 1.jpg 1.mp4 1.txt 2.jpg 2.mp4 2.txt 3.jpg 3.mp4 3.txt xxx
ls /b/xxx /b/xxx的内容显示为空
--delete 数据同步,删除目录下多余的文件
mkdir /c
touch /c/1.txt
rsync -a --delete /c/ /b/
ls /b
# 1.txt
--include 指定某种文件的模式,与exclude意思相反
rsync -a --include="*.log" --exclude="*" /test/ /test2/
ls /test2
# a.log b.log c.log d.log
2. 远程模式
本地与远程均需要安装rsync
yum -y intall rsync
关闭防火墙和selinux
setforce 0
systemctl stop firewalld
远程传输需要经过验证才可以,验证的方式有两种
- ssh认证
1. 本地与远程都需要安装rsync软件
2. 远程主机需要开启sshd服务
3. 需要用到的账号是远程主机的系统账号密码==》有风险(基于ssh协议,需要知道对方的系统账号和密码)
4. 不受文件夹的限制==》不安全
格式:
rsync 选项 源路径 目标路径
rsync -az /abc/ root@192.168.80.120:/opt (推)将/abc目录下的文件传输给192.168.80.120的opt目录
rsync -az root@192.168.80.120:/opt/ /abc (拉)将192.168.80.120的opt目录下的文件传输给/abc目录
- 基于守护进程(rsync-daemon)认证
1. 本地与远程都需要安装rsync软件
2. 远程主机不需要开启sshd服务,但是远程主机需要开启rsync守护进程
3. 修改配置文件
-
校验用户身份原理图 :
-
修改rsync配置文件
/etc/rsyncd.conf
-
rsync协议分为两个部分: 1. 验证用户身份(
/etc/rsync.passwd
) ;2. 将数据读写至指定的目录(/lala_bak
)
1. 验证用户身份
验证用户身份与服务端有关,谁(当前登陆的用户身份)开启了进程,谁就是该进程的属主,与配置文件中的gid,uid无关。
2. 将数据写入指定的目录
控制客户端的虚拟用户(对应的真实系统身份)对指定目录(数据备份)的权限,配置文件中的uid与gid是为了控制客户端对于备份目录的权限。
- rsync协议传输数据的格式
推(上传): rsync 选项 源路径 虚拟用户身份@IP地址::模块名
rsync 选项 源路径 rsync://虚拟用户身份@IP地址:端口号/模块名
- 搭建服务(服务端)
1. 修改配置文件
vim /etc/rsyncd.conf
uid = rsync 真实的系统用户身份
gid = rsync 真实的系统用户组
port = 873 端口
fake super = yes 是否允许转换成root用户身份启动软件,yes是普通用户身份,no是root身份
use chroot = no 安全机制
max connections = 200 最大连接数
timeout = 600 超时时间(超时断开连接)
ignore errors 忽略错误
read only = false 关闭只读
list = false 查看模块列表
auth users = lala 指定虚拟用户(对应的是rsync真实用户身份)
secrets file = /etc/rsync.passwd 指定虚拟用户的密码文件
log file = /var/log/rsyncd.log 指定虚拟用户的日志文件
#################################################################################
[2008] 模块名
comment = "备份文件的目录" 备注
path = /lala_bak 指定服务端备份文件的目录路径
2. 创建启动守护进程时所用的的用户与组
useradd rsync -s /sbin/nologin -M
# -s指定用户的登陆解释器(/sbin/nologin:禁止用户登陆系统);-M(不创建家目录)
3. 配置虚拟用户lala的密码文件
echo "lala:123" > /etc/rsync.passwd
# 密码文件格式 用户名:密码
chmod 600 /etc/rsync.passwd 修改虚拟用户密码文件的权限
4. 创建模块[2008]的真实目录
mkdir /lala_bak
chown rsync:rsync /lala_bak 修改备份文件的目录路径的属主和属组
5. 启动守护进程
rsync --daemon 开启守护进程(当前登陆的用户是谁,谁就是这个rsync守护进程的属主)
- 客户端
- 交互式上传数据
mkdir /a
echo 111 > /a/1.txt
echo 222 > /a/2.txt
方式1:
rsync -az /test/ lala@192.168.80.100::2008
方式2:
rsync -az /test/ rsync://lala@192.168.80.100:873/2008
- 切换到服务端查看备份数据指定的目录
ls /lala_bak/
# 1.txt 2.txt
- 免交互式上传数据
- 客户端命令
vim /etc/a.pwd
123 # 服务端的密码
方式1:
--password-file=(指向客户端保存服务端密码的文件的路径)
chmod 600 /etc/a.pwd 设置保存服务端密码的文件权限
rsync -az /test/ lala@192.168.80.100::2008 --password-file=/etc/a.pwd
方式2:
export RSYNC_PASSWORD=123 设置环境变量
rsync -az /test/ lala@192.168.80.100::2008
# 永久开启只需要把export RSYNC_PASSWORD=123写入/etc/profile配置文件中即可
- 命令补充
针对一些数据量比较大的数据,我们可以通过选项对数据的发送进行限速
--bwlimit=100 选项:限制传输数据的平均速度为100kb/s
-P 选项:显示同步过程及传输时的进度等信息
dd if=/dev/zero of=/test/xxx.bak bs=100M count=5 在test目录下创建一个500M的xxx.bak空文件,文件大小为500M
# 5+0 records in
# 5+0 records out
# 524288000 bytes (524 MB) copied, 0.288425 s, 1.8 GB/s
ll /test
# total 512000
# -rw-r--r-- 1 root root 524288000 Apr 18 19:50 xxx.bak
rsync -avzP --bwlimit=100 /test/ lala@192.168.80.100::2008 --bwlimit指定速度传输,限制传输数据的平均速度为100kb/s
# sending incremental file list
# ./
# xxx.bak
# 524,288,000 100% 100.74MB/s 0:00:04 (xfr#1, to-chk=0/2)
# sent 509,993 bytes received 46 bytes 78,467.54 bytes/sec
# total size is 524,288,000 speedup is 1,027.94
谁开启了进程,谁就是该进程的属主 ! ! !
- 验证
1. 将服务端的密码文件权限设置成000
chmod 000 /etc/rsync.passwd
2. 切换到客户端,客户端向服务端传数据
mkdir /aaa/
touch /aaa/1.txt
rsync -az /aaa/ lala@192.168.80.100::2008 基于rsync协议传输数据
# Password:
3. 切换到服务端,查看指定目录下文件有没有备份成功
ls /lala_bak
# 1.txt
我们在客户端向服务端传输数据的时候,服务端需要先通过/etc/rsync.passwd验证虚拟用户的身份。
我们将/etc/rsync.passwd文件权限设置成了000,那么所有人都是无法拿到密码文件的内容进行校验的,也就是说按理来说,数据是无法备份成功的。
但是最终数据是备份成功的,也就说明服务端的开启的守护进程的属主是root身份,因为root身份是具备最高权限的。