rsync搭建全网备份

news2024/9/20 16:29:07

rsync搭建全网备份

    • 1. 总体概述
      • 1.1 目标
      • 1.2 简易指导图
      • 1.3 涉及工具或命令
      • 1.4 环境
    • 2. 实施
      • 2.1 配置备份服务器
      • 2.2 备份文件准备
      • 2.3 整合命令
      • 2.4 扩展功能

在这里插入图片描述

1. 总体概述

1.1 目标

本次搭建目标:

  1. 每天定时把服务器数据备份到备份服务器
  2. 备份完成后进行校验
  3. 把过期数据删除(普通服务器数据保留7天,备份服务器数据保留1年)
  4. 完成后邮件通知

1.2 简易指导图

在这里插入图片描述

1.3 涉及工具或命令

  1. rsysnc:备份工具,守护进程模式
  2. cron:定时任务
  3. md5sum:MD5校验工具
  4. mailx:邮件
  5. tarfinddate等等

1.4 环境

服务器ip系统版本说明
backup-svr-01192.168.202.128CentOS Linux release 7.9.2009 (Core)备份服务器
data-svr-01192.168.202.128CentOS Linux release 7.9.2009 (Core)数据服务器

2. 实施

在每个步骤中,会把具体的需求细化分解

2.1 配置备份服务器

  1. 创建备份目录
[root@backup-svr-01 ~]# chown rsync.rsync /backup/
[root@backup-svr-01 ~]# ll /backup/ -d
drwxr-xr-x 2 rsync rsync 6 Aug 29 16:39 /backup/
  1. 创建rsync进程使用的用户
[root@backup-svr-01 ~]# useradd -s /sbin/nologin -M rsync
[root@backup-svr-01 ~]# id rsync
uid=1003(rsync) gid=1004(rsync) groups=1004(rsync)

客户端连到备份服务器用rsync用户访问权限访问数据,这个用户只提供访问权限,所以不需要登录shell

  1. 创建客户端访问备份服务器的账户
[root@backup-svr-01 ~]# echo "rsync_bak_01:rsync" > /etc/rsync.passwd
[root@backup-svr-01 ~]# cat /etc/rsync.passwd
rsync_bak_01:rsync
[root@backup-svr-01 ~]# chmod 400 /etc/rsync.passwd
[root@backup-svr-01 ~]# ll /etc/rsync.passwd
-r-------- 1 root root 19 Aug 29 16:51 /etc/rsync.passwd
  1. 编译rsync的配置文件

没有安装rsync可以通过yum install -y rsync安装

[root@backup-svr-01 ~]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode

uid = rsync
gid = rsync
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
fake super = yes
[backup]
path = /backup/						#备份到服务器的目录
ignore errors
read only = false
list = false
hosts allow = 192.168.202.0/24		#允许的IP范围
hosts deny = 0.0.0.0/32				#其他IP都禁止
auth users = rsync_bak_01
secrets file = /etc/rsync.passwd

配置完成后重启rsyncd服务

[root@backup-svr-01 ~]# systemctl restart rsyncd
  1. 测试rsync

首先在客户端配置密码文件

[root@data-svr-01 ~]# cat /etc/rsync.passwd
rsync

传输测试

[root@data-svr-01 ~]# rsync -avz /etc/hosts rsync_bak_01@192.168.202.128::backup --password-file=/etc/rsync.passwd
sending incremental file list
hosts

sent 187 bytes  received 43 bytes  153.33 bytes/sec
total size is 254  speedup is 1.10

[root@backup-svr-01 ~]# ll /backup/
total 4
-rw-r--r-- 1 rsync rsync 254 May  9  2023 hosts

2.2 备份文件准备

这里我们在普通服务器(客户端),把一些常用文件,重要数据等内容进行备份,视具体情况而定

本次示例中以/etc目录为例

  1. 创建备份数据存放目录
[root@data-svr-01 ~]# mkdir /data

这里我们把备份数据存放在/data/ip目录中

mkdir -p /data/`ip a s ens33|sed -rn '3 s#^[^[:digit:]]+(.*)/.*#\1#gp'`

取IP可以有多种方式,例如:

[root@data-svr-01 ~]# hostname -I|awk '{print $1}'
192.168.202.129
[root@data-svr-01 ~]# ip a s ens33|awk 'BEGIN{FS="inet |/24"} NR==3{print $2}'
192.168.202.129
  1. 打包数据,并以时间进行区分

打包数据

[root@data-svr-01 ~]# tar zcf /data/`ip a s ens33|sed -rn  '3 s#^[^[:digit:]]+(.*)/.*#\1#gp'`/etc.`date +%F`.tar.gz /etc/
tar: Removing leading `/' from member names

查看

[root@data-svr-01 ~]# tree /data/
/data/
└── 192.168.202.129
    └── etc.2024-08-29.tar.gz

1 directory, 1 file

后面我们会把这些命令整理到脚本中,目前只是测试

2.3 整合命令

我们把前面用到的命令整合到脚本中,并进行测试

  1. 编写脚本
[root@data-svr-01 scripts]# cat etc_bak2svr.sh
#!/bin/bash
#author yurq

#set -e

. /etc/profile


ip=`ip a s ens33|sed -rn  '3 s#^[^[:digit:]]+(.*)/.*#\1#gp'`
time=`date +%F`
svr=192.168.202.128


if [ ! -d /data/$ip ];then
    mkdir -p /data/$ip
fi

tar zcf /data/$ip/etc.$time.tar.gz /etc/

if [ $? -ne 0 ];then
    echo "tar etc failed"
fi

ls /data/$ip/etc.$time.tar.gz

if [ $? -ne 0 ];then
    echo "etc.$time.tar.gz lost found."
fi

rsync -avz /data/$ip/etc.$time.tar.gz rsync_bak_01@$svr::backup --password-file=/etc/rsync.passwd


if [ $? -ne 0 ];then
    echo "rsync failed"
fi
  1. 测试脚本
    客户端
[root@data-svr-01 scripts]# rm -rf /data/*
[root@data-svr-01 scripts]# sh etc_bak2svr.sh
tar: Removing leading `/' from member names
/data/192.168.202.129/etc.2024-08-29.tar.gz
sending incremental file list
etc.2024-08-29.tar.gz

sent 10,207,860 bytes  received 43 bytes  4,083,161.20 bytes/sec
total size is 10,411,198  speedup is 1.02

服务器

[root@backup-svr-01 ~]# ll /backup/
total 10168
-rw-r--r-- 1 rsync rsync 10411198 Aug 29 19:42 etc.2024-08-29.tar.gz

这并不是我们想要的,rsync我们在使用的时候,应该把ip构建的目录也带上一起传过去

  1. 修改脚本
rsync -avz /data/$ip rsync_bak_01@$svr::backup --password-file=/etc/rsync.passwd

把这行给了就可以了,注意ip后不要加/

  1. 清理环境,重新上传
[root@data-svr-01 scripts]# sh etc_bak2svr.sh
tar: Removing leading `/' from member names
/data/192.168.202.129/etc.2024-08-29.tar.gz
sending incremental file list
192.168.202.129/
192.168.202.129/etc.2024-08-29.tar.gz

sent 10,207,905 bytes  received 47 bytes  6,805,301.33 bytes/sec
total size is 10,411,198  speedup is 1.02
[root@backup-svr-01 ~]# tree /backup/
/backup/
└── 192.168.202.129
    └── etc.2024-08-29.tar.gz

1 directory, 1 file
  1. 校验文件
    写到这笔者想起来还应该带上MD5校验文件,修改脚本
[root@data-svr-01 data]# cat /scripts/etc_bak2svr.sh
#!/bin/bash
#author yurq

#set -e

. /etc/profile


ip=`ip a s ens33|sed -rn  '3 s#^[^[:digit:]]+(.*)/.*#\1#gp'`
time=`date +%F`
svr=192.168.202.128


if [ ! -d /data/$ip ];then
    mkdir -p /data/$ip
fi

tar zcf /data/$ip/etc.$time.tar.gz /etc/

if [ $? -ne 0 ];then
    echo "tar etc failed"
fi

ls /data/$ip/etc.$time.tar.gz

if [ $? -ne 0 ];then
    echo "etc.$time.tar.gz lost found."
fi

rsync -avz /data/$ip rsync_bak_01@$svr::backup --password-file=/etc/rsync.passwd


if [ $? -ne 0 ];then
    echo "rsync failed"
fi

cd /data/
md5sum $ip/etc.$time.tar.gz > $ip/etc.md5

if [ $? -ne 0 ];then
    echo "make md5 failed"
fi

验证

[root@data-svr-01 data]# sh /scripts/etc_bak2svr.sh
tar: Removing leading `/' from member names
/data/192.168.202.129/etc.2024-08-29.tar.gz
sending incremental file list
192.168.202.129/
192.168.202.129/etc.2024-08-29.tar.gz
192.168.202.129/etc.md5

sent 3,513 bytes  received 19,446 bytes  4,174.36 bytes/sec
total size is 10,411,270  speedup is 453.47
[root@data-svr-01 data]# cat 192.168.202.129/etc.md5
f9a218d7b059fa412fdecef06d27f469  192.168.202.129/etc.2024-08-29.tar.gz
[root@backup-svr-01 ~]# tree /backup/
/backup/
└── 192.168.202.129
    ├── etc.2024-08-29.tar.gz
    └── etc.md5

1 directory, 2 files
  1. 下面编辑定时任务,每天晚上2点备份
    首先,编辑一个任务每分钟的任务进行测试,毕竟不能等到晚上2点再验证
[root@data-svr-01 data]# cat /var/spool/cron/root
* * * * * sh /scripts/etc_bak2svr.sh &>/dev/null
[root@data-svr-01 data]# tail -f /var/log/cron
...
Aug 30 03:26:01 data-svr-01 CROND[65599]: (root) CMD (sh /scripts/etc_bak2svr.sh &>/dev/null)
...
[root@backup-svr-01 ~]# tree /backup/
/backup/
└── 192.168.202.129
    ├── etc.2024-08-29.tar.gz
    ├── etc.2024-08-30.tar.gz
    └── etc.md5

1 directory, 3 files

任务正常完成了,不过发现一个问题,md5文件把之前的冲掉了,所以需要修改脚本

md5sum $ip/etc.$time.tar.gz > $ip/etc.$time.md5

制作md5的时候加上日期

  1. 清除环境,再次验证。另外发现,md5在上传之后增加的,实际是不对的,调整执行顺序。
[root@data-svr-01 scripts]# cat etc_bak2svr.sh
#!/bin/bash
#author yurq

#set -e

. /etc/profile


ip=`ip a s ens33|sed -rn  '3 s#^[^[:digit:]]+(.*)/.*#\1#gp'`
time=`date +%F`
svr=192.168.202.128


if [ ! -d /data/$ip ];then
    mkdir -p /data/$ip
fi

tar zcf /data/$ip/etc.$time.tar.gz /etc/

if [ $? -ne 0 ];then
    echo "tar etc failed"
fi

ls /data/$ip/etc.$time.tar.gz

if [ $? -ne 0 ];then
    echo "etc.$time.tar.gz lost found."
fi


cd /data/
md5sum $ip/etc.$time.tar.gz > $ip/etc.$time.md5

if [ $? -ne 0 ];then
    echo "make md5 failed"
fi

rsync -avz /data/$ip rsync_bak_01@$svr::backup --password-file=/etc/rsync.passwd


if [ $? -ne 0 ];then
    echo "rsync failed"
fi
[root@backup-svr-01 ~]# tree /backup/
/backup/
└── 192.168.202.129
    ├── etc.2024-08-30.md5
    └── etc.2024-08-30.tar.gz

1 directory, 2 files

2.4 扩展功能

  1. 添加清除过期备份,客户端备份保留7天
[root@data-svr-01 scripts]# mkdir /tmp/etc_backup
[root@data-svr-01 scripts]# ll /home/
total 0
[root@data-svr-01 scripts]# mkdir /home/yurq
[root@data-svr-01 scripts]# cp -r /etc/* /home/yurq/
[root@data-svr-01 scripts]# find /etc/ -type f -mtime +7|xargs -I file mv file /tmp/etc_backup/
[root@data-svr-01 scripts]# ll /tmp/etc_backup/
total 22300
-rwxr-xr-x. 1 0   0    8702 Jul 28  2020 00_header
-rw-r--r--. 1 0   0     232 May  9  2023 00-keyboard.conf
-rwxr-xr-x. 1 0   0     175 May 22  2020 00-netreport
-rwxr-xr-x. 1 0   0    1043 Mar 21  2019 00_tuned
-rwxr-xr-x. 1 0   0     232 Jul 28  2020 01_users
-rwxr-xr-x. 1 0   0     392 Aug  8  2019 0anacron
...

创建目录,并拷贝/etc/内容进行测试,完成后把查找目录改为备份数据目录

find /data/ -type f -mtime +7|xargs -I file mv file /tmp/etc_backup/

把命令添加到脚本中

  1. 添加邮件通知
echo "test" |mailx -s "test" xxx@163.com

这里最好申请企业邮箱,发送太多条邮件到个人邮箱,可能被邮箱系统拦截

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】turtle的使用

文章目录 1.初始化2.颜色3.画笔4.其他案例:分形树的绘制 1.初始化 import turtle# 创建一支画笔 pen turtle.Turtle()# ...# 暂停屏幕,防止程序关闭 turtle.done()2.颜色 # 设置颜色模式(如果要使用颜色相关设置,必须要使用这个) turtle.c…

基于STM32的RFID高速收费系统(论文+源码+实物)

1系统方案设计 本文基于STM32的RFID高速收费系统,其可以实现小车和货车两种车型收费,当车辆超过了规定的重量后,出现声光报警提示,并且启动杆不会抬起,只有当车辆重量低于设置值时,启动杆才会自动抬起&…

零基础学习Redis(7) -- hash类型命令使用

Redis本身就是通过哈希表的方式组织数据,同时redis中的value也可以是另一个哈希表。 1. 常用命令 1. hset / hsetnx hset key filed1 value1 filed2 value2 ... hset 用于把键值对存入value中,这里的key为redis组织的键, filed1 value1 fil…

SpringData-ElasticSearch入门

文章目录 1、创建demo工程2、application.properties3、Goods 实体类4、EsDemoApplicationTests 测试类5、pom.xml6、查看索引库7、查看单个索引(数据库)8、从goods索引中检索出符合特定搜索条件的文档(或记录) 1、创建demo工程 2…

Elasticsearch:使用 LTR 进行个性化搜索

作者:来自 Elastic Max Jakob 如今,用户已经开始期待根据个人兴趣定制搜索结果。如果我们听的所有歌曲都是摇滚歌曲,那么在搜索 “Crazy” 时,我们会期望 Aerosmith 的歌曲排在搜索结果的首位,而不是 Gnarls Barkley 的…

使用安信可Ai-WB2-12F开启wifi与手机通信TCP-IP(AT指令)

当时在做两个单片机之间无线通信,或者单片机与手机无线通信,就像找一个蓝牙和wifi双模的无线模块,一开始看ESP8684(ESP32-C2)这个芯片模组是有wifi和蓝牙的,买回来后才发现他不可以在程序运行中更换蓝牙或者…

《黑神话·悟空》这款游戏到底是用什么编程语言开发的?

你也有被这段游戏试玩视频刷屏吗? 13分钟、国产团队出品、B站上线不到24小时,播放量已经破千万,迅速火爆全网。 这就是来自国内游戏团队游戏科学(Game Science)开发的3A大作《黑神话:悟空》。 《黑神话悟…

vscode开发小程序

1 安装 "微信小程序开发工具" 2 安装 "WXML - Language Service" 3 安装 "wxmp-api-plugin" 或 "wechat-snippet" 4 安装"WXSS"

顶级的python入门教程!小白到大师,从这篇教程开始!

1. 为什么要学习Python? 学习Python的原因有很多,以下是几个主要的原因: 广泛应用:Python被广泛应用于Web开发、数据科学、人工智能、机器学习、自动化运维、网络爬虫、科学计算、游戏开发等多个领域。掌握Python意味着你可以在这…

嵌入式全栈开发学习笔记---Linux系统编程(进程间通信)

目录 进程间通信概述 进程通信目的 进程间通信的发展 进程间通信分类 管道通信 无名管道 有名管道mkfifo() 信号 发送信号kill & raise 忽略信号signal() 发送信号alarm() 消息队列 消息队列使用的步骤 创建消息队列msgget() 读写消息队列msgrcv()/msgsnd()…

ip地址一天变化好几次

‌IP地址每天变化的原因主要取决于其分配方式:静态或动态。静态IP地址是长期固定分配给一台设备的,除非进行手动更改或网络配置发生变化,否则该设备的IP地址将保持不变。而动态IP地址则是根据网络环境和需求动态分配给设备的,可能…

一些评估模型的总结(1)

最近学习了评估模型(如下所示),对这四种方法进行小总结。 目录 1. 层次分析法。(主观赋权方法,主观确定成对比较矩阵) 2. 熵权法(基于数据的客观赋权的方法) 3. topsis方法&…

【图论入门】图的存储

1.邻接矩阵 邻接矩阵是图论中用于表示图(Graph)结构的一种重要数据结构,特别适用于表示顶点之间连接关系的图形。在计算机科学和数学领域,它被广泛应用来编码无向图和有向图的信息。 特点: 1、无向图的邻接矩阵是对称…

Java:时区的用法

文章目录 ZoneId常见用法 ZonedDateTime常见方法 代码 黑马学习笔记 ZoneId 常见用法 ZonedDateTime 常见方法 代码 package NewTime;import java.time.Clock; import java.time.ZoneId; import java.time.ZonedDateTime;/*** Author: ggdpzhk* CreateTime: 2024-08-31*/ pu…

09:Logic软件原理图信号连通

原理图信号连通 快捷键:F2 2.添加网络名称

【React】为什么Hooks不能出现在判断中

前言 在 React 中,Hooks 不能写在条件语句中,如下面这段代码点击button后则会报错。 import { useEffect, useState } from "react"export default () > {const [count, setCount] useState(0)if (count > 0) {useEffect(() > {co…

4-4 初始化引导程序

基本原理的讲解 在loader所需要做的事情, 1 他这个检测内存的容量,我想知道是怎么做的。 2 然后就是模式的切换。 3 然后就是加载操作系统,并跳转到操作系统执行。 这是 他的总体的逻辑。 首先是加载 512 字节。 所以这512 字节的主要任务…

【Kubernetes部署篇】二进制搭建K8s高可用集群1.26.15版本

文章目录 一、服务器环境信息及部署规划1、K8S服务器信息及网段规划2、服务器部署架构规划3、组件版本信息 二、初始化环境操作1、关闭防火墙2、配置本地域名解析3、配置服务器时间保持一致4、禁用swap交换分区(K8S强制要求禁用)5、配置主机之间无密码登录6、修改Linux内核参数…

springboot 医院挂号系统 ---附源码91789

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 医院挂号系统系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程分析 图2-5业务流程图 2.5本章小结 3 医院挂号系统总体设计 3.1 系统功能模块设计 3.2 数据库设计 3.4本章…

Python读取CSV文件的几种方法!

1、使用 csv 模块 首先,你需要导入csv模块: import csv接下来,你可以使用csv.reader()函数来读取CSV文件。假设你的CSV文件名为data.csv,它的内容如下: Name, Age, Salary John, 25, 5000 Alice, 30, 6000 Bob, 35,…