备份服务器
作用:
01. 数据备份的服务器
02. 进行日志统一保存
[root@nfs01 backup]# grep -r oldboy /backup/
/backup/10.0.0.7_bak/oldboy.log:oldboy
什么是rsync服务
Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据同步备份的优秀工具
Rsync简介
rsync英文称为remote synchronization,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
在同步数据的时候,默认情况下,rsync通过其独特的“quick check”算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。
rsync官方地址:
小提示:利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。
Rsync的特性
支持拷贝特殊文件,如连接文件、设备等。 可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。 可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。 可以通过socket(进程方式)传输文件和数据(服务端和客户端)*。 支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
生产场景架构集群备份方案
1.借助cron+rsync把所有客户服务器数据同步到备份服务器。
2.针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案。
3.通过本地打包备份,然后rsync结合inotify应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果。
4.定期将IDC机房的数据 备份公司的内部服务器,防止机房地震及火灾问题导致数据丢失。
5.实时同步,解决存储服务器等的单点问题。
备份类型介绍
Rsync应用场景
1.推: 所有主机推送本地数据至Rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)
2.拉: rsync备份服务端拉取所有主机上的数据,会导致备份服务器开销大
3.大量服务器备份场景
4.异地备份实现思路
Rsync传输模式
Rsync使用三种主要的数据传输方式
本地方式
远程方式
单个主机本地之间的数据传输(此时类似于cp
命令)
1 2 3 4 5 6 | Local: rsync [OPTION...] SRC... [DEST] rsync # 备份命令(cp) [options] # 选项 SRC... # 本地源文件 [DEST] # 本地目标文件 rsync -avz /etc/passwd /tmp/ |
远程传输方式
通过ssh
通道传输数据,类似scp
命令
1 2 3 4 5 6 7 8 9 10 11 12 13 | #pull拉取数据命令 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #pull拉取数据示例 [root@backup ~] # rsync -avz root@172.16.1.41:/etc/hostname ./ #拉取远程文件 [root@backup ~] # rsync -avz root@172.16.1.41:/root/ /backup/ #拉取远程目录下的所有文件 [root@backup ~] # rsync -avz root@172.16.1.41:/root /backup/ #拉取远程目录以及目录下的所有文件 Pull #拉取, 下载 rsync #备份命令 [options] #选项 [USER@] #目标主机的系统用户 HOST #目主机IP地址或域名 SRC... #目标主机源文件 [DEST] #下载至本地哪个位置 |
#push推送数据命令
1 2 3 4 5 6 7 8 9 10 | Push: rsync [OPTION...] SRC... [USER@]HOST:DEST #push推送数据示例 rsync -avz /backup/2018-10-01 root@172.16.1.41: /tmp/ Push #推送, 上传 rsync #备份命令 [options] #选项 SRC... #本地源文件 [USER@] #目标主机的系统用户 HOST #目主机IP地址或域名 [DEST] #目标对应位置 |
Rsync
借助SSH
协议同步数据存在的缺陷
1.使用系统用户(不安全) 2.使用普通用户(会导致权限不足情况)
守护进程传输方式
rsync
自身非常重要的功能(不使用系统用户,更加安全)
#pull拉取数据命令
1 2 3 4 5 6 7 8 9 | Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #1.拉取rsync备份服务的"backup模块"至本地/mnt目录 [root@nfs01 ~] # rsync -avz rsync_backup@172.16.1.41::backup/ /mnt/ --password-file=/etc/rsync.password rsync #命令 [OPTION...] #选项 [USER@] #远程主机用户(虚拟用户) HOST:: #远程主机地址 SRC... #远程主机模块(不是目录) [DEST] #将远程主机数据备份至本地什么位置 |
#push推送数据命令
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
#2.将本地/mnt目录推送至rsync备份服务器的"backup模块"
1 2 3 4 5 6 7 | [root@nfs01 ~] # rsync -avz /mnt/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password rsync #命令 [OPTION...] #选项 SRC... #远程主机模块(不是目录) [USER@] #远程主机用户(虚拟用户) HOST:: #远程主机地址 [DEST] #将远程主机模块备份至本地什么位置 |
Rsync命令对应选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | -a # 归档模式传输, 等于-tropgDl - v # 详细模式输出, 打印速率, 文件数量等 -z # 传输时进行压缩以提高效率 -r # 递归传输目录及子目录,即目录下得所有目录都同样传输 -R, --relative # 使用相对路径名 -t # 保持文件时间信息 -o # 保持文件属主信息 -p # 保持文件权限 -g # 保持文件属组信息 -l # 保留软连接 -P # 显示同步的过程及传输时的进度等信息 -D # 保持设备文件信息 -L # 保留软连接指向的目标文件 -e # 使用的信道协议,指定替代rsh的shell程序 --exclude=PATTERN # 指定排除不需要传输的文件模式 --exclude-from= file # 从文件读取排除列表 --bwlimit=100 # 限速传输 --partial # 断点续传 --delete # 让目标目录和源目录数据保持一致, 从目标目录中删除无关文件 --password- file = file # 指定密码文件 |
Rsync服务使用
准备
主机角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名称 |
---|---|---|---|
Rsync服务端 | 10.0.0.41 | 172.16.1.41 | backup |
Rsync客户端 | 10.0.0.31 | 172.16.1.31 | nfs |
(1)服务端安装Rsync
1 | [root@backup ~] # yum -y install rsync |
(2)服务端配置Rsync
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@backup ~] # 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 = rsync_backup secrets file = /etc/rsync . passwd log file = /var/log/rsyncd .log [backup] comment = welcome to oldboyedu backup! path = /backup |
-
/etc/rsyncd.conf
配置文件详解:-
配置项放在模块外是全局配置,对所有模块生效
-
配置项放在模块中是局部配置,仅对该模块生效
-
可以创建多个模块用于多线程,多目录操作
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@backup ~] # cat /etc/rsyncd.conf uid = rsync # 运行进程的用户 gid = rsync # 运行进程的用户组 port = 873 # 监听端口 fake super = yes # 无需让rsync以root身份运行,允许接收文件的完整属性 use chroot = no # 禁锢推送的数据至某个目录, 不允许跳出该目录 max connections = 0 # 0是最大并发连接数不限制 timeout = 600 # 超时时间 ignore errors # 忽略错误信息 exclude = lost+found/ # 排除选项 log file = /var/log/rsyncd .log # 指定日志文件路径, 默认 pid file = /var/run/rsyncd .pid # pid文件路径 lock file = /var/run/rsyncd .lock # 锁文件路径 read only = false # 对备份数据可读写 list = false # 不允许查看模块信息 reverse lookup = no # 不做解析反向解析 hosts allow = 172.16.1.0 /24 # 允许172.16.1.0网段访问 auth users = rsync_backup # 定义连接认证用户 secrets file = /etc/rsync . passwd # 定义连接认证用户密码文件路径 [backup] # 定义模块信息 comment = commit # 模块注释信息 path = /backup # 定义接收备份数据目录 |
(3)服务端创建用户
创建一个用来运行rsync服务的用户身份,不允许登录,不创建家目录
1 | [root@backup ~] # useradd -M -s /sbin/nologin rsync |
(4)服务端准备同步目录
同步目录的磁盘空间尽可能足够大,授权rsync用户为属主
1 2 | [root@backup ~] # mkdir /backup [root@backup ~] # chown -R rsync.rsync /backup/ |
(5)服务端虚拟用户配置
创建虚拟用户密码文件, 授权600安全权限(用于客户端连接时使用的用户)
1 2 | [root@backup ~] # echo "rsync_backup:123456" >/etc/rsync.passwd [root@backup ~] # chmod 600 /etc/rsync.passwd # 修改权限,避免其他人看见此文件的用户名密码 |
(6)服务端启动
启动rsync服务,并将rsync加入开机自启动
1 2 | [root@backup ~] # systemctl start rsyncd [root@backup ~] # systemctl enable rsyncd |
(7)服务端检查服务和端口
1 2 3 4 5 6 7 8 9 10 | [root@backup ~] # systemctl status rsyncd.service rsyncd.service - fast remote file copy program daemon Loaded: loaded ( /usr/lib/systemd/system/rsyncd .service; enabled; vendor preset: disabled) Active: active (running) since Mon 2020-08-31 14:49:55 CST; 15min ago Main PID: 24685 ( rsync ) CGroup: /system .slice /rsyncd .service └─24685 /usr/bin/rsync --daem.. [root@backup ~] # netstat -lntup | grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 24685 /rsync tcp6 0 0 :::873 :::* LISTEN 24685 /rsync |
(8)客户端安装
1 2 3 4 5 6 7 | [root@nfs ~] # yum -y install rsync # 方式一:适合终端执行指定用户密码文件 [root@nfs ~] # echo "123456" > /etc/rsync.passwd [root@nfs ~] # chmod 600 /etc/rsync.passwd # 方式二:脚本中使用环境变量RSYNC_PASSWORD,强烈推荐 [root@nfs ~] # export RSYNC_PASSWORD=123456 |
客户端推送backup目录下所有内容至Rsync
服务端
1 2 | [root@nfs01 ~] # export RSYNC_PASSWORD=123456 [root@nfs01 ~] # rsync -avz /backup/ rsync_backup@172.16.1.41::backup/ |
客户端拉取Rsync
服务端 backup模块数据至本地客户端的 /backup目录
1 2 | [root@nfs01 ~] # export RSYNC_PASSWORD=123456 [root@nfs01 ~] # rsync -avz rsync_backup@172.16.1.41::backup /backup/ |
Rsync
实现数据无差异同步
# 拉取远端数据:远端与本地保持一致,远端没有本地有会被删除, 造成客户端数据丢失
1 2 | [root@nfs01 ~] # export RSYNC_PASSWORD=123456 [root@nfs01 ~] # rsync -avz --delete rsync_backup@172.16.1.41::backup/ /backup/ |
1 2 | [root@nfs01 ~] # export RSYNC_PASSWORD=123456 [root@nfs01 ~] # rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup/ |
Rsync
的Limit限速
1 2 | [root@nfs01 ~] # export RSYNC_PASSWORD=123456 [root@nfs01 ~] # rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /backup/ |
Rsync备份案例
使用3台服务器主机名分别为web01、backup 、nfs
主机信息见下表:
角色 | 外网IP(WAN) | 内网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 |
客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进行推送至备份服务器 4.客户端每天凌晨1点定时执行该脚本 5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据 2.服务端需要每天校验客户端推送过来的数据是否完整 3.服务端需要每天校验的结果通知给管理员 4.服务端仅保留6个月的备份数据,其余的全部删除
注意:所有服务器的备份目录必须都为/backup
建议备份的数据内容如下:
# 1.开机自启动配置文件 设备挂载配置文件 本地内网配置文件 (系统配置文件)
/etc/rc.local /etc/fstab /etc/hosts
# 2.cron定时任务 firewalld防火墙 脚本目录 (重要目录)
/var/spool/cron/ /etc/firewalld /server/scripts
# 3.系统日志文件
/var/log/ /系统安全日志、sudo日志、内核日志、rsyslog日志
# 4.应用程序服务配置文件 nginx、PHP、mysql、redis.....
-
客户端备份实现思路,每天凌晨01点定时执行一次脚本(打包->标记->推送->保留最近7天的文件)
1 2 | [root@nfs scripts] # vim /server/scripts/client_rsync_backup.sh #!/usr/bin/bash |
1 2 3 4 5 6 | PATH= /usr/local/sbin : /usr/local/bin : /usr/sbin : /usr/bin : /root/bin Host=$( hostname ) Addr=$( ifconfig eth1| awk 'NR==2{print $2}' ) Date=$( date +%F) Dest=${Host}_${Addr}_${Date} Path= /backup |
1 | [ -d $Path/$Dest ] || mkdir -p $Path/$Dest |
1 2 3 | cd / && \ [ -f $Path/$Dest /system . tar .gz ] || tar czf $Path/$Dest /system . tar .gz etc /fstab etc /rsyncd .conf && \ [ -f $Path/$Dest /log . tar .gz ] || tar czf $Path/$Dest /log . tar .gz var /log/messages var /log/secure && \ |
1 | [ -f $Path/$Dest /flag ] || md5sum $Path/$Dest/*. tar .gz >$Path/$Dest /flag_ $Date |
1 2 | export RSYNC_PASSWORD=123456 rsync -avz $Path/ rsync_backup@172.16.1.41::backup |
1 | find $Path/ - type d -mtime +7 | xargs rm -rf |
-
客户端编写定时任务,让备份每天凌晨1点执行
1 | 00 01 * * * /bin/bash /server/scripts/client_rsync_backup .sh &> /dev/null |
-
服务端校验客户端推送数据的完整性, (校验->存储校验结果->将保存的结果通过邮件发送给管理员->保留最近180天的数据)
# 1.服务端配置邮件功能
1 2 3 4 5 6 7 8 9 | [root@backup /] # yum install mailx -y [root@backup /] # vim /etc/mail.rc # 文件最后添加 set from=2543843664@qq.com # 邮件来源(发件人) set smtp=smtps: //smtp .qq.com:465 # smtp服务器地址 set smtp-auth-user=2543843664@qq.com # 发件人邮箱帐号 set smtp-auth-password=xcvzpqgrjtmuecaa # smtp客户端授权密码,登录邮箱设置,并非邮箱密码! set smtp-auth=login # 需要登录认证 set ssl-verify=ignore # 忽略证书警告 set nss-config- dir = /etc/pki/nssdb/ # 证书所在目录 |
# 2.服务端校验、以及邮件通知脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@backup ~] # mkdir /server/scripts -p [root@backup ~] # vim /server/scripts/check_backup.sh #!/usr/bin/bash # 1.定义全局的变量 export PATH= /usr/local/sbin : /usr/local/bin : /usr/sbin : /usr/bin : /root/bin # 2.定义局部变量 Path= /backup Date=$( date +%F) # 3.查看flag文件,并对该文件进行校验, 然后将校验的结果保存至result_时间 find $Path/ - type f -name "flag_$Date" | xargs md5sum -c >$Path /result_ ${Date} # 4.将校验的结果发送邮件给管理员 mailx -s "Rsync Backup $Date" 2543843664@qq.com <$Path /result_ ${Date} # 5.删除超过7天的校验结果文件, 删除超过180天的备份数据文件 find $Path/ - type f -name "result*" -mtime +7| xargs rm -f find $Path/ - type d -mtime +180| xargs rm -rf |
-
服务端编写定时任务脚本
1 | 00 05 * * * /bin/bash /server/scripts/check_backup .sh &> /dev/null |
-
扩展多台客户端
对其他客户端重复1. 2. 步即可
rsync命令 1v4
a 本地备份数据 cp
[root@nfs01 backup]# cp /etc/hosts /tmp
[root@nfs01 backup]# ll /tmp/hosts
-rw-r--r-- 1 root root 371 May 6 16:11 /tmp/hosts
[root@nfs01 backup]# rsync /etc/hosts /tmp/host_rsync
[root@nfs01 backup]# ll /tmp/host_rsync
-rw-r--r-- 1 root root 371 May 6 16:12 /tmp/host_rsync
b 远程备份数据 scp
scp -rp /etc/hosts root@172.16.1.41:/backup
root@172.16.1.41's password:
hosts 100% 371 42.8KB/s 00:00
-r --- 递归复制传输数据
-p --- 保持文件属性信息不变
[root@nfs01 ~]# rsync -rp /etc/hosts 172.16.1.41:/backup/hosts_rsync
root@172.16.1.41's password:
rsync远程备份目录:
[root@nfs01 ~]# rsync -rp /oldboy 172.16.1.41:/backup --- 备份的目录后面没有 /
root@172.16.1.41's password:
[root@backup ~]# ll /backup
total 0
drwxr-xr-x 2 root root 48 May 6 16:22 oldboy
[root@backup ~]# tree /backup/
/backup/
└── oldboy
├── 01.txt
├── 02.txt
└── 03.txt
1 directory, 3 files[root@nfs01 ~]# rsync -rp /oldboy/ 172.16.1.41:/backup --- 备份的目录后面有 /root@172.16.1.41's password:[root@backup ~]# ll /backup
total 0
-rw-r--r-- 1 root root 0 May 6 16:24 01.txt
-rw-r--r-- 1 root root 0 May 6 16:24 02.txt
-rw-r--r-- 1 root root 0 May 6 16:24 03.txt
总结: 在使用rsync备份目录时:
备份目录后面有 / -- /oldboy/ : 只将目录下面的内容进行备份传输
备份目录后面没有/ -- /oldboy : 会将目录本身以及下面的内容进行传输备份
c 替代删除命令
rm命令
[root@nfs01 ~]# rsync -rp --delete /null/ 172.16.1.41:/backup
root@172.16.1.41's password:
--delete 实现无差异同步数据
面试题: 有一个存储数据信息的目录, 目录中数据存储了50G数据, 如何将目录中的数据快速删除
rm /目录/* -rf
d 替代查看文件命令 ls
[root@backup ~]# ls /etc/hosts
/etc/hosts
[root@backup ~]# rsync /etc/hosts
-rw-r--r-- 371 2019/05/06 11:55:22 hosts
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步