备份服务-rsyncd

107 阅读5分钟

应用场景

  • 作为命令使用: 临时拉取,推送数据, scp命令
  • 定时备份: rsync服务+定时任务
  • 实时同步: rsync_sersync/lsyncd
  • rsync服务于异地容灾

选项

rsync选项含义
-a-rlptgoD-r递归复制-l复制软连接-p保持权限不变-m保持修改时间不变-o所有者不变-g用户组不变-D devices specials 设备与特殊文件
-v显示过程
-z传输数据的时候进行 压缩 (公网),与限速选项冲突(极限情况下需要考虑加上-z选项)
-P显示每rsync -av . root@10.0.0.31:/tmp/ exclude=04 rsync -av . root@10.0.0.31:/mnt exclude={04,05}个文件传输过程 (进度条) 断点续传 partial progress
--bwlimit限速,注意不要与-z一起使用.
--exclude--exclude-from排除
--delete保持客户端与服务端数据一致(高度保持2者一致,一般用于实时同步,其他场景慎用)

Rsync使用模式

本地模式: 不推荐使用

rsync -a /etc/   /tmp/
rsync -a /etc   /opt/

在rsync中对于目录 /etc/ 和 /etc是有区别的

/etc /etc目录+目录内容

/etc/ /etc/目录下面的内容

远程模式: 数据传输,临时使用scp代替

rsync -a目标
推送/etc/hostsroot@10.0.0.31:/tmp/
拉取root@10.0.0.31:/ect/hosts/tmp/
#推送/etc/hosts 到10.0.0.31的/tmp/目录
rsync -a /etc/hosts   root@10.0.0.31:/tmp/

#推送/etc目录及目录内容到31的 /tmp下面
#推送第1次 全量
rsync -av /etc   root@10.0.0.31:/tmp/
#推送第2次 发现没有推送
rsync -av /etc   root@10.0.0.31:/tmp/
#创建文件再次推送
touch /etc/test.txt
rsync -av /etc   root@10.0.0.31:/tmp/

#通过scp推送 /etc 目录及目录内容 到31的 /opt下面
scp -r /etc/ root@10.0.0.31:/opt/
-r 递归传输

rsync守护进程rsyncd

准备环境

角色主机名ip
rsync服务端backup10.0.0.41/172.16.1.41
rsync客户端nfs0110.0.0.31/172.16.1.31

服务端使用流程

  1. 部署
  2. 配置 /etc/rsyncd.conf
  3. 准备环境(用户,目录,目录权限,服务端密码文件,共享目录)
  4. 启动与检查(端口,进程)测试(传输)

安装

检查安装 更新
yum install -y rsync

检查软件包内容
/etc/rsyncd.conf  #配置文件
/usr/bin/rsync    #命令
/usr/lib/systemd/system/rsyncd.service #systemctl对应的配置文件

配置

# cat /etc/rsyncd.conf

##rsyncd.conf start##
fake super =yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
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 = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[data]
comment = 注释内容
path = /data

后续配置

#1.添加虚拟用户
useradd  -s /sbin/nologin -M   rsync

#2.创建密码文件
密码文件格式:   用户名:密码
echo 'rsync_backup:123' >/etc/rsync.password
chmod 600 /etc/rsync.password

#3.共享目录与权限
mkdir /data/
chown rsync.rsync /data/

启动服务

#启动服务
systemctl enable rsyncd
systemctl start rsyncd

#检查进程
ps -ef |grep rsync
#检查端口
ss -lntup |grep rsync

backup服务端本地测试

[root@backup ~]# rsync -avz /etc/hostname  rsync_backup@10.0.0.41data
Password:
sending incremental file list
hostname

sent 102 bytes received 43 bytes  41.43 bytes/sec
total size is 7 speedup is 0.05
[root@backup ~]# ll /data/
total 4
-rw-rr 1 rsync rsync 7 Aug 16 16:02 hostname

访问测试(客户端)

[root@nfs01 ~]# rsync -avz   /etc/host srsync_backup@172.16.1.41data
Password:
sending incremental file list
hosts

sent 214 bytes received 43 bytes  73.43 bytes/sec
total size is 329 speedup is 1.28

# rsync_backup是服务端配置文件中的认证用户.
# data表示模块名字

免密码传输数据到服务端

image.png

其他

访问控制-安全措施
  • hosts allow 只准许指定的ip或网段访问.
  • hosts deny 拒绝.
配置只准许172.16.1.0/24 网段访问

备份服务项目案例

项目实施步骤(概述)

备份项目的步骤流程
1.备份所有机器,定时备份,备份数据放在备份服务器
2.线准备rsync服务端,测试rsync客户端专门备份模块backup 目录/backup/
3. rsync客户端书写备份脚本.1. 打包备份/etc/ /var/spool/cron/ 2个目录,年-月-日_周几 2. 存放在/backup/172.16.1.xxx/ 3. 备份发送到rsync服务端 4. 删除本地旧的备份(7,30),写入定时 增加校验功能
4. rsync服务端书写 检查脚本1. 检查每天的备份结果,mail命令发送即可. 2. 删除旧的备份180天之前的,保留每周一的备份(360天). .每个月第1号(保留720天) 3.每年6月1日数据永久保留不删除.

项目ip地址规划

角色主机名ip地址公网ip内网
rsync服务端backup10.0.0.41172.16.1.41
rsync客户端nfs0110.0.0.31172.16.1.31
rsync客户端web0110.0.0.7172.16.1.7

rsync服务端与客户端

服务端主要步骤修改配置文件.

添加个backup 对应的目录/backup/
#####################################
[backup]
comment = this is a comment
path = /backup

重启服务

systemctl restart rsyncd.service

客户端测试

rsync  -avz /etc/hosts   rsync_backup@backup::backup --password-file=/etc/rsync.clent

rsync  -avz /etc/hosts   rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.clent

rsync客户端上的备份脚本

rsync服务端调试

mailx 配置/etc/mail.rc
yum install -y mailx postfix
启动postfix服务,开机自启动

服务端脚本内容要求

  • 检查每天的备份结果,mail命令发送即可.
  • 检查md5sum结果(一共,成功,失败) md5sum -c xxx.md5
  • 简单tree+mail
  • 复杂:统计备份大小,数量,然后通过echo/cat +mail邮件
  • 删除旧的备份180天之前的,保留每周一的备份(360天).
  • 扩展:每个月第1号(保留720天)
  • 扩展:每年6月1日数据永久保留不删除.
find /backup/ -type f -name "*.tar.gz"   !   -name "*_1.tar.gz" -mtime +180 |xargs rm -f

-name "*.tar.gz" 找出周1到周日的备份.
! -name "*_1.tar.gz" 排除周一的备份.剩下的备份就是周二到周日

发送邮件

tree /backup/   |mailx xxxx

脚本

#!bin/bash
##############################################################
# File Name:/server/scripts/bak_server_check.sh
# Version:V1.0
# Author: ly
# Organization:liiyoon.com
# Desc:
# 1.备份服务器,备份检查脚本
# 2.检查结果发送邮件
# 3.清理旧的备份
##############################################################
#1.vars
check_result=/backup/result.txt
date_str=`date +%F+%w`


# 2.log
function log(){
  script_name=`basename $0`
  log_file=/var/log/${script_name}.log
  level=$1
  msg=$2
  time=`date +%F_%w_%T`
  echo "${time} [${level}] ${msg}" >>$log_file
}

#3.md5sum检查
md5sum -c /backup/*/md5.txt >$check_result
if [ $? -eq 0 ];then
    log NOTICE "md5检查成功"
else
    log NOTICE "md5检查失败"
    exit 1
fi

#4.统计备份大小
du -sh /backup/* >>$check_result
bak_cnt=`find /backup/ -type f -name "*.tar.gz"|wc -l`
bak_today_cnt=`find /backup/ -type f -name "*${date_str}*.tar.gz"|wc -l`
echo "备份文件总数:${bak_cnt},今日备份文件总数:${bak_today_cnt}" >>$check_result
#5.删除6个月之前的,保留周一的
file_cnt=`find /backup/ -type f  -name "*.tar.gz" ! -name "*_1.tar.gz" -mtime +180|wc -l`
if [ $file_cnt -ne 0 ];then
    find /backup/ -type f  -name "*.tar.gz" ! -name "*_1.tar.gz" -mtime +180|xargs rm -rf
    echo "删除180天之前的备份成功">>$check_result
else
   log WARNING "180天之前的日志数量为0"
fi

#6.删除360天之前周一的
file_cnt=`find /backup/ -type f -name "*_1.tar.gz" -mtime +360|wc -l`
if [ $file_cnt -ne 0 ];then
    find /backup/ -type f  -name "*_1.tar.gz" -mtime +360|xargs rm -rf
    echo "删除360天之前的备份成功">>$check_result
else
   log WARNING "360天之前的日志数量为0"
fi

#7.邮件
cat $check_result |mail -s "备份结果" 182160328@qq.com