备份服务器完成rsync守护进程模式搭建
rsync服务端配置步骤
第一个历程:下载安装软件
检查rsync软件是否安装
rpm -qa|grep rsync
这个是3.1.2-4版本的,可以重新下载一下
yum install rsync -y
升级到了3.1.2-10版本
第二个历程:编写配置文件
配置文件如下/etc/rsyncd.conf
:
##created by HQ at 2020
###rsyncd.conf start##
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
配置文件参数解释
##created by HQ at 2020
###rsyncd.conf start##
uid = rsync # 指定管理备份目录的用户
gid = rsync # 指定管理备份目录的用户组
port = 873 # 定义rsync备份服务的网络端口号
#fake super = yes # 伪装超级管理员
use chroot = no # 和安全相关的配置
max connections = 200 # 最大连接数 同时只能有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 # 指定备份目录
第三个历程:创建rsync服务的虚拟用户
创建虚拟用户,作用是管理备份目录。
useradd rsync -M -s /sbin/nologin
第四个历程:创建备份服务认证密码文件
echo "rsync_backup:123456" > /etc/rsync.password
修改文件权限
第五个历程:创建备份文件目录
创建目录
mkdir /backup
目录创建好了之后,修改目录的属主和属组信息
chown rsync.rsync /backup/
第六个历程:启动备份服务
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
rsync守护进程语法
客户端做拉的操作: 恢复数据
Pull: rsync [OPTION…] [USER@]HOST::SRC… [DEST]
客户端做推的操作: 备份数据
Push: rsync [OPTION…] SRC… [USER@]HOST::DEST
src: 要推送备份数据信息
[USER@]: 指定认证用户信息(rsync_backup)
HOST: 指定远程主机的IP地址或者主机名称(172.16.1.41)
::DEST: 备份服务器的模块信息(backup)
客户端传输数据到备份服务器
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup
想要解决问题,只需要把rsync配置文件的#fake super = yes
注释去掉。
fake super = yes
伪装超级管理员,这样服务端中的rsync平民用户才能操作root管理的文件。
如图,报错已经没有了
rsync守护进程客户端免交互配置
第一个历程:创建一个密码文件并修改该文件权限
echo 123456 > /etc/rsync.password
chmod 600 /etc/rsync.password
第二个历程:进程免交互传输数据测试
rsync -avz /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
rsync备份传输数据原理
在客户端中是用root用户传输的,权限至高无上。
但是通过认证进入服务端中,root皇帝用户就转变成了平民用户rsync,当平民用户rsync要操作root用户管理的文件时就会报错。
rsync命令的常用参数
rsync命令参数选项及说明
参数选项 |
解释说明 |
-a |
归档参数,包含 rogpDl |
-v |
详细模式输出,传输时的进度等信息 |
-z |
压缩数据传输 |
-r |
递归复制传输数据 |
-t |
保持文件时间信息不变(修改时间) |
-o |
保持文件属主信息不变 |
-g |
保持文件属组信息不变 |
-p |
保持文件的权限信息不变 |
-D |
保持设备文件信息不变 |
-l |
保持链接文件属性不变 |
-L |
保持链接文件数据信息不变 |
-P |
显示同步的过程及传输时的进度等信息 |
-n |
测试选项,模拟执行 |
–delete |
使目标目录内容和源目录保持一致,删除不同的文件 |
–exclude=PATTERN |
排除指定数据不被传输 |
–exclude-from=file |
排除指定数据不被传输(批量排除) |
–bwlimit=RATE |
限制传输的速率 |
rsync服务企业应用
1.多模块功能配置
首先在配置文件中填写多个模块信息
然后创建模块信息中的目录,并且修改目录的属主和属组为rsync虚拟用户
最后在客户端上备份数据(比如你是开发人员,那么就填写dev模块信息)
rsync -avz /etc/hosts rsync_backup@192.168.0.41::dev --password-file=/etc/rsync.password
2.服务的排除功能
准备环境
要求1:将/test目录下面a目录数据全部备份,b目录不要备份1.txt文件,c目录不做备份
绝对路径方式:
rsync -avz /test --exclude=/test/b/1.txt --exclude=/test/c rsync_backup@192.168.0.41::backup --password-file=/etc/rsync.password
相对路径方式:
rsync -avz /test --exclude=b/1.txt --exclude=c/ rsync_backup@192.168.0.41::backup --password-file=/etc/rsync.password
要求2 将/test目录下面a目录数据全部备份,b目录不要备份1.txt文件,c目录不要备份1.txt和3.txt文件
首先编辑一个排除文件
然后实现批量排除功能
rsync -avz /test --exclude-from=/test/exclude.txt rsync_backup@192.168.0.41::backup --password-file=/etc/rsync.password
3.服务的备份目录创建
客户端可以在模块信息 后面跟上一个目录,然后将备份的文件放在该目录下,方便备份文件的管理
rsync -avz /etc/hosts rsync_backup@192.168.0.41::backup/192.168.0.31/ --password-file=/etc/rsync.password
注意:客户端无法再服务端创建多级目录
4.服务的安全策略
可以在配置文件中设置白名单和黑名单功能
建议只使用一种名单
5.服务的列表功能
服务端配置文件list默认为false,改为true开启列表功能并重启rsync服务
在客户端上输入如下命令,即可查看当前备份服务器上的所有模块名称
rsync rsync_backup@192.168.0.41::
客户端知道了模块名称,则可以在任意模块目录下备份数据,但是不安全(如果运维人员对开发人员不满意,然后获取到了开发人员的模块信息,然后使用无差异同步把开发人员的备份目录下的内容全部清空)。建议不要开启列表功能。
6.服务的无差异同步
在客户端上建议一个null目录
然后输入以下命令
rsync -avz /null/ --delete rsync_backup@192.168.0.41::dev --password-file=/etc/rsync.password
服务端查看备份文件
同步之前
同步之后
企业项目:全网备份项目
基本备份要求
已知3台服务器主机名分别为web01、backup、nfs01,主机信息见下表:
服务器说明 |
外网 |
内网 |
主机名称 |
Nginx web |
192.168.0.7 |
172.16.1.7 |
Web01 |
NFS存储服务器 |
192.168.0.31 |
172.16.1.31 |
Nfs01 |
Rsync备份服务器 |
192.168.0.41 |
172.16.1.41 |
Rsync01 |
要求每天晚上0点整在web服务器上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送备份服务器backup上备份保留(备份思路可以是先在本地按日期打包然后再推到备份服务器上),NFS存储服务器同web服务器,实际工作中就是全部的服务器
具体要求如下:
- 所有服务器的备份目录必须都为/backup
- 要备份的系统配置文件包括但不限于:
a. 定时任务服务的配置文件(/var/spool/cron/root)
b. 开机自启配置文件(/etc/rc.local)
c. 日常脚本的目录(/server/scripts)
d. 防火墙iptables的配置文件(/etc/sysconfig/iptables)
e. 自己思考下还有什么需要备份呢?
- web服务器站点目录假定为(/var/html/www)
- web服务器访问日志路径假定为(/app/logs)
- web服务器及nfs服务器保留打包后的7天备份数据即可(本地留存不能多于7天,因为太多磁盘会满)
- 备份服务器上,保留每周一的所有数据副本,其他要保留6个月的数据副本。
- 备份服务器上要按照备份数据服务器的内网IP为目录保存备份,备份的文件按照时间名字保存。
- 需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败的结果信息发给系统管理员邮箱中。
评分标准见表:
ID |
分数 |
项目 |
1 |
20分 |
完成服务端rsync服务搭建 |
2 |
10分 |
完成客户端rsync命令推送到服务端 |
3 |
20分 |
完成客户端本地打包及校验脚本 |
4 |
10分 |
完成客户端定时任务配置 |
5 |
15分 |
完成服务端数据完整性检查及清理脚本 |
6 |
10分 |
完成服务端定时执行脚本 |
7 |
15分 |
实现每日邮件发送结果给管理员 |
|
100分 |
|
解答过程
1.在客户端上创建目录
mkdir /backup
2.数据打包压缩备份
tar zcvf /backup/system_backup.tar.gz /var/spool/cron/root /etc/rc.local / /server/scripts /etc/sysconfig/iptables
打包完成后一定要解压看看是否无误,上面的打包命令如果不检查那么就会给自己埋下了一个坑。因为/etc/rc.local
是一个软连接(快捷方式),备份一个快捷方式一点用都没有!!!
因此要在tar
命令里增加一个选项h
,一定要写在参数f
前面,即zcvhf
tar zcvhf /backup/system_backup.tar.gz /var/spool/cron/root /etc/rc.local /server/scripts /etc/sysconfig/iptables
这时在解压查看,发现rc.local不是软链接了。
-h
:将链接文件所指向的原文件进行保存备份
此时已经解决了打包软链接的问题,但是还有一个小问题,就是每次打包的时候都会报错
tar: Removing leading '/' from member names
解决的办法是进入根目录下,然后采用相对路径的方式打包
tar zcvhf /backup/system_backup.tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables
3、4.打包站点目录和日志文件
5.要求保留7天之内的数据,言外之意是7天以前的删除掉。尴尬的是我们上面打包的时候并没有日期,因此会后一天的包会覆盖前一天的包,因此打包的时候要给包加个当天的日期
tar zcvhf /backup/system_backup_$(date +%F).tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables
这里为了测试,用date命令修改当前时间
今天是9月24号,用date命令修改日期,使其生成以下打包文件
最后修改的时间定格为 10月4号
然后用find的命令查找出7天以前的文件
find /backup -type f -mtime +7
最后把找到的文件要删除操作即可
find /backup -type f -mtime +7|xargs rm
6.服务端要部署好rsync服务,客户端把备份数据传输到服务端
rsync -avz /backup/ rsync_backup@192.168.0.41::backup/172.16.1.7 --password-file=/etc/rsync.password
备份服务器上查看
修改备份服务器上的时间,查找半年以前的数据删除,但是要保留所有周一的数据
如何保留周一的数据?
需要客户端打包数据的时候,把星期的信息也要写到文件名字上面
tar zcvhf /backup/system_backup_$(date +%F_week%w).tar.gz ./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables
然后传输到服务端
rsync -avz /backup/ rsync_backup@192.168.0.41::backup/172.16.1.7 --password-file=/etc/rsync.password
服务端上查看
找出180天以前的数据,但是除了周一的其他的数据删除
find /backup/ -type f -mtime +180 ! -name "*week1*"
7.备份服务器上要按照备份数据服务器的内网IP为目录保存备份,备份的文件按照时间名字保存
这个要求其实我们无意识的已经完成了
8.需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败的结果信息发给系统管理员邮箱中
如何验证数据的完整性???
md5sum 命令
知道了如何验证数据的完整性,那么在客户端上做完整的操作
首先找到7天以前的数据删除掉
然后找到1天之内的数据做MD5校验并写到指纹文件中,具体命令如下
find /backup/ -type f -mtime -1|xargs md5sum > /backup/finger.txt
最后数据连同指纹文件一起传输给服务端
rsync -avz /backup/ rsync_backup@192.168.0.41::backup/172.16.1.7/ --password-file=/etc/rsync.password
服务端接收到了数据
md5sum -c 指纹文件命令执行原理
第一个历程: 打开一个指纹文件,将信息记录到缓存中
第二个历程: 根据指纹文件的路径信息,生成md5数值信息
第三个历程: 将新生成md5数值和原有指纹文件中的数值进行比较
第四个历程: 如果相同显示结果为ok,如果不同显示failed
这时利用md5校验指纹文件,出现了一堆报错
原因是因为之前传输数据的时候,写的路径是rsync_backup@192.168.0.41::backup/172.16.1.7/
,只是在服务端/backup目录下创建了172.16.1.7的目录,而客户端/backup目录下并没有此目录。因此要在客户端/backup目录下创建172.16.1.7的目录,与服务端保持一致。
在客户端创建172.16.1.7目录,并重新生成指纹文件,因为路径已经变了。
find /backup/ -type f -mtime 1|xargs md5sum > /backup/172.16.1.7/finger.txt
最后在传输到服务端,此时模块信息后面就不要跟内网地址目录了!
rsync -avz /backup/ rsync_backup@192.168.0.41::backup --password-file=/etc/rsync.password
服务端查看接收到的数据
再次利用md5sum -c校验
比较坑的是指纹文件也做了验证并报错了,因此客户端查找数据的时候要排除指纹文件!
最终版
客户端
find /backup/ -type f -mtime -1 ! -name "finger*"|xargs md5sum > /backup/172.16.1.7/finger.txt
这时指纹文件的内容只有要校验的数据了
传输过去
rsync -avz /backup/ rsync_backup@192.168.0.41::backup --password-file=/etc/rsync.password
服务端
数据及指纹文件已经传过来了
md5校验,终于成功!
最后一步发送邮箱
本地虚拟机发送
1.编辑vim /etc/mail.rc
set from=yan1240557686@163.com
set smtp=smtps://smtp.163.com
set smtp-auth-user=yan1240557686@163.com
set smtp-auth-password=VUPCPAFJJTJQDIDA
set smtp-auth=login
2.重启服务
systemctl restart postfix.service
3.测试
echo "邮件发送测试"|mail -s "邮件测试" 33315862@qq.com
阿里云服务器发送
因为阿里云服务器默认禁止了25端口,因此采用465端口发送
1.创建数字证书
mkdir -p /root/.certs/ ###创建目录,用来存放证书
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/163.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt ###添加一个ssl证书到证书数据库中
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt ###添加一个Global证书到证书数据库中
certutil -L -d /root/.certs ###列出目录下的数字证书
2.配置发件人vim /etc/mail.rc
set from=yan1240557686@163.com
set smtp=smtps://smtp.163.com:465
set smtp-auth-user=yan1240557686@163.com
set smtp-auth-password=VUPCPAFJJTJQDIDA
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/root/.certs
3.重启服务
systemctl restart postfix.service
4.测试
echo "邮件发送测试"|mail -s "邮件测试" 33315862@qq.com
接收到邮箱但是报错
Error in certificate: Peer’s certificate issuer is not recognized.
5.解决证书不被信任问题
cd /root/.certs/
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt
今天0点0分备份的是前一天的数据
rsync常见错误
1、ERROR: chroot failed
ERROR: chroot failed rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
原因:服务器端的目录不存在或无权限。
解决办法:创建目录并修正权限可解决问题。
2、skipping non-regular file
receiving incremental file list
skipping non-regular file “vendor/bin/doctrine”
skipping non-regular file “vendor/bin/doctrine.php”
sent 1990 bytes received 489209 bytes 327466.00 bytes/sec total size is 182515746 speedup is 371.57
原因:source源文件有软链接。
解决方法:修改为 rsync -va,其中 -a == -rlptgoD (no -H,-A,-X) 或者 rsync -rvltOD 也可以。
解决后:
receiving incremental file list
vendor/bin/doctrine -> …/doctrine/orm/bin/doctrine
vendor/bin/doctrine.php -> …/doctrine/orm/bin/doctrine.php
sent 1998 bytes received 489279 bytes 327518.00 bytes/sec total size is 182515746 speedup is 371.51
3、ERROR: module is read only
sending incremental file list
ERROR: module is read only
rsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [sender=3.0.6]
原因:source源服务器端权限设置read为only只读权限。
解决方法:read only = false
4、ERROR: auth failed on module tee
ERROR: auth failed on module tee rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]
原因:服务器端该模块(tee)需要验证用户名密码,但客户端未提供正确的用户名密码,认证失败。
解决方法:提供正确的用户名密码解决此问题。
5、ERROR: Unknown module ‘tee_nonexists’
ERROR: Unknown module ‘tee_nonexists’ rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.6]
原因:服务器不存在指定模块。
解决方法:提供正确的模块名或在服务器端修改成你要的模块以解决问题。
6、password file must not be other-accessible
password file must not be other-accessible
continuing without password file
Password:
原因:这是因为rsyncd.pwd rsyncd.secrets的权限不对,应该设置为600。
解决方法:chmod 600 rsyncd.pwd
7、rsync: failed to connect No route to host
rsync: failed to connect to 192.168.1.10: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=3.0.6]
原因:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。
解决方法:在iptables 中开放该端口,语句如下:
iptables -I INPUT -p tcp –dport 873 -j ACCEPT
rsync默认端口873,其实就是把tcp udp的873端口打开。
8、rsync error: error starting client-server protocol
rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.6]
原因:/etc/rsyncd.conf配置文件内容有错误。请正确核对配置文件。
9、rsync: chown “” failed: Invalid argument (22)
rsync: chown “” failed: Invalid argument (22)
原因:权限无法复制。去掉同步权限的参数即可。(这种情况多见于Linux向Windows的时候)
10、问题 @ERROR: daemon security issue — contact admin
@ERROR: daemon security issue — contact admin rsync error: error starting client-server protocol (code 5) at main.c(1530) [sender=3.0.6]
原因:同步的目录里面有权限不足的软连接文件,需要服务器端的/etc/rsyncd.conf打开use chroot = yes。
11、 rsync: read error: Connection reset by peer (104)
rsync: read error: Connection reset by peer (104) rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receiver=3.0.6]
解决:很大可能是服务器端没有开启 rsync 服务,开启服务。
12、ERROR: failed to open lock file
@ERROR: failed to open lock file rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.6]
解决:配置文件 rsync.conf 中添加 lock file = rsyncd.lock 即可解决。
全网备份脚本
客户端编写脚本(以web服务器为例 刚开始的方法备份)
mkdir /backup/172.16.1.7 -p
cd /
tar zcvhf /backup/172.16.1.7/system_backup_$(date +%F_weed%w).tar.gz ./etc/hosts
find /backup/ -type f -mtime +7|xargs rm
find /backup/ -type f -mtime -1 ! -name “finger*” > /backup/172.16.1.7/finger.txt
rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
编写脚本
#/bin/bash
Backup_path="/backup"
Inner_ip=$(hostname -i)
mkdir $Backup_path/$Inner_ip -p
cd /
tar zchf $Backup_path/$Inner_ip/system_backup_$(date +%F_weed%w).tar.gz ./etc/hosts
find $Backup_path/ -type f -mtime +7|xargs rm 2>/dev/null
find $Backup_path/ -type f -mtime -1 ! -name "finger*"|xargs md5sum > $Backup_path/$Inner_ip/finger.txt
rsync -az $Backup_path/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
~
服务端脚本
#/bin/bash
find /backup/ -type f -mtime +180 ! -name "*week1.tar.gz"|xargs rm 2>/dev/null
find /backup/ -type f -name "finger*"|xargs md5sum -c > /tmp/check.txt
mail -s "check info" 33315862@qq.com </tmp/check.txt
最后把脚本添加到定时任务即可
客户端定时任务
0 0 * * * /bin/sh /server/scripts/backup.sh &>/dev/null
服务端定时任务
0 5 * * * /bin/sh /server/scripts/backup_server.sh &>/dev/null
以上就完成了全网备份项目。其实看下来,还是很简单的。细心一点并不难。
在最后的最后,思考还有地方需要完善?