案例实践:
客户端:
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/主机名_IP_时间
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/主机名_IP_时间
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行脚本
5.客户端服务器本地保留最近7的数据,避免浪费磁盘空间
服务端:
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客服端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除
客户端:
1.推送备份文件的SHELL脚本:
vim /shell/client_push.sh
SHELL脚本:
#!/bin/bash #1.定义变量 export RSYNC_PASSWORD="123456" #配置rsync虚拟用户的匹配密码 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin #定义环境变量 SRC=/backup #备份文件的目录 HOST=$(hostname) ADDR=$(ifconfig eth0|awk -F " " 'NR==2 {print $2}') #取本经IP DATE=$(date +%F) #时间 DEST=${HOST}_${ADDR}_${DATE} #拼接目录名称:主机名_IP_时间 #2.创建目录 [ -d $SRC/$DEST ] || mkdir -pv $SRC/$DEST #创建备份数据存储的目录 #3.备份文件 #cd到根目录 cd / && \ #打包备份的文件 [ -f $SRC/$DEST/sys.tar.gz ] || tar czf $SRC/$DEST/sys.tar.gz etc/fstab etc/passwd && \ [ -f $SRC/$DEST/other.tar.gz ] || tar czf $SRC/$DEST/other.tar.gz var/spool/cron shell && \ #打标记:服务端后面做校验用(先打包) [ -f SRC/$DEST/flag_${DATE} ] || md5sum $SRC/$DEST/*.tar.gz >$SRC/$DEST/flag_${DATE} #4.rysnc推送到备份服务器上(注意要限速) /usr/bin/rsync -avz --bwlimit=1 $SRC//$DEST [email protected]::backup #5.删除7天前的目录 find $SRC -type d -mtime +7 |xargs rm -rf
2.配置定时任务
crontab -e 10 01 * * * /usr/bin/bash /shell/client_push.sh >&/dev/null
服务端:
1.安装rysnc
yum install rsync -y
2.配置rysnc进程守护:
vim /etc/rsyncd.conf
uid = rsync #定义使用rsync的虚拟用户 gid = rsync #定义使用rsync的虚拟组 port = 873 #定义监控端口 ake super = yes #无需让rsync以root身份运行,不改变文件属性,伪装成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 #备份存储的目录
3.按配置文件进行部署: 创建rsync的虚拟用户
useradd -M -s /sbin/nologin rsync
创建密码文件,并赋权
echo "rsync_backup:123456" >/etc/rsync.passwd chmod 600 /etc/rsync.passwd
创建存储备份数据的目录,并赋权
mkdir /backup chown -R rsync.rsync /backup/
4.启动rsync服务
systemctl start rsyncd.service #启动rsync服务 systemctl enable rsyncd.service #将rsync设定为开机自启动 systemctl status rsyncd.service #查看服务运行状态 systemctl disable rsyncd.service #不开机自启动 lsof -i:873;netstat -lntp|grep 873
5.服务端SHELL脚本:
vim /shell/check_client_push.sh
#!/bin/bash #1.定义变量 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin SRC=/backup DATE=$(date +%F) #2.校验备份文件的完整性 md5sum -c $SRC/*_$DATE/flag_$DATE >$SRC/result_$DATE #3.发送邮件到管理员 mail -s "${DATE}备份校验" **********@qq.com </backup/result_$DATE #4.备份保留180天 find $SRC -type d -mtime +180 |xargs rm -rf
6.安装邮件服务
yum install mailx -y
7.配置邮箱服务:
vim /etc/mail.rc
set from=**********@qq.com set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=********@qq.com set smtp-auth-password=*********#授权密码 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/8.编写服务端定时任务:
crontab -e 30 01 * * * /bin/bash /shell/check_client_push.sh >&/dev/null
rsync:参数
-a #归档模式,等价于 -rlptgoD
-v #输出详细信息,显示同步的文件名和目录名,
-z #传输时进行压缩
-r #递归地复制目录及其所有内容
-t #保持文件时间信息,仅更新目录时间戳和文件修改时间
-o #保持文件属主信息,维持文件属主为目标主机上文件属主的用户
-p #保持文件权限,指定归档模式下嵌入文件权限
-g #维持文件属主为目标主机上文件属主的群组
--delete #删除目标文件夹中那些源文件夹中不存在的文件
--bwlimit=KBPS #限制带宽,单位为千字节/秒
--exclude=PATTERN #排除某些不需要的文件或目录,可以指定通配符进行模式匹配
--exclude-form=file #文件名所在的目录文件
--partial #断点传输
常见错误:
1、@ERRPR:chdir failed
错误原因:
服务器端没有提供访问的目录 /backup
处理方法:
需要在服务器端创建,并赋予权限rsync管理权限
mkdir /backup
chown -R rsync.rsync /backup/
2.@ERROR: auth failed on module backup
服务端/etc/rsync.password 配置文件是否有问题
错误原因:
1)客户端密码文件的权限不是600
2)服务端密码文件不是600
3)服务端密码文件不存在(名字写错了/没有创建/配置文件参数写错了)
4)服务端密码文件里保存的用户名和密码不正确
3.@ERROR:invalid uid rsync
useradd rsync -s /sbin/nologin -M
4.@ERROR: chroot failed
rsyncerror: error starting client-server protocol (code 5) at main.c(1522)[receiver=3.0.3]
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。
mkdir /backup
chown -R rsync.rsync /backup/
5.@ERROR: auth failed on module tee
rsync error: error starting client-serverprotocol (code 5) at main.c(1522) [receiver=3.0.3]
服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。
提供正确的用户名密码解决此问题。
6.rsync: --passwork-file=/etc/rsync.password: unknown option
rsync: --passwork-file=/etc/rsync.password:unknown option
rsync error: syntax or usage error (code 1)at main.c(1422) [client=3.0.6]
错误原因:
/etc/rsync.passwd文件名称写错
解决方法:
更正/etc/rsync.passwd文件名称
7.rsync: write failed on "/backup/ ": No space lefton device (28)
rsync:write failed on "/backup/": No space left on device(28)
rsyncerror: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync:connection unexpectedly closed (2721 bytes received so far) [generator]
rsyncerror: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
问题原因:
磁盘空间不够,所以无法操作。
解决方法:
可以通过df /home/backup2010 来查看可用空间和已用空间
8.rsync: failed to connect to 10.0.0.41: Connection timed out(110)
rsync:failed to connect to 10.0.0.41: Connection timed out (110)
rsyncerror: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
检查服务器的端口netstat ?tunlp,远程telnet测试。
可能因为客户端或者服务端的防火墙开启 导致无法通信,可以设置规则放行 rsync(873端口) 或者直接关闭防火墙。
关服务端selinux 和iptabs 防火墙
systemctl stop firewalld.service
systemctl disable firewalld
setenforce 0 #临时关闭selinux
sed -i.back 's#SELINUX=enforcing#SELINUX=disable#g' /etc/selinux/config #永久关闭selinux
9.rsync: mkstemp ".passwd.8mPoUx" (in backup) failed: Permission denied (13)
sent 644 bytes received 122 bytes 306.40 bytes/sec
total size is 1,332 speedup is 1.74
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
setenforce 0 #临时关闭selinux
sed -i.back 's#SELINUX=enforcing#SELINUX=disable#g' /etc/selinux/config #永久关闭selinux
10. @ERROR: module is read only
sendingincremental file list
ERROR:module is read only
rsyncerror: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]
rsync:read error: Connection reset by peer (104)
rsyncerror: error in rsync protocol data stream (code 12) at io.c(759)[sender=3.0.6]
原因:
服务器端权限设置read为only只读权限。
解决方法:
read only = false
11. @ERROR: failed to openlock 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 即可解决
12. password file must not be other-accessible
passwordfile must not be other-accessible
passwordfile must not be other-accessible
continuingwithout password file
Password:
原因:
这是因为rsync.passwd的权限不对,应该设置为600。
解决方法:
chmod 600 rsync.passwd