草庐IT

!!!!建议收藏 Rsync项目实践:数据备份 (文件同步到服务器)

西瓜投手爱吃西瓜 2023-09-27 原文

Rsync项目实践:数据备份

项目需求

基本备份要求

准备三台服务器,两台web服务器、一台rsync备份服务器 主机名分别为web01、web02、backup

主机名			外网IP				
web01		10.0.0.7/24			
web02		10.0.0.8/24
backup		10.0.0.41/24		

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLf7EhNj-1666099690586)(…/…/图片/image-20221018164708556.png)]

客户端需求

1.客户端每天凌晨01点在服务器本地打包备份(系统配置文件、日志文件、其他目录、应用配置等

文件)

2.客户端备份的数据必须存放至以主机名IP地址当前时间命名的目录中,

例 /backup/nfs_10.0.0.31_2018-09-26

3.客户端最后通过 rsync 推送本地已打包好的备份文件至 backup 服务器

4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

服务端需求

1.服务端部署rsync,用于接收客户端推送过来的备份数据

2.服务端需要每天校验客户端推送过来的数据是否完整

3.服务端需要每天校验的结果通知给管理员

4.服务端仅保留3个月的备份数据,其余的全部删除

注意:所有服务器的备份目录必须都为/backup

项目需求分析

客户端需求分析

1.每天凌晨01点在服务器本地打包备份

​ 设置定时任务

crontab -e
0 1 * * * sh /root/rsync_client.sh

2.备份文件

系统配置文件
设备挂载配置文件   /etc/fstab		本地内网配置文件	/etc/hosts
系统日志文件
系统安全日志、rsysloglog日志等	/var/log/		
应用程序日志
nginx运行日志	/etc/nginx/conf.d/

3.客户端备份的数据必须存放至以主机名IP地址当前时间命名的目录中,

创建一个目录 以主机名IP地址当前时间命名
获取主机名  hostname
获取主机IP ip add  show ens33 | awk -F'[ /]+' '/inet /{print $3}' 
当前时间  date +%F

4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

查找7天以前的内容并删除

find /backup/ -atime +7 -delete

服务端需求分析

1.服务端部署rsync,部署邮箱代理(校验完数据后反馈校验信息至QQ邮箱)


2.服务端需要每天校验客户端推送过来的数据是否完整

把服务器需要备份的文件存放在主机名IP地址当前时间命名的目录中,对目录中的文件进行压缩归档。

服务器和客户端:
使用md5sum命令生成和校验文件的md5值,并把校验的结果重定向到以主机名 IP地址 当前时间 .md5sum命名的文件
把两个文件的值进行对比

3.服务端需要每天校验的结果通知给管理员

把校验结果发送至管理员的邮箱

mail -s "校验的结果" $管理员的邮箱号 < $mail_file

4.服务端仅保留3个月的备份数据,其余的全部删除

删除三个月之前的文件

find /backup/ -atime  +90 -name "*.tar.gz" -delete 

项目设计

编写shell脚本实现

客户端脚本

定义变量
dir=/backup/		#所有服务器的备份目录必须都为/backup
host=$(hostname)	#获取主机名
ip=$(ip add  show ens33 | awk -F'[ /]+' '/inet /{print $3}')	#获取IP地址
date=$(date +%F)	#显示当前日期
bak_dir=$dir$host-$ip-$date		#客户端备份的数据必须存放至以主机名IP地址当前时间命名的目录中
conf_bak="/etc/passwd /etc/fstab /etc/hosts /etc/nginx/conf.d/"		#需要备份的系统配置文件
log_bak="/var/log /etc/nginx/logs/"		#需要备份的日志文件
other_bak="/etc/rsync.password"		#rsync的密码文件
rsync_srv=10.0.0.41		#服务器IP
rsync_user=rsync_user	#用户名
rsync_dir=backup		#目录
rsync_cmd="rsync -avz"	#使用rsync实现远程数据同步 压缩后使用归档模式传输 并以详细模式输出

服务端脚本

定义变量
dir=/backup/	#所有服务器的备份目录必须都为/backup
date=$(date +%F)	#当前日期
mail_file="/root/mail_md5sum_result"	#使用md5校验,把校验结果存放至文件中
adm_email="管理员的邮箱"

项目实施

客户端脚本

vim rsync_client.sh
#!/bin/bash
dir=/backup/
host=$(hostname)
ip=$(ip add  show ens33 | awk -F'[ /]+' '/inet /{print $3}')
date=$(date +%F)
bak_dir=$dir$host-$ip-$date
conf_bak="/etc/passwd /etc/fstab /etc/hosts /etc/nginx/conf.d/"
log_bak="/var/log /etc/nginx/logs/"
other_bak="/etc/rsync.password"
rsync_srv=10.0.0.41
rsync_user=rsync_user
rsync_dir=backup
rsync_cmd="rsync -avz"
export RSYNC_PASSWORD=1

mkdir -p $bak_dir/{confs,logs,scripts,others}	#创建需要备份的文件目录
#把文件复制到指定的目录下	并把结果丢至黑洞
cp -r $conf_bak $bak_dir/confs &>/dev/null	
cp -r $log_bak $bak_dir/logs &>/dev/null
cp -r $other_bak $bak_dir/others &>/dev/null
#在添加文档至归档后删除源文件(打包后删除源文件)
tar czf $bak_dir.tar.gz $bak_dir --remove-files &> /dev/null
#md5sum命令生成和校验文件的md5值,并把校验的结果重定向到以主机名 IP地址 当前时间 .md5sum命名的文件
md5sum $bak_dir.tar.gz > $bak_dir.md5sum

$rsync_cmd $dir $rsync_user@$rsync_srv::$rsync_dir &>/dev/null

#本地资源保留7天
find $dir -atime +7 -delete &> /dev/null

客户端计划任务

crontab -e
0 1 * * * sh /root/rsync_client.sh

服务端脚本

vim rsync_server.sh
#!/bin/bash
dir=/backup/
date=$(date +%F)
mail_file="/root/mail_md5sum_result"
adm_email="你自己的邮箱"

find $dir -name "*$date.md5sum" | xargs md5sum -c > $mail_file
mail -s "rsync_result" $adm_email < $mail_file &> /dev/null

#校验信息保留三天
find $dir -atime +3 -name "*.md5sum" -delete 

#备份数据库三个月
find $dir -atime  +90 -name "*.tar.gz" -delete 

服务端计划任务

crontab -e
0 3 * * * sh /root/rsync_server.sh

项目验收

在客户端10.0.0.7上运行脚本

在客户端10.0.0.8上运行脚本

在服务器上运行脚本

设置邮箱的文件

项目中出现的问题汇总

使用什么样的校验方式 diff 还是md5

Linux diff命令用于比较文件的差异。diff以逐行的方式,比较文本文件的异同处。特别是比较两个版本不同的文件,如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。比较文件夹diff,可以直接使用diff命令

md5sum 用于计算和校验文件的MD5

MD5,是一种单向加密,它的加密不可逆,它将任意长度的字符串,经过算法计算后生成固定长度的数据,一般为16位表示。

MD5的用途:
    1. 消息完整性:每份数据生成的MD5码不同,所以可以吧MD5码和数据一块发送,在对端使用MD5加密对数据加密在与接收的MD5码做对比,保证数据的正确性。
    2. 安全访问认证:常被用到 mysql和传递用户账户信息和密码,从用户端发送到服务器的只是一段128位的摘要,服务器拿到后直接将其存入数据库,下次登录只需与服务器的密文进行对比即可,这样保护了用户的信息,即便是后台人员也无法去获取用户的账户密码。
    3. 数字签名
其他加密算法
非对称加密:包括RSA DSA RCC,非对称加密是相比对称加密而言的。
对称加密:包括AES,DES,3DES
对称加密与解密使用的是同样的密钥,但由于需要将密钥在网络传输,所以安全性不高
非对称加密使用了一对密钥,公钥与私钥,把以安全性高,但加密与解密速度慢
解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通

如何把校验结果以邮箱的形式发给管理者

安装邮件服务

yum install -y mailx

vim /etc/mail.rc

set from=2414857437@qq.com    (自己的QQ邮箱)
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=2414857437@qq.com   (自己的QQ邮箱)
set smtp-auth-password=XXXX  (自己的邮箱IPMPA码)
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

使用echo “邮件正文” | mail -s 邮件标题 邮箱

有关!!!!建议收藏 Rsync项目实践:数据备份 (文件同步到服务器)的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby-on-rails - 建模收藏夹 - 2

    我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor

  5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  6. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  7. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  9. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  10. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

随机推荐