目的:使用 rsync协议对公司全网服务同步或者备份数据;
实际的生产备份项目中,rsync服务端和客户端所在的业务数据汇总数据路径需要保持一致,方便脚本的书写和MD5校验

1.客户端按照规划创建业务数据目录
//按照规划取出以下的客户端备份路径信息(客户端的时间、主机名,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-282.虚拟出客户端业务数据目录
[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.txtcp -rp /dingdan_data01 /suyuan_data01 /os_data01 /share_data01/(ifconfig eth1 |awk 'NR==2 {print (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]# [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 = /sharedata101uid = rsyncgid = rsyncauth users = rsync_backup
[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[ /]# [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天的备份数据
//在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
//如果不携带深度的参数的查找效果,文件路径较深,实际生产环境中查看比较繁琐;[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[ /]# 最终优化的客户端脚本内容
[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.shmd5sum命令使用说明


#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 /

//新的客户端需要设置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地址丢失的原因:因为在执行定时任务过程中,系统会开启一个子shell,子shell在执行会出现路径不一致,如图所示:/PATH路径和脚本中的PATH路径不一致

//在脚本中加入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
[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客户端脚本文件[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