当前位置:首页>Linux>linux运维-使用rsync协议-备份/同步企业业务数据

linux运维-使用rsync协议-备份/同步企业业务数据

  • 2026-08-22 14:10:05
linux运维-使用rsync协议-备份/同步企业业务数据

使用rsync协议-备份/同步企业业务数据

目的:使用 rsync协议对公司全网服务同步或者备份数据;

涉及的技能点

  • rsync协议  (远程传输模式和守护进程演示)
  • rsync守护进程模式配置文件部分讲解
  • 使用awk取值
  • 编写rsync服务端和客户端的Shell脚本对所在的企业备份需求进行执行操作 (实际的生产环境中要擅长使用脚本自动化执行)
  • md5sum校验时要比对同目录下的文件
  • tar压缩带不带/的注意事项
  • 定时任务中绝对路径的作用

备份项目拓扑图

实际的生产备份项目中,rsync服务端和客户端所在的业务数据汇总数据路径需要保持一致,方便脚本的书写和MD5校验

备份项目拓扑图

项目拓扑架构

  • 表中rsync服务端在实际的生产环境也视为客户端;(向其他云端或者异地节点进行提送数据)。
角色
外网 IP
内网 IP
主机名
规划路径
Rsync客户端
192.168.0.21/24
10.0.0.21/24
web-01
/dingdan_data01 /os_data01 /suyuan_data01
Rsync客户端
192.168.0.14/24
192.168.0.14/24
NFS
/dingdan_data01 /os_data01 /suyuan_data01
Rsync服务端
192.168.0.12/24
192.168.0.12/24
rsync_server
/share_data101 /share_data101/
Centos7.9
需要将客户端的业务数据压缩到一个文件中进行校验

服务端需求

备份客户的存储路径
校验是否完成
是否推送校验结果
保留数据期限
/sharedata-101/
是
是;
6个月
客户端汇总的文件压缩打包到/share_data01

客户端端需求

备份路径及书写规则
备份数据及汇总位置
备份目的地
备份周期
备份任务
/share_data01/主机名_时间
/os_data01/ /dingdan_data01/ /suyuan_data01/ 打包到/share_date01
rsync协议传输到备份服务器0.12
只保留7天
每日凌晨1点执行脚本
理解成发快递的一些要求
快递装车
运输到仓库存放
存放周期
执行
因为md5sum不支持对目录进行校验,因此客户端汇总的文件压缩打包
形成一个汇总压缩包到/share_data01

项目部署

Rsync客户端需求配置

1.客户端按照规划创建业务数据目录

  • 其中取值的语句保存好,后续要写入到脚本之中,方便每日执行创建备份的目录;
  • mkdir -p /share_data01/(hostname)_(ifconfig eth1 |awk 'NR==2 {print 2}')_(date +%F)
//按照规划取出以下的客户端备份路径信息(客户端的时间、主机名,IP地址)[root@nfs_0.14[ ~]# date +%F2025-06-28[root@nfs_0.14[ ~]  hostnamenfs_0.14[root@nfs_0.14[ ~]  ifconfig eth1 |awk 'NR==2 {print $2}'10.0.0.14//这样取值路径才符合规划[root@nfs_0.14[ ~]  echo $(hostname)_$(ifconfig eth1 |awk 'NR==2 {print $2}')_$(date +%F)nfs_0.14_10.0.0.14_2025-06-28//单次手动创建每日的备份目录[root@nfs_0.14[ /]  mkdir -p /share_data01/$(hostname)_$(ifconfig eth1 |awk 'NR==2 {print $2}')_$(date +%F)[root@nfs_0.14[ /]  ll /share_data01/总用量 0drwxr-xr-x 2 root root 6 6月  28 18:32 nfs_0.14_10.0.0.14_2025-06-28

2.虚拟出客户端业务数据目录

[root@nfs_0.14[ /]  tree /os_data01/ /dingdan_data01/ /suyuan_data01//os_data01/├── 10.iso├── 1.iso├── 2.iso├── 3.iso├── 4.iso├── 5.iso├── 6.iso├── 7.iso├── 8.iso└── 9.iso/dingdan_data01/├── 10.word├── 1.word├── 2.word├── 3.word├── 4.word├── 5.word├── 6.word├── 7.word├── 8.word└── 9.word/suyuan_data01/├── 10.txt├── 1.txt├── 2.txt├── 3.txt├── 4.txt├── 5.txt├── 6.txt├── 7.txt├── 8.txt└── 9.txt
  • 拷贝客户端模拟的业务数据目录到指定备份目录下(根据情况是否压缩)

cp -rp /dingdan_data01 /suyuan_data01 /os_data01 /share_data01/(hostname)_(ifconfig eth1 |awk 'NR==2 {print 2}')_(date +%F)

[root@nfs_0.14[ /share_data01]# cp -rp /dingdan_data01 /suyuan_data01 /os_data01 /share_data01/$(hostname)_$(ifconfig eth1 |awk 'NR==2 {print $2}')_$(date +%F)[root@nfs_0.14[ /share_data01]# ll /share_data01/nfs_0.14_10.0.0.14_2025-06-28/总用量 0drwxr-xr-x 2 root root 147 6月  28 18:38 dingdan_data01drwxr-xr-x 2 root root 137 6月  28 18:38 os_data01drwxr-xr-x 2 root root 137 6月  28 18:37 suyuan_data01[root@nfs_0.14[ /share_data01]# 

rsync服务端配置

  • rsync配置文件  (之前分享过不再过多讲解如何配置)
[root@rsync-server_0.12[ /linshi01]# cat /etc/rsyncd.confuid = rsyncgid = rsyncport = 873fake super = yesuse chroot = nomax connections = 200timeout = 600#ignore errorsread only = falselist = trueauth users = rsync_backupsecrets file = /etc/rsync.passwdlog file = /var/log/rsyncd.log####################################[linshi01]comment = “这是临时rsync的测试文件”path = /linshi01[sharedata101]comment = "这是NFS、Web01的业务数据"path = /sharedata101

rsync配置文件中的认证用户和用户的区别

问:配置文件中的这两个用户有什么关系?

答:没有必然关系,rsync是负责写数据的用户身份,而rsync_backup用于连接rsync服务端的用户身份;

uid = rsyncgid = rsyncauth users = rsync_backup
rsync配置文件中的认证用户和用户的区别

  • 注意在新增模块后,要重启rsync服务,并授权模块的目录为的属主组
[root@rsync-server_0.12[ /]  ll -ld /sharedata-101/drwxr-xr-x 2 rsync rsync 6 6月  28 18:59 /sharedata-101/[root@rsync-server_0.12[ /]  systemctl restart rsyncd[root@rsync-server_0.12[ /] netstat -lntup | grep '873'tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      3101/rsync          tcp6       0      0 :::873                  :::*                    LISTEN      3101/rsync          [root@rsync-server_0.12[ /]# 
  • 客户端向rsync服务端推送规划好的文件路径下的内容:
[root@nfs_0.14[ /etc]# rsync -vaz /share_data01/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.passwordsending incremental file list./nfs_0.14_10.0.0.14_2025-06-28/nfs_0.14_10.0.0.14_2025-06-28/dingdan_data01/nfs_0.14_10.0.0.14_2025-06-28/dingdan_data01/1.wordnfs_0.14_10.0.0.14_2025-06-28/dingdan_data01/10.word
服务端查看备份路径下是有相应的备份数据
  • 按照规划,这样手动执行操作是不太友好的,因此需要将这些命令附到脚本中,定时任务中去执行;
//客户端中编写一个脚本文件[root@nfs_0.14[ /scripts]# pwd/scripts[root@nfs_0.14[ /scripts]  cat NFS_push_sharedata01.sh #!/usr/bin/bash//创建备份的目录mkdir -p /share_data01/$(hostname)_$(ifconfig eth1 |awk 'NR==2 {print $2}')_$(date +%F)//拷贝备份文件到备份目录之中cp -rp /dingdan_data01 /suyuan_data01 /os_data01 /share_data01/$(hostname)_$(ifconfig eth1 |awk 'NR==2 {print $2}')_$(date +%F)//推送备份数据到Rsync服务端rsync -vaz /share_data01/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.password
测试脚本是否可以执行
服务端查看规划好的备份目录内的文件正常推送
  • 因为在实际的生产环境,这样的脚本内容会显得十分不灵活,因此介入变量;
[root@nfs_0.14[ /scripts]# cat NFS_push_sharedata01.sh #!/usr/bin/bash#定义变量(首字母大小写,区分系统命令Path=/share_data01Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#1.创建备份的目录mkdir -p $Path/$Dest#2.拷贝不同业务数据的存储文件汇总到指定文件夹内cp -rp /dingdan_data01 /suyuan_data01 /os_data01 $Path/$Dest#3.推送汇总的备份数据到rsync服务端rsync -vaz $Path/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.password#4.保留7天的备份数据
  • 测试脚本是否可以正常执行以及rsync服务端和客户端内是否按照规划好的内容进行汇总推送
执行脚本后测试正常-推送以及汇总

模拟客户端到服务端产生了30天的数据(为解决决客户端中只保留7天的数据)

//在NFS客户端上执行模拟出30天的数据;[root@nfs_0.14[ /scripts]  for i in {1..30}; do date -s 2025/07/$i; sh /scripts/NFS_push_sharedata01.sh ; done
模拟客户端到服务端产生了30天的数据
  • 使用find命令查找7天内的数据,并删除其余数据
//如果不携带深度的参数的查找效果,文件路径较深,实际生产环境中查看比较繁琐;[root@nfs_0.14[ /]# find /share_data01/ -type d /share_data01//share_data01/nfs_0.14_10.0.0.14_2025-06-30/share_data01/nfs_0.14_10.0.0.14_2025-06-30/dingdan_data01/share_data01/nfs_0.14_10.0.0.14_2025-06-30/suyuan_data01/share_data01/nfs_0.14_10.0.0.14_2025-06-30/os_data01/share_data01/nfs_0.14_10.0.0.14_2025-07-01/share_data01/nfs_0.14_10.0.0.14_2025-07-01/dingdan_data01/share_data01/nfs_0.14_10.0.0.14_2025-07-01/suyuan_data01/share_data01/nfs_0.14_10.0.0.14_2025-07-01/os_data01/share_data01/nfs_0.14_10.0.0.14_2025-07-02......//携带了限制文件路径深度的参数,显示出的结果比较明了,忽略了更深层的子目录[root@nfs_0.14[ /]# find /share_data01/ -maxdepth 1 -type d/share_data01//share_data01/nfs_0.14_10.0.0.14_2025-06-30/share_data01/nfs_0.14_10.0.0.14_2025-07-01/share_data01/nfs_0.14_10.0.0.14_2025-07-02/share_data01/nfs_0.14_10.0.0.14_2025-07-03/share_data01/nfs_0.14_10.0.0.14_2025-07-04/share_data01/nfs_0.14_10.0.0.14_2025-07-05/share_data01/nfs_0.14_10.0.0.14_2025-07-06/share_data01/nfs_0.14_10.0.0.14_2025-07-07/share_data01/nfs_0.14_10.0.0.14_2025-07-08......// 配合时间参数[root@nfs_0.14[ /]# find /share_data01/ -maxdepth 1 -type d -mtime +7/share_data01/nfs_0.14_10.0.0.14_2025-06-30/share_data01/nfs_0.14_10.0.0.14_2025-07-01/share_data01/nfs_0.14_10.0.0.14_2025-07-02/share_data01/nfs_0.14_10.0.0.14_2025-07-03/share_data01/nfs_0.14_10.0.0.14_2025-07-04/share_data01/nfs_0.14_10.0.0.14_2025-07-05/share_data01/nfs_0.14_10.0.0.14_2025-07-06/share_data01/nfs_0.14_10.0.0.14_2025-07-07/share_data01/nfs_0.14_10.0.0.14_2025-07-08/share_data01/nfs_0.14_10.0.0.14_2025-07-09/share_data01/nfs_0.14_10.0.0.14_2025-07-10/share_data01/nfs_0.14_10.0.0.14_2025-07-11/share_data01/nfs_0.14_10.0.0.14_2025-07-12/share_data01/nfs_0.14_10.0.0.14_2025-07-13/share_data01/nfs_0.14_10.0.0.14_2025-07-14/share_data01/nfs_0.14_10.0.0.14_2025-07-15/share_data01/nfs_0.14_10.0.0.14_2025-07-16/share_data01/nfs_0.14_10.0.0.14_2025-07-17/share_data01/nfs_0.14_10.0.0.14_2025-07-18/share_data01/nfs_0.14_10.0.0.14_2025-07-19/share_data01/nfs_0.14_10.0.0.14_2025-07-20/share_data01/nfs_0.14_10.0.0.14_2025-07-21/share_data01/nfs_0.14_10.0.0.14_2025-07-22//连接管道,删除7天前的数据root@nfs_0.14[ /]# find /share_data01/ -maxdepth 1 -type d -mtime +7 | xargs rm -fr[root@nfs_0.14[ /]# ls  /share_data01/nfs_0.14_10.0.0.14_2025-07-23  nfs_0.14_10.0.0.14_2025-07-25  nfs_0.14_10.0.0.14_2025-07-27  nfs_0.14_10.0.0.14_2025-07-29nfs_0.14_10.0.0.14_2025-07-24  nfs_0.14_10.0.0.14_2025-07-26  nfs_0.14_10.0.0.14_2025-07-28  nfs_0.14_10.0.0.14_2025-07-30[root@nfs_0.14[ /]# 

因为rsync服务端有校验的需求,因此需要将汇总的目录和文件进行压缩成一个文件(md5sum命令特性导致);

最终优化的客户端脚本内容

[root@nfs_216.13[ /share_data01]  cat /scripts/NFS_PUSH_0.12.sh #!/usr/bin/bash#定义变量(首字母大小写,区分系统命令Path=/share_data01Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#1.创建备份的目录#mkdir -p $Path/$Dest#2.压缩不同业务数据的存储文件汇总到指定文件夹内-为后续md5校验做文件准备cd /tar czf $Path/${Dest}.tar.gz  dingdan_data01/  os_data01/  suyuan_data01/#3.为客户端业务数据汇总的压缩包创建md5值md5sum $Path/*.tar.gz > $Path/client_${Date}#4.推送汇总的备份数据到rsync服务端rsync -vaz $Path/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.client#4.保留7天的备份数据find $Path/ -maxdepth 1 -type d -mtime +7 | xargs rm -f

最后给予执行权限:

[root@nfs_0.14[ /scripts]  chmod +x rsync-push_0.12.sh

rsync 服务端端需求配置

校验配置

md5sum命令使用说明

  • md5sum 不能针对目录生成
  • 一个文件会产生一个MD5校验值,MD5校验值对应一个文件;
  • 使用 -c命令判定该文件是否被篡改;
md5sum命令使用说明
md5sum不能针对目录生成
  • 所以在客户端的脚本中压缩一个目录并生成一个md5值
#2.压缩不同业务数据的存储文件汇总到指定文件夹内-为后续md5校验做文件准备cd /tar czf $Path/${Dest}.tar.gz  dingdan_data01/  os_data01/  suyuan_data01/#3.为客户端业务数据汇总的压缩包创建md5值md5sum $Path/*.tar.gz > $Path/client_${Date}

最后在客户端中执行脚本,成功满足备份需求

由于本次实验在规划中客户端汇总路径和服务端中rsync模块路径不一致,所以我踩了一个坑,在md5校验时候出现了问题,多了一步把文件和文件目录跟客户端保持一致的操作;

服务端手动验证成功

优化服务端验证文件的脚本

[[root@rsync-server_0.12[ /sharedata-101]# cat /scripts/rsync_server_huizong_jiaoyan.sh #/usr/bin/bash#1.定义变量Path=/sharedata-101Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#2.copy--->md5md5sum -c $(find /${Path}/ -type f -name "MD5_*") >> ${Path}/md5_client_queren#3.保留180天的备份数据find $Path/ -maxdepth 1 -type d -mtime +180 | xargs rm -f

最后给予执行权限:

[root@rsync-server_0.12[ /]# pwd/[root@rsync-server_0.12[ /]# cd /scripts/[root@rsync-server_0.12[ /scripts]  chmod +x rsync_server_huizong_jiaoyan.sh [root@rsync-server_0.12[ /scripts]# ls -l总用量 4-rwxr-xr-x 1 root root 428 7月   1 20:14 rsync_server_huizong_jiaoyan.sh
删除对应文件下的内容,再次执行脚本验证成功

邮件通知实验不做了,因为有拦截,未成功发送


其余客户端拉取对应配置

使用rsync远程传输模式将一台客户端根路径下的scripts文件夹下的文件传输到自己的根目录下:rsync -avz root@10.0.0.14:/scripts /

拓扑中web_01拉取脚本文件
//新的客户端需要设置rsync客户端免密文件且设置权限,才能符合脚本运行,也可使用变量解决[root@web01_0.21[ /scripts]# echo '123.com!' > /etc/rsync.client[root@web01_0.21[ /scripts]# cat /etc/rsync.client 123.com![root@web01_0.21[ /sharedata-101]# chmod 600 /etc/rsync.client

将传输过来的脚本文件稍作修改:

[root@web01_0.21[ /sharedata-101]# cat /scripts/rsync-push_0.12.sh #!/usr/bin/bash#定义变量(首字母大小写,区分系统命令Path=/sharedata-101Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#1.创建备份的目录#mkdir -p $Path/$Dest#2.压缩不同业务数据的存储文件汇总到指定文件夹内-为后续md5校验做文件准备cd /tar czf $Path/${Dest}.tar.gz  dingdan_data01/  os_data01/  suyuan_data01/#3.为客户端业务数据汇总的压缩包创建md5值md5sum $Path/*.tar.gz > $Path/MD5_${Addr}_${Date}#4.推送汇总的备份数据到rsync服务端rsync -vaz $Path/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.client#4.保留7天的备份数据find $Path/ -maxdepth 1 -type d -mtime +7 | xargs rm -f
两个客户端分别执行脚本
服务端执行脚本结果显示正常

脚本的执行加入到定时任务

//两个客户端分别加入定时任务脚本(暂定每隔一分钟执行一次)[root@nfs_0.14[ /sharedata-101]# crontab -l*/1 * * * * sh /scripts/rsync-push_0.12.sh   &>/dev/null
脚本执行的变量文件格式中的IP地址没有了-无论是在客户端还是服务端

脚本执行后,变量中的Ip地址丢失的原因:因为在执行定时任务过程中,系统会开启一个子shell,子shell在执行会出现路径不一致,如图所示:/PATH路径和脚本中的PATH路径不一致

输入vim /etc/crontab查看定时任务默认的配置文件内容
//在脚本中加入PATH路径[root@nfs_0.14[ /sharedata-101]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@nfs_0.14[ /sharedata-101]# cat /scripts/rsync-push_0.12.sh #!/usr/bin/bash#定义变量(首字母大小写,区分系统命令export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin   //加入系统路径Path=/sharedata-101Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#1.创建备份的目录#mkdir -p $Path/$Dest#2.压缩不同业务数据的存储文件汇总到指定文件夹内-为后续md5校验做文件准备cd /tar czf $Path/${Dest}.tar.gz  dingdan_data01/  os_data01/  suyuan_data01/#3.为客户端业务数据汇总的压缩包创建md5值md5sum $Path/*.tar.gz > $Path/MD5_${Addr}_${Date}#4.推送汇总的备份数据到rsync服务端rsync -vaz $Path/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.client#4.保留7天的备份数据find $Path/ -maxdepth 1 -type d -mtime +7 | xargs rm -f

最后服务端和客户端分别加入定时任务

//Rsync 两个客户端:[root@web01_0.21[ /sharedata-101]# crontab -l*/1 * * * * sh /scripts/rsync-push_0.12.sh &>/dev/null//Rsync服务端:[root@rsync-server_0.12[ /sharedata-101]# crontab -l*/5 * * * * ntpdate 10.0.0.11 &>/dev/null*/1 * * * * sh /scripts/rsync_server_huizong_jiaoyan.sh &>/dev/null
观察客户端推送给服务端的内容格式正常,查看输出校验结果的文件也对

最终的服务端和客户端脚本文件总结

  • rsync服务端脚本文件
[root@rsync-server_0.12[ /sharedata-101] cat /scripts/rsync_server_huizong_jiaoyan.sh #/usr/bin/bash#1.定义变量Path=/sharedata-101Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#2.copy--->md5md5sum -c $(find /${Path}/ -type f -name "MD5_*") >> ${Path}/md5_client_queren#3.保留180天的备份数据find $Path/ -maxdepth 1 -type d -mtime +180 | xargs rm -f
  • rsync客户端脚本文件
//rsync客户端脚本文件[root@web01_0.21[ /sharedata-101] cat /scripts/rsync-push_0.12.sh #!/usr/bin/bash#定义变量(首字母大小写,区分系统命令export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/binPath=/sharedata-101Host=$(hostname)Addr=$(ifconfig eth1 |awk 'NR==2 {print $2}')Date=$(date +%F)#合并一个变量,大括号包裹的是变量,小括号包裹的是命令Dest=${Host}_${Addr}_${Date}#1.创建备份的目录#mkdir -p $Path/$Dest#2.压缩不同业务数据的存储文件汇总到指定文件夹内-为后续md5校验做文件准备cd /tar czf $Path/${Dest}.tar.gz  dingdan_data01/  os_data01/  suyuan_data01/#3.为客户端业务数据汇总的压缩包创建md5值md5sum $Path/*.tar.gz > $Path/MD5_${Addr}_${Date}#4.推送汇总的备份数据到rsync服务端rsync -vaz $Path/ rsync_backup@10.0.0.12::sharedata101 --password-file=/etc/rsync.client#4.保留7天的备份数据find $Path/ -maxdepth 1 -type d -mtime +7 | xargs rm -f

最新文章

随机文章