备份的作用
用于数据备份,主要用于备份重要的数据,可以尽可能的保证数据不丢失。如果有误操作导致数据丢失的话,可以恢复数据。
怎么做备份?
完全备份
表示完整备份。(效率低,占用空间过多,一般情况下只有第一次备份时去使用)
增量备份
表示只备份变化的部分。(效率高,由于只备份变化的部分,所以占用空间相对较少)
备份使用的工具
- 本地备份(cp)完整备份,每次都全部拷贝一下。
- 远程备份(scp、rsync)
rsync基本介绍
rsync 全名是remote rsync,远程同步,可以实现不同主机之间的同步,同时支持增量和全量的同步方式。
rsync备份工具的应用场景
前置条件
推(push):表示把本地的数据推送到备份服务器。
拉(pull):表示备份服务器把本地服务器上的数据拉取下来。(会造成备份服务器的开销过大)
使用场景
rsync的传输模式
rsync备份默认第一次完全备份,第二次增量备份。
- 本地传输(单个主机之间的拷贝)
语法格式:
rsync -avz 源数据路径 目标位置
使用示例:
[root@oldboy ~]# rsync -avz /root/1.sh /tmp/
# 把/root/1.sh备份到/tmp下
- 远程传输 (需要借助ssh协议进行传输,需要对端的用户名和密码)
语法格式:
【push】
rsync -avz 源文件 [用户名@]主机ip:目标目录
使用示例:
[root@oldboy ~]# rsync -avz 1.sh root@172.16.1.41:/opt
# 把本地服务器当前目录下的1.sh文件推送到172.16.1.41服务器的/opt目录下,使用root用户推送。
【pull】
使用格式:
rsync -avz [用户名@]主机ip:源文件 目标目录
使用示例:
[root@oldboy ~]# rsync -avz root@172.16.1.41:/opt/1.sh /mnt/
# 把172.16.1.41服务器的/opt/1.sh文件拉取到本地服务器的/mnt/下,使用root用户拉取。
在拉取或者推送目录时,路径最后添加/表示推送目录下的内容,不添加/表示不推送只推送目录本身。
不加用户名,默认是使用root用户。
弊端:
1)使用系统用户(不安全)
2)使用普通用户(会出现权限不够的情况)
- 守护进程(使用虚拟用户(系统中不存在)来实现推送。)
【push】
使用格式:
rsync -avz 源文件 [虚拟用户名@]主机ip:目标目录
使用示例:
在这里插入代码片
【pull】
使用格式:
rsync -avz [虚拟用户名@]主机ip:源文件 目标目录
使用示例:
在这里插入代码片
使用方法:
前期规划:
172.16.1.41 rsync服务端
172.16.1.31 rsync客户端
# 安装
[root@oldboy ~]# yum install rsync -y
# 配置
[root@backup ~]# rpm -qc rsync
查看rsync的配置文件路径
[root@backup ~]# vim /etc/rsyncd.conf
进入配置文件进行如下配置:
# [ftp]
# path = /home/ftp
# comment = ftp export area
uid = rsync # 运行进程的用户
gid = rsync # 运行进程的用户组
port = 873 # 监听的端口
fake super = yes # 不需要rsync以root身份运行就可以存储文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录,不允许跳出改目录
max connections = 200 # 最大连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份数据可读写
list = false # 不允许查看模块信息
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户连接认证密码文件路径
log file = /var/log/rsyncd.log # 日志文件的路径
#####################################
#[backup] # 定义模块信息
#comment = welcome to oldboyedu backup! # 模块注释信息
#path = /backup # 定义接收备份数据目录
创建系统用户为运行进程的用户
[root@backup ~]# useradd -M -s/sbin/nologin rsync
创建虚拟用户的密码文件并写入密码
[root@backup ~]# echo "rsync_backup:123456" >> /etc/rsync.passwd
修改用户密码文件权限
[root@backup ~]# chmod 600 /etc/rsync.passwd
创建接受备份数据的目录
[root@backup ~]# mkdir /backup
修改目录权限,允许我们可以把数据写入到/backup目录中
[root@oldboy /]# chmod -R o+w /backup/
# 启动
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
# 测试
rsync参数
-a:归档模式传输,等于-tropgDl
-v:输出传输过程的详细信息
-z:传输时进行压缩
-r:递归传输目录以及子目录
-t:保持文件时间信息
-o:保持文件属主信息
-p:保持文件权限
-g:保持文件属组信息
-l:保留软链接
-P:显示同步过程以及传输时的进度
-D:保留设备文件信息
-L:保留软链接指向的目标文件
-e:使用信道协议,指定替代rsh的shell程序
–exclude : 指定排除不需要传输的文件模式
–exclude-from:文件名所在的目录文件
-bwlimit:限速传输(用于内网交换)
-partial:断点续传
-delete:让目标目录和源目录数据保持一致
- 限速配置方法:
[root@oldboy ~]# rsync -avz -P --bwlimit=1 /root/ rsync_backup@172.16.1.41::backup
限速1kb传输
- 实现数据无差异同步的配置方法(主要用于备份目录):
推:客户端–>服务端
服务端必须与客户端保持一致。
[root@oldboy ~]# rsync -avz -delete /root/ rsync_backup@172.16.1.41::backup
拉:服务端–>客户端
客户端必须与服务端保持一致。
[root@oldboy ~]# rsync -avz -delete rsync_backup@172.16.1.41::backup /root/
- 无需输入密码实现rsync的推送以及拉取的实现方法:
方式1:–password-file(载入密码)
把我们的密码编写到某一个文件中去,然后使用–password-file参数去载入这个文件中就可以自动加载文件中的密码了。
方式2:设定环境变量的方式(脚本使用居多)
给我们的RSYNC_PASSWIRD环境变量设置值为我们的虚拟用户密码。然后就可以直接进行文件的推拉了。(临时)
rsync相关问题
- rsync用户和rsync_backup用户有什么区别?
- rsync用户是rsyncd进程运行的用户身份。
2)rsync_backup是rsync认证时需要使用的虚拟用户,可以自行定义。
- rsync.passwd与rsync.pass有什么关系?
这二者并无直接关系。
rsync.passwd主要是定义虚拟用户的名称以及虚拟用户对应的密码(服务端才定义)
rsync.pass其实可以没有,也可以是任何文件,因为这里面只有密码,便于我们向rsync推送数据时,无需密码认证(客户端。只能由密码,不能有用户名),或者设定环境变量RSYNC_PASSWORD。 - 为什么写入到backup中的文件或目录,属主和属组都是rsync呢?
客户端推送文件至服务端,服务端需要以该进程的用户身份将文件存储下路,所以属主和属组就发生了变化。(变化为了rsync该进程的运行用户身份)。 - 什么时候使用守护进程模式,什么时候使用远程传输模式。
守护进程模式可以设置定时任务进行,常用于备份。
远程传输模式主要用户临时操作。
项目实战
案例:
已知3台服务器主机名分别为web01、backup 、nfs主机信息见下表:
角色 外网IP(NAT) 内网IP(LAN) 主机名
WEB eth0:10.0.0.7 eth1:172.16.1.7 web01
NFS eth0:10.0.0.31 eth1:172.16.1.31 nfs01
Rsync eth0:10.0.0.41 eth1:172.16.1.41 backup
客户端需求
- 客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
- 客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
- 客户端最后将备份的数据进行推送至备份服务器
- 客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
- 客户端每天凌晨1点定时执行该脚本
服务端需求 - 服务端部署rsync,用于接收客户端推送过来的备份数据
- 服务端需要每天校验客户端推送过来的数据是否完整
- 服务端需要每天校验的结果通知给管理员
- 服务端仅保留6个月的备份数据,其余的全部删除
客户端脚本编写如下:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/root/bin
Time=$(/usr/bin/date +%F)
Hostname=$(/usr/bin/hostname)
Ip=$(/usr/sbin/ifconfig eth1 | grep "netmask" | awk '{print $2}')
Dirname="${Hostname}_${Ip}_${Time}"
/usr/bin/mkdir -p "/backup/$Dirname"
/usr/bin/tar -czf /backup/$Dirname/etc.tar.gz /etc/fstab /etc/hosts /var/spool/cron/ /etc/firewalld
/usr/bin/rsync -avz /backup/$Dirname rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
/usr/bin/find /backup -type d -mtime +7 | xargs /usr/sbin/rm -rf
客户端定时任务编写如下:
# 每天凌晨1点备份数据
00 01 */1 * * /usr/bin/bash /root/1.sh &>/dev/null
服务端配置:
# 安装
[root@oldboy ~]# yum install rsync -y
# 配置
[root@backup ~]# rpm -qc rsync
查看rsync的配置文件路径
[root@backup ~]# vim /etc/rsyncd.conf
进入配置文件进行如下配置:
# [ftp]
# path = /home/ftp
# comment = ftp export area
uid = rsync # 运行进程的用户
gid = rsync # 运行进程的用户组
port = 873 # 监听的端口
fake super = yes # 不需要rsync以root身份运行就可以存储文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录,不允许跳出改目录
max connections = 200 # 最大连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份数据可读写
list = false # 不允许查看模块信息
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户连接认证密码文件路径
log file = /var/log/rsyncd.log # 日志文件的路径
#####################################
#[backup] # 定义模块信息
#comment = welcome to oldboyedu backup! # 模块注释信息
#path = /backup # 定义接收备份数据目录
创建系统用户为运行进程的用户
[root@backup ~]# useradd -M -s/sbin/nologin rsync
创建虚拟用户的密码文件并写入密码
[root@backup ~]# echo "rsync_backup:123456" >> /etc/rsync.passwd
修改用户密码文件权限
[root@backup ~]# chmod 600 /etc/rsync.passwd
创建接受备份数据的目录
[root@backup ~]# mkdir /backup
修改目录权限,允许我们可以把数据写入到/backup目录中
[root@oldboy /]# chmod -R o+w /backup/
# 启动
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
服务端脚本编写:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/root/bin
Time=$(/usr/bin/date +%F)
Path=/backup
find $Path/ -type f -name "check_flag_$Time" | xargs md5sum -c > $Path/result_$Time
mail -s "Rsync Backup $Time" 2756026071@qq.com < $Path/result_$Time
find $Path -type d -mtime +180 | xargs rm -rf
配置邮箱文件:
set bsdcompat
set bsdcompat
set from=2358423198@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2358423198@qq.com
set smtp-auth-password=校验码
set smtp-auth=login
服务器定时任务:
# 每天校验备份数据完整性并将结果邮箱通知管理员
00 00 */1 * * bash /scripts/1.sh &> /dev/null