3、综合架构详解-备份服务
1 rsync服务
1.1 作用
依靠rsync服务
1)进行数据备份
2)进行日志统一保存
可实现全量及增量的本地或远程数据同步备份,本地和对端都需要安装rsync
1.2 命令用法
rsync 可以替代4个命令cp、scp、rm、ls
1.本地备份
Local: rsync [OPTION...] SRC... [DEST]
2.远程备份
Access via remote shell:
拉取数据 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推送数据 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
3.守护进程方式
1)可以进行一些配置管理
2)可以进行安全策略管理
3)可以实现自动传输备份数据
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
4.常用参数:
`-r` 递归拷贝
`-p` 保留文件属性
`--delete` 删除目标文件夹内多余的文件
rsync在使用-r参数拷贝目录时:
1)目录后面带/,会忽略目录本身,直接拷贝目录下的文件
2)目录后面不带/,会连同目录本身一同拷贝
1.2.1 替代cp
rsync 源文件 目标文件
# 拷贝test目录下的所有文件,不包括test目录本身
rsync -rp test/ /tmp/
1.2.2 替代scp
rsync 源文件 [用户@]IP地址:/目标文件
# 拷贝/etc/yum.repos.d目录下的所有文件,包括yum.repos.d目录本身
rsync -rp /etc/yum.repos.d root@10.0.0.1:/tmp/
1.2.3 替代rm,可用于快速清除目录
需要事先准备一个空目录
rsync -rp --delete 空目录 [用户@][IP地址:/]目标目录
null 是一个空目录,清空test目录
rsync -rp --delete null/ test/
1.2.4 替代ls
rsync 文件/目录 相当于ls -al的效果
[root@node1 ~]$ rsync ~/
dr-xr-x--- 4,096 2020/12/12 21:24:47 .
-rw------- 169 2020/12/12 17:24:45 .Xauthority
-rw------- 23,264 2020/12/12 16:29:54 .bash_history
-rw-r--r-- 18 2013/12/29 10:26:31 .bash_logout
-rw-r--r-- 176 2013/12/29 10:26:31 .bash_profile
-rw-r--r-- 176 2013/12/29 10:26:31 .bashrc
-rw-r--r-- 100 2013/12/29 10:26:31 .cshrc
-rw------- 67 2020/12/05 21:28:41 .lesshst
-rw------- 24,420 2020/12/03 21:07:34 .mysql_history
-rw-r--r-- 129 2013/12/29 10:26:31 .tcshrc
-rw------- 5,651 2020/12/12 15:43:30 .viminfo
-rw-r--r-- 1,398 2020/08/30 13:59:51 anaconda-ks.cfg
-rw-r--r-- 7,990,576 2020/11/11 15:45:54 percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
drwxr-xr-x 114 2020/11/07 19:04:37 .cache
drwxr-xr-x 75 2020/10/01 19:59:54 .config
drwx------ 25 2020/10/01 19:54:30 .dbus
drwxr-xr-x 17 2020/10/26 10:50:25 .ipa
drwxr-xr-x 19 2020/10/01 19:59:54 .local
drwx------ 66 2020/11/07 19:04:38 .mozilla
drwxr----- 19 2020/10/01 20:14:09 .pki
drwx------ 80 2020/10/01 18:56:07 .ssh
drwxr-xr-x 57 2020/10/09 12:50:20 .targetcli
drwxr-xr-x 6 2020/12/12 21:24:47 null
drwxr-xr-x 6 2020/12/12 21:25:07 test
1.3 rsync守护进程模式---服务端
1.3.1 服务端创建流程
1.3.1.1 服务端配置文件
/etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = "backup dir "
path = /backup
参数解释:
uid = rsync 管理守护进程及备份目录的用户
gid = rsync 管理守护进程及备份目录的用户组
port = 873 rsync服务的端口号,默认873
fake super = yes 将rsync用户伪装成一个超级管理员
use chroot = no 和安全相关的配置
max connections = 200 最大连接数
timeout = 300 超时时间
pid file = /var/run/rsyncd.pid 记录进程号码信息:1.让程序快速停止服务 2.判断一个服务是否在运行
lock file = /var/run/rsync.lock 锁文件
log file = /var/log/rsyncd.log rsync服务的日志文件
ignore errors 忽略传输中的简单错误
read only = false 指定备份目录可读可写
list = false 客户端是否可以查看服务端的模块信息
hosts allow = 172.16.1.0/24 允许传输备份数据的主机(白名单)
hosts deny = 0.0.0.0/32 禁止传输备份数据的主机(黑名单)
auth users = rsync_backup 指定认证用户
secrets file = /etc/rsync.password 指定认证用户密码文件
[backup] 模块信息
comment = "backup dir " 模块描述
path = /backup 指定备份目录
1.3.1.2 创建rsync服务虚拟用户
useradd rsync -M -s /sbin/nologin
1.3.1.3 创建认证用户密码文件
/etc/rsync.password,格式为用户名:密码
echo "rsync_backup:123456" > /etc/rsync.password
chmod 600 /etc/rsync.password
1.3.1.4 创建备份目录
mkdir /backup
chown rsync.rsync /backup
1.3.1.5 启动服务
systemctl restart rsyncd
systemctl enable rsyncd
1.3.2 服务端多模块
在/etc/rsyncd.conf配置多个备份模块,每个模块对应不同的备份目录
...
[backup]
comment = "backup dir "
path = /backup
[dba]
comment = "backup dir for dba"
path = /dba
[develop]
comment = "backup dir for develop"
path = /develop
1.3.3 白名单、黑名单
先匹配白名单、再匹配黑名单、最后匹配默认策略
如果不配置黑名单,默认是deny
如果不配置白名单,默认是accept
同时配置黑白名单,默认是accept
1.4 rsync守护进程模式---客户端
1.4.1 创建客户端密码文件
格式为密码
echo "123456" > /etc/rsync.password
chmod 600 /etc/rsync.password
1.4.2 客户端命令
Access via rsync daemon:
客户端做拉的操作:恢复数据
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
客户端做推的操作:备份数据
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
# SRC:要推送备份的数据
# [USER@]:指定认证用户
# HOST:远程主机IP地址
# ::DEST:备份服务器的模块
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
常用参数:
-v --verbose 显示详细传输信息
-a --archive 归档参数,包含:rtopgDl
-r --recurisive 递归
-t --times 保持文件属性信息时间信息不变
-o --owner 保持文件属主信息不变
-g --group 保持文件属组信息不变
#让-o和-g参数生效,需要将服务端配置文件uid和gid改成root,同时注释fake super参数
-p --perms 保持文件权限信息不变
-D --device 保持设备文件信息不变
-l --links 保持软链接文件属性不变,拷贝软链接文件本身
-L 保持软链接文件数据信息不变,拷贝软链接指向文件的实际数据
-P 显示数据传输进度
--exclude=PATTERN 排除指定数据
--exclude-from=file 排除指定数据(批量)
--bwlimit=RATE 限制传输带宽
--delete 无差异传输,保持目标与源目录内文件一致
-z --compress 传输时压缩数据
--password-file= 客户侧密码文件
1.4.2.1 备份时生成1级子目录
rsync [OPTION...] SRC... [USER@]HOST::DEST/子目录/,只能创建1级子目录,无法创建多级目录
在向备份服务器备份时,生成一级本机ip地址10.0.0.31子目录
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup/10.0.0.31/ --password-file=/etc/rsync.password
1.4.2.2 排除
--exclude= 使用相对路径或绝对路径排除一个文件或文件夹,要批量排除要写多个--exclude=选项
--exclude-from=通过读入文件,批量排除。文件中每行以相对路径或绝对路径的方式写入要排除的文件或目录
1.4.2.3 查看服务端的模块列表
当服务端配置list = true时,用rsync [USER@]HOST::可以查看服务端全部模块
rsync rsync_backup@172.16.1.0::
1.4.2.4 例子
1)使用密码文件备份
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
2)备份/tmp目录,排除目录下的f1.txt文件(相对路径)和f2.dir(绝对路径)目录
rsync -avz /etc/tmp --exclude=f1.txt --exclude=/tmp/f2.dir/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
3)备份/tmp目录,使用文件进行批量排除目录下f2.dir/f3.txt文件
vim /tmp/exclude.txt
exclude.txt
f2.dir/f3.txt
rsync -avz /tmp --exclude-from=/tmp/exclude.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
2 备份项目
2.1 需求
| 服务器说明 | 外网IP | 内网IP | 名称 |
|---|---|---|---|
| nginx web服务器 | 10.0.0.7 | 172.16.1.7 | web01 |
| nfs 存储服务器 | 10.0.0.31 | 172.16.1.31 | nfs01 |
| rsync 备份服务器 | 10.0.0.41 | 172.16.1.41 | backup |
要求:每天晚上0点整在web服务器上打包系统配置文件、网站程序目录及访问日志并通过rsync推送备份服务器backup上备份保存(先本地按日期打包,再推送到备份服务器上),NFS存储服务器同web服务器。
具体要求如下:
1)所有服务器的备份目录都为/backup
2)要备份的系统文件包括但不限于:
a.定时任务服务的配置文件(/var/spool/cron/root)(适合web和nfs服务器)
b.开机自动启动配置文件(/etc/rc.local)(适合web和nfs服务器)
c.日常脚本的目录(/server/scripts)
d.防火墙iptables的配置文件(/etc/sysconfig/iptables-config)
3)web服务器的站点目录假定为/var/html/www
4)web服务器app访问日志路径假定为/app/logs
5)web服务器保留打包后的7天的备份数据即可(本地保留不能多于7天,太多会占硬盘空间)
6)备份服务器上,保留每周一的所有副本数据,其他要保留6个月的数据副本
7)备份服务器上,要按照备份数据服务器的内网IP作为目录保存备份,备份的文件按照时间名称保存
8)需要确保备份的数据尽量完整正确,在备份服务器上对备份数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中
2.2 完成步骤
1)web服务器
#准备一些不存在的目录
mkdir -p /server/scripts
mkdir -p /var/html/www
mkdir -p /app/logs
#准备rsync 密码文件
echo "123456" > /etc/rsync.password
chmod 600 /etc/rsync.password
#!/bin/bash
#backup env
Backup_dir="/backup"
localaddr=`hostname -I | awk '{print $1}'`
#create backup dir
mkdir -p $Backup_dir/$localaddr
#tar backup data
tar -zchf $Backup_dir/$localaddr/system_backup_`date -d -1day +%F_%A`.tar.gz /var/spool/cron/root /etc/rc.local /server/scripts /etc/sysconfig/iptables-config &> /dev/null
tar -zchf $Backup_dir/$localaddr/www_backup_`date -d -1day +%F_%A`.tar.gz /var/html/www &> /dev/null
tar -zchf $Backup_dir/$localaddr/app_backup_`date -d -1day +%F_%A`.tar.gz /app/logs &> /dev/null
#del 7 days ago data
find $Backup_dir/$localaddr/ -type f -mtime +7 -exec rm -rf {} \;
#create md5 finger file
find $Backup_dir/ -type f ! -name "finger.txt" -mtime -1 -exec md5sum {} \; > $Backup_dir/$localaddr/finger.txt
#push backup data
rsync -az $Backup_dir/$localaddr rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
2)nfs服务器
#准备一些不存在的目录
mkdir -p /server/scripts
#准备rsync 密码文件
echo "123456" > /etc/rsync.password
chmod 600 /etc/rsync.password
#!/bin/bash
#backup env
Backup_dir="/backup"
localaddr=`hostname -I | awk '{print $1}'`
#create backup dir
mkdir -p $Backup_dir/$localaddr
#tar backup data
tar -zchf $Backup_dir/$localaddr/system_backup_`date -d -1day +%F_%A`.tar.gz /var/spool/cron/root /etc/rc.local /server/scripts /etc/sysconfig/iptables-config &> /dev/null
#del 7 days ago data
find $Backup_dir/$localaddr/ -type f -mtime +7 -exec rm -rf {} \;
#create md5 finger file
find $Backup_dir/ -type f ! -name "finger.txt" -mtime -1 -exec md5sum {} \; > $Backup_dir/$localaddr/finger.txt
#push backup data
rsync -az $Backup_dir/$localaddr rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
3)备份服务端配置
#!/bin/bash
#backup env
Backup_dir="/backup"
#del 6 months ago data and keep Monday data
find $Backup_dir -type f -mtime +180 ! -name "*Monday.tar.gz" | xargs rm 2> /dev/null
#check backup data and create result
find $Backup_dir/ -type f -name "finger.txt" | xargs md5sum -c > /tmp/result.txt
#send mail
mail -s "backup check for `date -d -1day +%F`" 18204317839@139.com < /tmp/result.txt