一 储备知识
1、备份
备份就是把重要的数据复制一份到其他位置保留起来
2、三种备份方案
- 全量
备份数据:
每次都把原数据完整copy一份
恢复数据:
只需要找到对应时间点的那一份备份数据覆盖回来就即可
- 差异
备份数据:
每次备份都是用当前数据跟第一次全量备份比较,找出差异,然后备份
恢复数据:
第一次的全量备份+对应时间节点的那一个差异备份即可
- 增量
备份数据:
每次备份都是用当前数据跟上一次的数据进行比较,找出差异,然后备份
恢复数据:
全量备份+增量1+增量2+增量3..。
3、为何要备份
运维三大职责
- 应用程序7*24*365不间断运行=>围绕三层,做好监控
- 备份=>数据丢失情况下,保证数据可以恢复回来
- 优化性能:提升用户访问速度
备份什么===重要数据
二 scp 基于ssh验证
scp -r 源路径 目标路径
上传/推
scp -r /aaa/* root@192.168.15.41:/bbb
下载/拉
scp -r root@192.168.15.41:/bbb/* /aaa
三 rsync 远程同步
语法
rsync 选项 源路径 目标路径
选项
-a 归档模式,表示递归传输并保持文件属性
-r 递归拷贝
-z 传输时进行压缩提高效率
-v 显示rsync过程中详细信息
-n 现实哪些文件将被传输 测试
-c 打开效验开关,强制对文件传输进行校验(内网无需校验)
-R 相对路径模式 rsync -a -R /a/b/c /dst/ 从a开始 rsync -a -R /a/./b/c /dst/从b开始拷
--delete 目标多出来的文件会删掉
--exclude 排除
--exclude-from=file 文件名所在的目录文件
--partial 断点续传
--bwlimit=100 限速传输
--password-file=xxx 使用密码文件
--backup 同名的文件不会被覆盖,会默认以~后缀命名保存
rsync -a --backup /111/ /222/
rsync -a --backup --suffix=".bak" /111/ /222/ 把~后缀改成.bak后缀
--backup-dir 将备份文件存放在目录下
rsync -a --backup --backup-dir=/222/bak目录 /111源/ /222目标/
--include 包含
rsync -a --include="*.txt" --exclude="*" /111/ /222/
既能本地拷贝
rsync -av 源路径 目标路径
mkdir /src
mkdir /dst
echo 111 > /src/1.txt
echo 222 > /src/2.txt
rsync -a /src /dst # 代表把源文件夹拷贝到/dst下
rsync -a /src/ /dst # 代表把源文件夹下的子文件全拷贝过去/dst
stat /dst/*
rsync -a /src/ /dst
stat /dst/* # 时间不变
echo 666 >> /src/1.txt
rsync -a /src/ /dst
stat /dst/*
也能远程传输
本地与远程均需要安装rsync
yum install rsync -y
# 远程模式
1、ssh协议
(1)在本地与目标主机都安装rsync
(2)远程主机要打开sshd服务
(3)需要用到的账号是远程主机可登录系统账号---》不安全
(4)不受目录限制-------------------------》不安全
2、rsync协议
(1)在本地与目标主机都安装rsync
(2)远程主机要打开rsync守护进程
rsync --daemon
systemctl start rsyncd
(3)用到的虚拟账号
注意:
- 1、当前登录用户是谁,进程的权限就是谁
- 2、配置中的uid控制远程链接过来的客户端的身份
(4)用的是模块名-》具体的目录
如何使用rsync协议传输
在传输时,如果未指定协议,则默认用ssh协议,指定使用rsync协议的方式有两种
方式一:rsync://协议(默认端口873)
$ rsync -az /test/ rsync://dandan@192.168.15.61:873/module
方式二:远程目标前面使用连续两个冒号
$ rsync -az /test/ dandan@192.168.15.61::module
远程传输需要经过验证才可以,验证方式有两种
1、ssh认证、协议
(1)本地与远程都需要安装rsync软件
(2)远程主机需要开启sshd服务
(3)需要用到的账号是远程主机的系统账号密码---》不安全
(4)不受文件夹的限制---》不安全
2、基于rsync-daemon(即快又安全)
(1)本地与远程都需要安装rsync软件
(2)远程主机不需要开启sshd服务,但是远程主机需要开启rsync守护进程
(3)修改好配置
rsync原理
rsync远程传数据可以简单总结为三步
1、先验证用户身份
2、检查源路径到底需要传哪些文件,默认quick check算法
3、传输
rsync总结
1、耗费cpu资源
2、源路径下如果是频繁改动的,rsync不适合,比如数据库文件
3、不适合同步大文件
守护进程模式搭建
1.环境准备
本地与远程均执行下述两条命令
setenforce 0
iptables -F
或者立即关闭防火墙 systemctl disable --now firewalld
关闭selinux: sed -i '/^SELINUX=/c SELINUX=disable' /etc/selinux/config
2.安装rsync(本地和远程主机都要装)
[root@reomte ~]# yum install rsync -y
3.在服务端远程主机配置并启动守护进程
[root@reomte ~]# vim /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 = dandan
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[xxx]
comment = "备份文件的目录"
path = /dandan_bak
解释:
uid = rsync#虚拟用户dandan对应的就是该用户的权限,限制的是客户端的权限,登录成功后,会转成uid指定的身份
gid = rsync #虚拟用户dandan对应的就是该组的权限,限制的是客户端的权限。登录成功后,转成的组身份
port = 873 #端口
fake super = yes #设置成yes,则代表uid可以不为root
use chroot = no #安全机制
max connections = 200 #最大连接数,0表示没有限制
timeout = 600 #超过时间,确保rsync服务器不会永远等待一个崩溃的客户端,0表示永远等待
ignore errors #忽略错误
read only = false #关闭只读
list = false #查看模块列表
auth users = dandan #指定虚拟用户,传输时使用该用户会对应到真实系统用户rsync的权限
secrets file = /etc/rsync.passwd #指定虚拟用户的密码文件
log file = /var/log/rsyncd.log #日志文件
#####################################
[xxx] #模块名,对应的实际目录为/dandan_bak
comment = "备份文件的目录" #备注
path = /dandan_bak #真实文件目录
创建启动守护进程时用到的用户与组
[root@reomte ~]# useradd rsync -s /sbin/nologin -M
配置虚拟用户dandan的密码文件
[root@reomte ~]# echo "dandan:123" > /etc/rsync.passwd
[root@reomte ~]# chmod 600 !$
为模块xxx创建真实的目录
[root@reomte ~]# mkdir /dandan_bak
[root@reomte ~]# chown -R rsync.rsync /dandan_bak/
启动守护进程
[root@reomte ~]# rsync --daemon #启动rsync服务,以独立监听服务的方式(守护进程)运行
[root@reomte ~]# systemctl start rsyncd
[root@reomte ~]# netstat -lntp #验证启动
其他机制
# 客户端设置远程主机的密码
[root@local ~]# vim /etc/a.pwd
1 #只存一个密码的数字
[root@local ~]# chmod 600 /etc/a.pwd
[root@local ~]# rsync -az /test/ dandan@192.168.15.71::xx模块 --password-file=/etc/a.pwd
或者
[root@local ~]# export RSYNC_PASSWORD=1 #非交互设置密码,固定用法,写脚本用
[root@local ~]# rsync -az /test/ @dandan@192.168.51.71::xx模块
四 增量备份
rsync的最大特点就是它可以完成增量备份,除了源目录与目标目录直接比较,rsync还支持使用--link-dest参数用来指定同步时的基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录
[root@reomte ~]# mkdir /data
[root@reomte ~]# mkdir /bak
[root@reomte ~]# echo 1111 > /data/1.txt
[root@reomte ~]# echo 2222 > /data/2.txt
[root@reomte ~]# ls /data/
1.txt 2.txt
[root@reomte ~]# rsync -a /data/ /bak/11
[root@reomte ~]# echo 3333 > /data/3.txt
[root@reomte ~]# rsync -a --delete --link-dest /bak/11 /data/ /bak/22
[root@reomte ~]# ls /bak/22
1.txt 2.txt 3.txt
[root@reomte ~]# echo 666 >> /data/1.txt
[root@reomte ~]# rsync -a --delete --link-dest /bak/22 /data/ /bak/33
[root@reomte ~]# ls -i /data/
67925664 1.txt 67925665 2.txt 67925666 3.txt
[root@reomte ~]# ls -i /bak/11
202391325 1.txt 202391326 2.txt
[root@reomte ~]# ls -i /bak/22
202391325 1.txt 202391326 2.txt 1363118 3.txt
[root@reomte ~]# ls -i /bak/33
67925668 1.txt 202391326 2.txt 1363118 3.txt
$ rsync -a --delete --link-dest /bak/11 /data/ /bak/22
上面命令中,--link-dest参数指定基准目录/bak/11,然后源目录/data/跟基准目录/data/进行比较,找出变动的文件,将它们拷贝到目标目录/bak/22
那些没变动的文件则会生成硬连接,硬链接指向上一个/bak/22中的文件。这个命令的第一次备份时是全量备份,后面就是增量备份了
下面是一个脚本示例,备份/opt目录
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
SOURCE_DIR="/data/"
TARGET_START_DIR="/bak/"
TARGET_DIR="${TARGET_START_DIR}/$(date '+%Y-%m-%d_%H:%M:%S')"
LATEST_LINK="${TARGET_START_DIR}/latest"
mkdir -p "${TARGET_START_DIR}"
rsync -a --delete \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
"${TARGET_DIR}"
rm -rf "${LATEST_LINK}"
ln -s "${TARGET_DIR}" "${LATEST_LINK}"